|
|
1
15
许多过早优化的坏名声来自不同的时代。 然后:
现在:
需要注意的一点是,当从桌面转移到嵌入式系统时,一般的技术倒退了十年。 所以这里有一个列表,我要么把它留给我的编译器,要么不再麻烦了。
过早的优化也不错。否则,我们都必须使用冒泡排序,直到证明该排序是一个瓶颈:—) Knuth在他最初的引用中,把重点放在小事情上,而不是在更高层次上处理性能——设计、数据访问模式和算法。 早期优化(或“怀疑优化”,如你所说,我喜欢这个术语)只有在没有被证明是有效的情况下才是邪恶的。 和 降低了代码的另一个方面(如可读性、简单性或灵活性)。 另外,库代码也有一定的回旋余地。毕竟,您不知道每个最终用户操作调用新的unbuddleString函数的频率。 |
|
|
2
2
我最喜欢的方法调用不是在for循环的条件下放置方法调用。 示例(在某些带有循环的语言中):
我记得读过一篇关于2006年的竞争对手的文章,文章的目标是写出在不同平台上以极为不同的速度运行的完美代码。胜利者基本上写了一个for循环,条件是使用strlen调用,导致使用cygwin的gcc(或类似的方法)的Windows速度下降100倍。基本上,如果每次都要进行评估,而且值不会改变…不要相信编译器会将它拉出;自己移动它。 |
|
|
3
1
我见过两个:
|
|
|
4
1
通过编译器提示或复制和粘贴代码过早地内联函数/方法。 |
|
|
5
1
这很棘手,因为有些明显的优化是在没有程序员干预的情况下进行的,尽管情况一直在好转。 C++中用户定义类的X++可能会较慢。对于原始人来说,不是很多。 C++编译器 routinely fail 根据类型折叠多个常量加法、除法等。 多维阵列扫描顺序 将 如果整个数组太大而无法容纳在一级缓存中,则很重要。 |
|
|
6
0
|
|
|
7
0
一个非常常见的:
一个很常见的问题(但希望不会再出现,因为它引发了许多其他问题,并且在OO编程中变得毫无意义):
两个我认为与目标完全相反的任务(使编译器任务更困难,实现的优化更少):
有时我使用的一些(正如我在过去的编译器中所证明的那样,它们管理得不好,有时性能会带来巨大的好处…还是这样吗?)
一些古老的经典:
|
|
|
8
0
X++对X++不是一个优化问题,而是一个明确的意图问题。你真的想用x的旧值吗?(提示:通常不会)如果你这样做了,继续使用x++,但是另外,向两年后查看它的维护程序员指出,这只是一个增量,没有更多。 正如你不会在没有常量的情况下声明某些东西,如果它在语义上永远不应该改变,那么你应该使用前/后增量来显示你的意图。 |
|
|
9
0
在for循环中不声明变量。
在某些语言中,我发现这一点更好,因为它似乎可以减少一些问题:
|
|
|
10
0
人们有一种倾向,把注意力集中在一些小事情上,对它进行评判,同时忽略了全局。设计大型软件的许多方法都隐含着性能的基本原理,因此,在我看来,这构成了过早的优化。实例:
在我在性能调优方面所做的工作中,我经常发现自己不得不撕开一个老鼠窝,因为它的过量数据结构会导致大量的性能问题。而导致数据结构过剩的最常见原因是“性能”。 补充:还有其他可能导致绩效问题的错误预期问题,例如过度渴望全球化。在应用程序启动时不必要地从资源中提取字符串并不便宜。 |
|
|
11
0
我发现的一些常见的(在.NET世界中有些是特定的):
(粗体为“将”产生不利影响,斜体为“可能”)。
也就是说,第5点就是我看到自己在做的事情(或者说不做得很精确),我喜欢这样。
|