c++ - 将 int 值添加到 double 时是否有性能优势/惩罚?

标签 c++

给定 vector 加法:

  NPNumber NPNumber::plus(const double o) const {
    vector<double> c;
    for (double a : values)
       c.push_back(a + o);

    return NPNumber(width, c);
  }

如果 NPNumber 包含一个 double vector (字段值),当我只添加一个整数而不是另一个 NPNumber 时,与转换该整数并使用上面的函数相比,是否有性能优势或损失?

也就是说,这在任何架构上是更快还是更慢:

  NPNumber NPNumber::plus(const int i) const {
    vector<double> c;
    for (double a : values)
       c.push_back(a + i);

    return NPNumber(width, c);
  }

最佳答案

它强烈依赖于编译器,你应该在你的代码中测量它。在我的机器(32 位 MinGW/gcc 4.9)中进行的快速简单观察表明,+ 本身对于这两种情况都是相等的,但是积分运算似乎要好一些。

添加两个double:

!        double d = 0.2;
fldl   0x409070
fstpl  -0x10(%ebp)

!        double y = 1.0;
fld1   
fstpl  -0x18(%ebp)

!        double z = d + y;
fldl   -0x10(%ebp)
faddl  -0x18(%ebp)
fstpl  -0x20(%ebp)

添加两个int:

!        double d = 0.2;
fldl   0x409070
fstpl  -0x28(%ebp)

!        int y = 1;
movl   $0x1,-0x2c(%ebp)

!        double z = d + y;
fildl  -0x2c(%ebp)
faddl  -0x28(%ebp)
fstpl  -0x38(%ebp)

两者都使用faddl 进行相加,但编译器使用更好的指令在相加之前加载整数。因此,将一个整数加到一个 double 上没有任何惩罚(而且它可能比将两个 double 加起来更好)。

在您的应用程序中,分析是找出哪个更好的最佳方法。

关于c++ - 将 int 值添加到 double 时是否有性能优势/惩罚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20190727/

相关文章:

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

C++ 使用函数模板查找任何输入数据类型的中间值?

c++ - text_multifile_backend 如何设置 rool 文件大小

c++ - CGAL 在 3D 中按 x 轴旋转

c++ - 在静态函数中调用成员函数指针

java - 变换矩阵集属性

c++ - union的用法和乱码

c++ - 现代系统的最佳结构大小

c++ - 我怎样才能覆盖纯虚方法,但仍然强制子类实现相同的方法?

c++ - APPNAME 不包含在 QStandardPaths::AppDataLocation 中