c++ - x86 和 x86_64 中 float 和 double 的性能差异

标签 c++ gcc

前阵子听说一些编译器在x86_64架构下使用SSE2扩展进行浮点运算,所以我用这段简单的代码来确定它们之间的性能差异。

我通过 BIOS 禁用了 Intel SpeedStep 技术,系统负载在我的测试中大致相等。我在 OpenSuSE 64 位上使用 GCC 4.8。

我正在编写一个包含大量 FPU 操作的程序,我想知道这个测试是否有效?

欢迎提供有关每种架构下 floatdouble 之间性能差异的任何信息。

代码:

#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 位 double

157.781 毫秒。 151.994 毫秒。 152.244 毫秒。

32 位 float

149.896 毫秒。 148.489 毫秒。 161.086 毫秒。

64 位 double

110.125 毫秒。 111.612 毫秒。 113.818 毫秒。

64 位 float

110.393 毫秒。 106.778 毫秒。 107.833 毫秒。

最佳答案

你真的没有测量太多;也许只是编译器的程度 优化。为了使测量有效,你真的 必须对结果做些什么,否则编译器可以优化掉 全部或测试的主要部分。我要做的是 1) 初始化 vector ,2) 获取开始时间(可能使用 clock,因为那 只考虑 CPU 时间),3)执行第二个循环 a 100(或 更多......足以持续几秒钟,至少)次,4)得到 结束时间,最后,5)输出 vector 中元素的和。

关于您可能会发现的差异:独立于 浮点处理器,64位机器有更多的通用寄存器 供编译器使用。这可能会产生巨大的影响。 除非您查看生成的汇编程序,否则您无法知道。

关于c++ - x86 和 x86_64 中 float 和 double 的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28350968/

相关文章:

c - gcc 是否在编译时重新排序局部变量?

java - 无法使用autocmd设置的gcc在MacVim中编译java

c++ - 为什么不在 c++ 中默认包含守卫?

c++ - 临时 C++ 对象是左值吗?

c++ - 设置 QList 子对象

c++ - 如何使用 Visual Studio 2005 获取两个不同 C++ 程序之间的返回值

c++ - 额外的反斜杠字符不会影响我的程序。为什么?

ubuntu - 为什么这个内置类型在编译时会出错?

c - 为什么 sizeof 类型与整数比较返回 false

c++ - 使用模板将语义从一种类型转移到另一种类型