前一段时间我听说有些编译器使用SSE2扩展来实现x86_64架构的浮点运算,所以我使用这个简单的代码来确定它们之间的性能差异。x86和x86_64中的float和double之间的性能差异
我通过BIOS禁用了Intel SpeedStep技术,系统负载大致相当于我的测试。我在OpenSuSE 64位上使用GCC 4.8。
我正在写一个程序有很多FPU操作,我想知道这个测试是否有效?
并了解每个架构下关于float
和double
之间性能差异的任何信息。
代码:
#include <iostream>
#include <sys/time.h>
#include <vector>
#include <cstdlib>
using namespace std;
int main()
{
timeval t1, t2;
double elapsedTime;
double TotalTime = 0;
for(int j=0 ; j < 100 ; j++)
{
// start timer
gettimeofday(&t1, NULL);
vector<float> RealVec;
float temp;
for (int i = 0; i < 1000000; i++)
{
temp = static_cast <float> (rand())/(static_cast <float> (RAND_MAX));
RealVec.push_back(temp);
}
for (int i = 0; i < 1000000; i++)
{
RealVec[i] = (RealVec[i]*2-435.345345)/15.75;
}
// stop timer
gettimeofday(&t2, NULL);
elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0; // sec to ms
elapsedTime += (t2.tv_usec - t1.tv_usec)/1000.0; // us to ms
TotalTime = TotalTime + elapsedTime;
}
cout << TotalTime/100 << " ms.\n";
return 0;
}
和结果:
32位双
157.781毫秒。 151.994 ms。 152.244 ms。
32 Bit Float
149.896 ms。 148.489 ms。 161.086 ms。
64位双倍
110.125毫秒。 111.612 ms。 113.818毫秒。
64位浮点数
110.393 ms。 106.778 ms。 107.833 ms。
LOL @“flouting point orations”.... – twalberg 2015-02-05 18:32:56