首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

加法运算和乘法运算的耗时有关问题

2012-09-02 
加法运算和乘法运算的耗时问题乘法运算比加法运算复杂,理论上应该更耗时,但我的测试程序却显示,加法比乘法

加法运算和乘法运算的耗时问题
乘法运算比加法运算复杂,理论上应该更耗时,但我的测试程序却显示,加法比乘法更耗时,请各位帮忙看一下问题出在哪里?谢谢!

windows下代码:
#include <iostream>
#include <time.h>
using namespace std;
const int ITER = 60000;
int main() {
  double a, b, s;
  clock_t start, end;
  a = 1000.011 / 3;
  b = 2.011 / 3;
  //cout << "a = " << a << ", b = " << b << endl;

start = clock();
  for (int i = 0; i < ITER; i++)
  for(int j = 0; j < ITER; j++)
  {
  s = a;
  }
  end = clock();
  cout << "s=a cost: " << end - start << "ms" << endl;
   
start = clock();
  for (int i = 0; i < ITER; i++)
  for(int j = 0; j < ITER; j++)
  {
  s = a + b;
  }
  end = clock();
  cout << "a+b cost: " << end - start << "ms" << endl;
 
start = clock();
  for (int i = 0; i < ITER; i++)
  for(int j = 0; j < ITER; j++)
  {
  s = a * b;
  }
  end = clock();
  cout << "a*b cost: " << end - start << "ms" << endl;
//cout << "CLOCKS_PER_SEC: " << CLOCKS_PER_SEC << endl;
  return 0;
}

结果:
s=a cost: 5693ms
a+b cost: 8760ms
a*b cost: 6590ms


Linux下代码:
#include <iostream>
#include <sys/time.h>
using namespace std;
const int ITER = 60000;
int main() {
  double a, b, s;
  timeval start, end;
  double span;
  a = 1000.011 / 3;
  b = 2.011 / 3;
  //cout << "a = " << a << ", b = " << b << endl;
  /*gettimeofday(&start, 0);
  for (int i = 0; i < ITER; i++)
  for (int j = 0; j < ITER; j++);
  gettimeofday(&end, 0);
  span = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec -start.tv_usec) / 1000;
  cout << "loop cost: " << span << "ms" << endl;*/

  gettimeofday(&start, 0);
  for (int i = 0; i < ITER; i++) 
  for(int j = 0; j < ITER; j++)
  {
  s = a;
  }
  gettimeofday(&end, 0);
  span = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec -start.tv_usec) / 1000;
  cout << "s=a cost: " << span << "ms" << endl;

  gettimeofday(&start, 0);
  for (int i = 0; i < ITER; i++)
  for(int j = 0; j < ITER; j++) 
  {
  s = a + b;
  }
  gettimeofday(&end, 0);
  span = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec -start.tv_usec) / 1000;
  cout << "a+b cost: " << span << "ms" << endl;

  gettimeofday(&start, 0);
  for (int i = 0; i < ITER; i++) 
  for(int j = 0; j < ITER; j++)
  { 
  s = a * b;
  }
  gettimeofday(&end, 0);
  span = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec -start.tv_usec) / 1000;


  cout << "a*b cost: " << span << "ms" << endl;
  return 0;
}
结果:
s=a cost: 5453ms
a+b cost: 9461ms
a*b cost: 6772ms


[解决办法]
http://topic.csdn.net/u/20071106/21/90066a9e-34d3-432e-9264-ac01484aad2c.html

一般来说,乘法比加法耗时,这个已经是定论了。由于cpu的硬件设计决定的。
[解决办法]
什么也不说,给个代码自己测试

C/C++ code
//测试时间1300ms__declspec(naked) int __stdcall  AddTest(){    __asm    {        push ebp        mov ebp,esp        push esi        push ecx        mov ecx,0x50000000        xor eax,eax        mov esi,5Label1:        add eax,esi        dec ecx        test ecx,ecx        jnz Label1        pop ecx        pop esi        mov esp,ebp        pop ebp        retn    }}//测试时间0ms__declspec(naked) int __stdcall MulTest(){    __asm    {        push ebp        mov ebp,esp        mov eax,5        imul eax,eax,50000000h        mov esp,ebp        pop ebp        retn    }} 

热点排行