|
|
1
7
您应该将对dFreq的转换立即放在if()中 之前 使用iFreq进行计算。如果指令在代码中的位置更高,则转换可以与整数计算并行执行。一个好的编译器可能会把它推得更高,而一个不太好的编译器可能会把它留在原来的地方。由于在整数计算之后将其移动到,因此它可能无法与整数代码并行运行,从而导致速度减慢。如果它确实并行运行,那么根据CPU的不同,可能几乎没有任何改进(发出一条结果从未使用过的FP指令在原始版本中几乎没有效果)。 如果您真的想提高性能,许多人已经完成了基准测试,并按照以下顺序对编译器进行了排名: 1) 英特尔编译器 2) GCC-第二名 如果他们有-O3,你也可以试试。 |
|
|
2
6
|
|
|
3
4
允许双精度转换发生 并行 使用其他代码 因为没有立即使用dFreq。它给了编译器一些东西 “免费”。
C++编译器在重新排序指令方面很好地利用了这一点,看起来你的改变打败了一些不错的优化。 另一种可能性(可能性较小)是,当到浮点的转换在分支之前时,编译器能够完全删除分支。在现代处理器中,无分支代码通常是一个主要的性能胜利。
|
|
|
4
3
尝试将dFreq的定义移到for循环的外部,但将赋值保持在for循环/if块的内部。 可能是在if内部的堆栈every for循环上创建dFreq引起了问题(尽管编译器应该注意这一点)。如果dFreq变量位于四个循环中,则可能是编译器中的一个回归,它只创建了一次,而在if中,它每次都创建。
|
|
|
5
2
也许编译器正在优化它,将定义置于for循环之外。如果编译器优化没有做到这一点,那么当您将其放入时。 |
|
|
6
1
这一变化可能导致编译器禁用某些优化。如果将声明移到循环上方会发生什么? |
|
|
7
1
这篇文章(有点老,但很有道理)说了一些类似的话: http://www.tantalon.com/pete/cppopt/asyougo.htm#PostponeVariableDeclaration |
|
|
8
1
很容易找到答案。只要20分钟 stackshots 慢版本和快版本。在慢速版本中,你将在大约2张照片上看到它正在做什么,而在快速版本中它没有做什么。您将看到它在汇编语言中停止的位置有细微的差别。 |
|
|
giantjenga · 优化整数向量到二进制向量的转换 1 年前 |
|
|
Daniel Lobo · 使用约束进行优化 1 年前 |
|
Sergio · python中大量数字的乘法 2 年前 |
|
|
Sergey Dev · 临时表与表变量 2 年前 |
|
|
John · 减少C中的内存消耗++ 2 年前 |