# 加法运算和乘法运算的耗时问题

zhuliting 2011-01-10 08:53:37

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
...全文
1633 18 打赏 收藏 转发到动态 举报

18 条回复

jofranks 2012-08-14
• 打赏
• 举报

CPU 的运算器不就是加啊== 当然加法快
zhuliting 2011-02-16
• 打赏
• 举报

zhuliting 2011-01-20
• 打赏
• 举报

[Quote=引用 14 楼 chzhn 的回复:]

C/C++ code

//测试时间1300ms
{
__asm
{
push ebp
mov ebp,esp
push esi
push ecx
mov ecx,0x5000000……
[/Quote]

arong1234 2011-01-17
• 打赏
• 举报

chzhn 2011-01-17
• 打赏
• 举报

``````
//测试时间1300ms
{
__asm
{
push ebp
mov ebp,esp
push esi
push ecx
mov ecx,0x50000000
xor eax,eax
mov esi,5
Label1:
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
}
}``````
zhuliting 2011-01-17
• 打赏
• 举报

jsjygm 2011-01-13
• 打赏
• 举报

xwfde 2011-01-12
• 打赏
• 举报

tzg_dzq 2011-01-12
• 打赏
• 举报

• 打赏
• 举报

• 打赏
• 举报

1. 3个寄存器分别存放乘数0101，被乘数0100和一个部分积（用来暂存部分结果的寄存器），部分积初值为0.

2. 首先判断乘数寄存器（目前值是0101，既为5）的最低位为1.如果为1则将部分积的值通过加法器加上被乘数0100。因此此次步骤结束后，部分积寄存器的内容是0100.

3. 将乘数寄存器右移一位，同时将部分积寄存器也右移一位。同时乘数寄存器最低位溢出丢弃。而部分积寄存器最高位补0（采用算术右移，这里由于是原码，补0即可），部分积寄存器最低位溢出后填充到乘数寄存器。因此，部分积寄存器原来值0100既变成了0010，而最低位的0溢出。乘数寄存器0101，变成了 0|010，最低位0溢出，最高位被部分积溢出的0填充。（注 | 前面是被填充的0，后面是溢出后的乘数，后面都采用这种规则）

4.判断乘数寄存器。最低位为0，不做加法操作。直接执行第3步的移位操作。既有了部分积变成了0001，而乘数变成了00|01.

5.判断乘数寄存器的最低位为1，既采取2，3这2步，部分积0001加上被乘数0100变成了0101，移位后部分积变成了0010，而乘数变成了100|0.

6，判断乘数最低位为0，采取同3相同的步骤。既部分积0010变成了0001，而乘数变成了0100.至此所有乘数全部处理完毕。

1.初始化乘数寄存器，被乘数寄存器和部分积寄存器（0）

2.判断乘数寄存器最低位为1.进入2.1步骤，否则进入步骤3

2.1将部分积+被乘数，结果放到部分积

3.部分积和乘数右移一位。部分积最高位采用算术右移规则。低位溢出到乘数最高位，乘数最低位溢出丢弃。

4.判断乘数乘数是否所有位数都处理，处理完毕则结束，返回结果为部分积+乘数（部分积做高位，乘数做低位，不是简单的算术+）。否则返回到步骤2，循环。

jsjygm 2011-01-11
• 打赏
• 举报

[Quote=引用 5 楼 guandq2106 的回复:]

[/Quote]
cpu有乘法器？不是都转化成加法做的吗。

• 打赏
• 举报

• 打赏
• 举报

[Quote=引用 2 楼 wuyu637 的回复:]

[/Quote]

evencoming 2011-01-11
• 打赏
• 举报

10e次计算。或者更多次计算
zhuliting 2011-01-11
• 打赏
• 举报

wuyu637 2011-01-10
• 打赏
• 举报

wuyu637 2011-01-10
• 打赏
• 举报

s=a cost: 0ms
a+b cost: 0ms
a*b cost: 0ms

3,881

• 近7日
• 近30日
• 至今