为什么经常听人说编译器比你聪明?
发布时间:
2024-08-15 01:44
阅读量:
24
讲个搞笑事情,有很多很老的,2010年以前的c代码,里面为了性能考虑充斥着很多让人看了不明所以的位操作和奇奇怪怪的语法。在现在的编译器面前很多都是负优化。
我工作的时候有一个软件就是这样的,然后有一天我不知道它里面有这么一个API,我按照一样的算法用c++重写了一遍,语句非常简单,看了保证你觉得和python差不多。
写完了以后也就一直在生产环境用了,直到有一天看别的代码的时候发现了这个API, 我吓了一跳赶紧改了代码用它原有的API了,怕万一自己的算法有问题,结果出问题就要被嘲笑了。
结果上线测试发现结果一致,调API比我自己写的功能慢了20%。
我尝试按着API的注释把里面几句莫名其妙的东西改成了人类能轻松看懂的逻辑。
现在API的速度和我自己写的一致了。
编译器和处理器这些年的进步真的非常大,我有理由相信API的作者当年是真正对性能做出了优化的,但是现在而言可能各方面都不合适了。比如说用加bool值来取代分支的优化方法在现在的处理器上高概率是负优化,处理器一般都能很好的预测对分支。当年针对32位做的位操作优化很多都不适用于现在的64位处理器,甚至反而会导致编译器不敢利用更宽的寄存器做出更好的优化。
鉴于回答里有质疑为啥加bool能优化性能的。我也不知道为什么,vtune告诉我说这地方front end bound特别严重,大头是分支预测失败,我对着代码看这地方就这么一个分支,改了就好了。猜测是处理器的分支预测对这个地方的程序逻辑miss率特别高,应该是一个特殊工况,换程序或者换处理器(换代)都不会有这种问题,但是在这套生产设备上这问题就是存在,没什么好猜疑的,你得去问英特尔一代酷睿的分支预测到底是个什么逻辑。
END