加法跟乘法一样快?
加法和乘法一样快???#include #include using namespace stdvoid main(){LONG inf
加法和乘法一样快???
#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
LONG in;
float a = 7;
float b = 8;
float c = 0;
again:
cin>>in ;
DWORD T = GetTickCount();
for(int i = 0 ;i <= 1000000000 ;i++)
{
c = a + b;
}
cout<< GetTickCount() - T <<endl;
T = GetTickCount();
for(int i = 0 ;i <= 1000000000 ;i++)
{
c = a * b;
}
cout<< GetTickCount() - T <<endl;
if( in == 1 )
{
goto again;
}
}
测试了3次结果都是差不多,加和乘的时间都差不多,为什么呢?
很多的文章都说加减可以直接无视,不计算在时间里面.
[解决办法]1. 你这个循环中有i的自加操作,还有比较操作。这两个会对结果产生影响的。
2. 现代CPU通常含有浮点运算加速器。通常所说的浮点运算FLOP,指一次浮点乘或者一次浮点加。可见这两者的差别已经在减小了。
[解决办法]书上是说的乘法是多周期指令,理论上比单周期指令的加法要长,但你用的是浮点数,计算时用的是浮点处理器,时间差距会缩小(现在已经有很多单周期乘法的处理器了),再考虑到每次判断i时浪费的指令流水,时间差距又会缩小,再考虑你调用的GetTickCount(),这个好像是根据时间片来算的,多少会跟实际的时间有出入,所以。。。
[解决办法]但是循环本身的代价比加法乘法要大多了,使得加法和乘法的区别可以忽略不计。
[解决办法]查了一下intel给的优化手册,在乱序执行引擎上port0进行单精度的浮点数乘法是4个时钟周期,双精度的是5个时钟周期.在port1上的浮点数加灞时钟周期是3.操作的吞吐量都是1.
另一方面需要参考一下<深入理解计算机系统>,先看看怎么测试出操作时钟周期,再作比较.主要是扩大并行度,使得CPU被充分利用,否则结果被其它地方的瓶颈所掩盖.