gpt4 book ai didi

c++ - 奇怪的 C++ 性能差异?

转载 作者:可可西里 更新时间:2023-11-01 18:43:33 24 4
gpt4 key购买 nike

我刚刚偶然发现了一项似乎具有违反直觉的性能影响的更改。任何人都可以为这种行为提供可能的解释吗?

原代码:

for (int i = 0; i < ct; ++i) {
// do some stuff...

int iFreq = getFreq(i);
double dFreq = iFreq;

if (iFreq != 0) {
// do some stuff with iFreq...
// do some calculations with dFreq...
}
}

在“性能测试”期间清理这段代码时,我决定将 dFreq 的定义移到 if block 中,因为它只在 如果。有几个计算涉及 dFreq,所以我没有完全消除它,因为它确实节省了从 intdouble 的多次运行时转换的成本>。我预计没有性能差异,或者如果有的话,可以忽略不计的改进。但是,性能下降了近 10%。我对此进行了多次测量,这确实是我所做的唯一更改。上面显示的代码片段在其他几个循环中执行。我在运行中获得了非常一致的计时,并且可以肯定地确认我所描述的更改将性能降低了约 10%。我预计性能会提高,因为 intdouble 的转换只会在 iFreq != 0 时发生。

更改代码:

for (int i = 0; i < ct; ++i) {
// do some stuff...

int iFreq = getFreq(i);

if (iFreq != 0) {
// do some stuff with iFreq...
double dFreq = iFreq;
// do some stuff with dFreq...
}
}

谁能解释一下?我正在使用带有/O2 的 VC++ 9.0。我只是想了解我在这里没有说明的内容。

最佳答案

在使用 iFreq 进行计算之前,您应该立即将转换为 dFreq 放在 if() 中。如果指令在代码中更靠上,则转换可以与整数计算并行执行。一个好的编译器可能能够将它推得更远,而一个不太好的编译器可能只是让它落在原地。由于您将它移动到整数计算之后,它可能无法与整数代码并行运行,从而导致速度减慢。如果它确实并行运行,则可能几乎没有任何改进,具体取决于 CPU(发出从未使用过结果的 FP 指令对原始版本几乎没有影响)。

如果真的想提升性能,已经有不少人做过benchmarks,按顺序排列如下编译器:

1) ICC - 英特尔编译器2) GCC - 不错的第二名3) MSVC - 生成的代码与其他代码相比可能非常差。

如果他们有,您可能还想尝试 -O3。

关于c++ - 奇怪的 C++ 性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2209603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com