编写Bespin(基于云的基于画布的代码编辑器[及更多])的人最近谈到了他们如何重新考虑和优化Bespin代码的一部分,因为他们误以为JavaScript很慢。事实证明,当所有的事情都说完了,他们的优化没有产生明显的改善。
我相信我们很多人都会根据类似于Bespin团队的误解编写“优化”代码。
开发人员通常订阅的常见性能瓶颈误区是什么?
答案 0 :(得分:18)
没有特别的顺序:
“准备好,消防,瞄准” - 认为你知道什么需要优化而不证明它(即猜测)然后采取行动,因为它没有没什么帮助,所以假设代码必须是最佳的开始。
“Penny Wise,Pound Foolish” - 认为优化完全是关于编译器优化,关于++i
与i++
之间的争执时间过早被不必要地用于过度设计,特别是数据结构和数据库。
“Swat苍蝇与火箭筒” - 如此迷恋在教室里听到的最高级的想法,他们只是用于所有事情,无论规模如何。
“关于绩效的模糊思考” - 抛出诸如“热点”和“瓶颈”以及“探查者”和“衡量”之类的术语,好像这些事情已被充分理解和/或相关。 (我敢打赌,我为此遭受了破坏!)好的,一次一个:
热点 - 定义是什么?我有一个:它是一个物理地址区域,PC寄存器在很长一段时间内被发现。这是PC采样器善于发现的东西。许多性能问题都会出现热点,但只有在最简单的程序中才会出现与热点相同的问题。
瓶颈 - 用于性能问题的全能术语,它意味着有限的渠道限制了工作的完成速度。没有说明的假设是工作是必要的。在我几十年的性能调整中,我实际上发现了一些类似的问题 - 很少。几乎所有人都有着非常不同的性质。不是采用从A点到B点的最短路线,而是以函数调用的形式采取了一些小道路,这些调用只占用很少的代码,但时间不多。然后那些弯路进一步嵌套绕道,有时30层深。弯路越多,它们中的一些越不可能 - 实际上浪费 - 并且几乎总是来自驰骋的普遍性 - 毫无疑问过度放纵“抽象”
profiler - 一个普遍好的东西,对吧?你要做的就是获取一个分析器并进行一些分析,对吧?曾经想过,当你的目标是找出你需要修复什么以获得更好的性能时,欺骗分析器告诉你很多事情是多么容易?在你的呼叫树的某个地方,收集一个小文件I / O,或者稍微调用一些系统例程,或让你的邪恶双胞胎在你不知情的情况下完成它。在某些时候,这将是你的问题,并且大多数剖析器将完全错过它,因为他们考虑的唯一低效率是算法效率低下。或者,并非所有例程都会很少,并且他们可能不会在少数几个地方调用另一个例程,因此您的调用图表示两个例程之间存在链接,但调用?或者假设你可以发现在路径中花费了大部分时间A调用B调用C.你可以看一下并认为你可以做的事情并不多,如果你还可以查看传递的数据在这些电话中,你可以看到它是否必要。这是一个有趣的项目 - 选择你最喜欢的探查器,然后看看有多少种方法可以欺骗它。也就是说,找到方法让程序花费更长的时间而不让分析器能够告诉你你做了什么,因为如果你可以故意这样做,你也可以不用打算这样做。
衡量 - (即衡量时间)这是分析师几十年来所做的事情,他们为自己衡量的准确性和精确度感到自豪。但是衡量什么时间?为什么准确?请记住,目标是精确定位性能问题,以便您可以有效地优化它们以获得加速。当你获得加速时,它就是它的本质,无论你事先估计它有多精确。如果以牺牲位置精度为代价购买测量精度,那么当你需要的是橘子时,你就买了苹果。
答案 1 :(得分:14)
当没有有效的配置文件进行优化时会发生这种情况。所有你没有个人资料的人都在猜测并且可能浪费时间和金钱。我可以列出一堆其他误解,但很多人都认为,如果有问题的代码不是顶级资源消费者,它可能就好了。有点像展开正在进行磁盘I / O的for循环......
答案 2 :(得分:6)
并且,无关:
有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。
-jwz
答案 3 :(得分:6)
如果我将整个代码库转换为[在此处插入xxx最新技术],它会更快。
答案 4 :(得分:5)
答案 5 :(得分:5)
“这必须尽可能快。”
如果您没有性能问题,则无需担心优化性能(除了注意使用优秀的算法)。
这种误解也表现在尝试优化程序的每个方面的性能。我经常看到这种情况,人们试图从低容量Web应用程序的执行时间开始削减每一毫秒,同时未能考虑到网络延迟将比代码的执行时间长几个数量级,从而减少了执行时间无论如何都无关紧要。
答案 6 :(得分:3)
我的优化规则。
我最好的优化是将报告从3天缩短到9分钟。优化的代码加速了三天到三分钟。
在我的carreer中,我遇到了三个人,他们的任务是在VAX上生成比本机排序更快的排序。他们总是能够生产出只需要三倍的种类。
答案 7 :(得分:2)
规则很简单: