给定 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/