我正在做一个大型的性能关键型项目,这是一个非常繁重的分支。在为这个产品设计算法的过程中,我的雇主经常提醒我编写更具“人类逻辑性”的代码,或者以一种更符合我们逻辑思维方式的方式编写。
虽然这从几个不同的角度对我来说是有意义的(例如,易懂/记忆,代码维护等),但我也想知道这种方法是否也能带来更优化的编译输出。
由于编译器是由人类编写的,而优化器通常被设计为识别熟悉的代码块,因此会出现这种情况吗?
我很乐意听到一些关于为什么这是可能或不是这样的想法。
发布于 2011-07-07 21:55:33
考虑两种不同的代码,库代码和应用程序代码。库代码(如字符串类库)很可能在很多时候拥有程序计数器,如下所示:
while(some test){
massage some data, while seldom calling sub-functions
}
这类代码将从编译器优化中受益。(因此,为了回答您的问题,人们编写这样的基准函数,编译器编写者将其用作测试用例。)
另一方面,应用程序代码往往如下所示:
if (some test){
do a bunch of things, including many function calls
} else if (some other test){
do a bunch of things, including many function calls
} else {
do a bunch of things, including many function calls
}
在这种情况下,通过分支预测或周期调整节省的时间可能是1个时间单位,而do a bunch of things...
可能花费10^2到10^8个时间单位,无论有没有I/O。因此,编译器优化这段代码的好处往往会在噪声中完全消失。
这并不是说它不能优化。只是编译器无法做到这一点--这是你的工作。
如果您想让后一种代码运行得更快,最好的方法是找出哪些代码行在调用堆栈上的时间百分比很高,如果可能的话,找到一种方法来避免这样做。(Here's an example of a 43x speedup.)
发布于 2011-07-08 04:18:37
什么是“人类逻辑”可能因人而异。
例如,如果我是一个根据书面指令执行任务的新手,随着时间的推移,我会(通常)记住一些任务,而对于其他人,我会简单地回到指令中,因为这些任务执行得不够频繁/太无聊,或者两者兼而有之。在同样的情况下,其他人可能会也可能不会有相似的功能,也不确定他们学到的任务会不会是我学到的任务。
对于编程来说,它的工作原理与此类似。有些人可能会以一种方式构造一个循环,并在其中执行测试以提高可读性,而我可能出于性能原因在外部进行测试。什么是错的,什么是对的?
人们普遍认为编译器会优化任何东西。这是真的,但正如我在另一篇文章中写的那样,GIGO (垃圾输入=垃圾输出)适用。编译器不会在真空中运行:给定一组规则,它们将在其(编译器)构造器的想象力和代码优化能力的范围内对源代码执行安全优化。膨胀的源代码将成为优化的膨胀机器代码。以同样的方式,精益和平均源代码将成为优化的精益和平均机器代码。在关键的地方,可以给编译器提供它“感觉”到的源代码(是的!他们确实有个性)在优化方面绝对舒服,结果机器代码就会飞起来。
我们都经历过性能不佳的软件。如果我们幸运的话,我们已经体验到了性能令人难以置信的软件。一个开发人员可以学习编写一段运行良好的代码,而另一个开发人员可以在相同的时间内编写性能较差的代码。
https://stackoverflow.com/questions/6605211
复制相似问题