首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >原语类型比C++中的用户类型慢吗?

原语类型比C++中的用户类型慢吗?
EN

Stack Overflow用户
提问于 2012-06-06 20:36:49
回答 2查看 368关注 0票数 3

我很好奇,做了一个小的基准测试来确定原始类型(如intfloat )和用户类型之间的性能增量。

我创建了一个模板类Var,创建了一些内联算术运算符。测试包括对原始向量和Var向量循环此循环:

代码语言:javascript
运行
复制
for (unsigned i = 0; i < 1000; ++i) {
    in1[i] = i;
    in2[i] = -i;
    out[i] = (i % 2) ? in1[i] + in2[i] : in2[i] - in1[i];
}

我对结果感到非常惊讶,原来我的Var类在大多数情况下都更快,int的平均循环时间比这个类少了约5700nsec。在3000次运行中,int比Var快11倍,后者快2989倍。与float类似的结果,其中Var比浮动2991的运行速度快15100毫微秒。

原始类型不应该更快吗?

编辑:编译器是一个相当古老的mingw 4.4.0版本,构建选项是QtCreator的默认选项,没有优化:

代码语言:javascript
运行
复制
qmake call: qmake.exe C:\...\untitled15.pro -r -spec win32-g++ "CONFIG+=release"

好的,发布完整源代码,平台是64位Win7,4 GB DDR2-800,Core2Duo@3 3Ghz

代码语言:javascript
运行
复制
#include <QTextStream>
#include <QVector>
#include <QElapsedTimer>

template<typename T>
class Var{
public:
    Var() {}
    Var(T val) : var(val) {}

    inline T operator+(Var& other)
    {
        return var + other.value();
    }

    inline T operator-(Var& other)
    {
        return var - other.value();
    }

    inline T operator+(T& other)
    {
        return var + other;
    }

    inline T operator-(T& other)
    {
        return var - other;
    }

    inline void operator=(T& other)
    {
        var = other;
    }

    inline T& value()
    {
        return var;
    }

private:
    T var;
};

int main()
{
    QTextStream cout(stdout);
    QElapsedTimer timer;

    unsigned count = 1000000;

    QVector<double> pin1(count), pin2(count), pout(count);
    QVector<Var<double> > vin1(count), vin2(count), vout(count);

    unsigned t1, t2, pAcc = 0, vAcc = 0, repeat = 10, pcount = 0, vcount = 0, ecount = 0;
    for (int cc = 0; cc < 5; ++cc)
    {
        for (unsigned c = 0; c < repeat; ++c)
        {
            timer.restart();
            for (unsigned i = 0; i < count; ++i)
            {
                pin1[i] = i;
                pin2[i] = -i;
                pout[i] = (i % 2) ? pin1[i] + pin2[i] : pin2[i] - pin1[i];
            }
            t1 = timer.nsecsElapsed();
            cout << t1 << endl;

            timer.restart();
            for (unsigned i = 0; i < count; ++i)
            {
                vin1[i] = i;
                vin2[i] = -i;
                vout[i] = (i % 2) ? vin1[i] + vin2[i] : vin2[i] - vin1[i];
            }
            t2 = timer.nsecsElapsed();
            cout << t2 << endl;;
            pAcc += t1;
            vAcc += t2;
        }

        pAcc /= repeat;
        vAcc /= repeat;
        if (pAcc < vAcc) {
            cout << "primitive was faster" << endl;
            pcount++;
        }
        else if (pAcc > vAcc) {
            cout << "var was faster" << endl;
            vcount++;
        }
        else {
            cout << "amazingly, both are equally fast" << endl;
            ecount++;
        }

        cout << "Average for primitive type is " << pAcc << ", average for Var is " << vAcc << endl;

    }
    cout << "int was faster " << pcount << " times, var was faster " << vcount << " times, equal " << ecount << " times, " << pcount + vcount + ecount << " times ran total" << endl;
}

相对而言,对于浮点型,Var类比浮点型快6-7%,整型的速度约为3%。

我还运行了向量长度为10000000的测试,而不是最初的1000,结果仍然是一致的,并且对类有利。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-06 23:37:02

std::vector代替QVector,在-O2优化级,GCC为这两种类型生成的代码是完全一样的,指令换指令。

在没有替换的情况下,生成的代码是不同的,但这并不奇怪,因为对于基本类型和非基本类型,QtVector的实现是不同的(请在qvector.h中查找QTypeInfo<T>::isComplex )。

更新看起来isComplex不会影响linner oop,即测量的部分。这两种类型的循环代码仍然不同,尽管差别很小。看起来这是因为GCC的原因。

票数 2
EN

Stack Overflow用户

发布于 2014-06-13 00:11:41

我对QVector和float*的运行时间和内存分配进行了基准测试,两者之间的差异很小

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10914367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档