长波克,只有一个限制时间。当你没有足够的资源来优化每一个代码的变化,并花时间分配寄存器,优化一些溢出和诸如此类的事情时,编译器每次都会赢。对代码进行修改、重新编译和度量。如有必要重复。
此外,你可以在高水平方面做很多事情。此外,检查生成的程序集可能会给人一种代码是垃圾的印象,但实际上它的运行速度比您想象的要快。例子:
Int y = data[i];
//在这里做一些事情。
call_function (y,…);
编译器将读取数据,将其推入堆栈(溢出),然后从堆栈读取并作为参数传递。听起来屎?它实际上可能是非常有效的延迟补偿,并导致更快的运行时。
//优化版本
call_function(数据[我],…);//毕竟不是那么优化。
优化版本的想法是,我们降低了寄存器压力,避免溢出。但事实上,“垃圾”版本更快!
看看汇编代码,只看指令,然后得出结论:指令越多,速度越慢,这将是一个错误的判断。
这里需要注意的是:许多组装专家认为他们知道很多,但知道的很少。规则也会随着架构的变化而变化。例如,x86代码并不存在总是最快的银弹。如今,最好还是按照经验法则行事:
记忆很慢
缓存速度快
尽量更好地使用缓存
你多久会错过一次?你有延迟补偿策略吗?
对于一个cache miss,你可以执行10-100个ALU/FPU/SSE指令
应用程序架构很重要。
. .但是当问题不在架构上时,它就没有帮助了
此外,过于相信编译器会神奇地将考虑不周到的C/ c++代码转换为“理论上最优”的代码是一厢情愿的想法。如果你关心这个低级别的“性能”,你必须知道你使用的编译器和工具链。
C/ c++中的编译器通常不太擅长重新排序子表达式,因为对于初学者来说,函数有副作用。函数式语言没有受到这个警告的影响,但它不太适合当前的生态系统。有一些编译器选项可以允许宽松的精确规则,允许编译器/链接器/代码生成器改变操作的顺序。
这个话题有点死路一条;对于大多数人来说,这是无关紧要的,而剩下的人,他们已经知道自己在做什么了。
这一切都归结为:“理解你在做什么”,这与知道你在做什么有点不同。