最危险的性能瓶颈误解

Dav*_*och 9 language-agnostic optimization performance

编写Bespin(基于云的基于画布的代码编辑器[以及更多])的人最近谈到了他们如何重新考虑和优化Bespin代码的一部分,因为他们误以为JavaScript很慢.事实证明,当所有的说法和完成时,他们的优化没有产生显着的改进.

我相信我们很多人都会根据类似于Bespin团队的误解编写"优化"代码.

开发人员通常订阅的常见性能瓶颈误区是什么?

Mik*_*vey 18

没有特别的顺序:

"准备好,消防,目标" - 认为你知道什么需要优化而不证明它(即猜测)然后采取行动,因为它没有多大帮助,因此假设代码必须是最佳的开始.

"捡了芝麻,丢了西瓜" -以为优化是所有关于编译器优化,大惊小怪++i对比i++而时间山脉正在夸大设计不必要的花费特别是数据结构和数据库.

"Swat苍蝇与火箭筒" - 被教室里听到的最高兴的想法所迷惑,他们只是用于所有事情,无论规模如何.

"关于绩效的模糊思考" - 抛出诸如"热点"和"瓶颈"以及"探查者"和"衡量"之类的术语,好像这些事物被充分理解和/或相关.(我敢打赌,我为此遭受了破坏!)好的,一次一个:

  • 热点 - 定义是什么?我有一个:它是一个物理地址区域,PC寄存器在很长一段时间内被发现.这是PC采样器善于发现的东西.许多性能问题都表现出热点,但只有在最简单的程序中才会出现与热点相同的问题.

  • 瓶颈 - 用于性能问题的全能术语,它意味着有限的渠道限制了工作的完成速度.没有说明的假设是工作是必要的.在我几十年的性能调整中,我实际上发现了一些类似的问题 - 很少.几乎所有人都有着非常不同的性质.不是采用从A点到B点的最短路线,而是以函数调用的形式采取了一些小道路,这些调用只占用很少的代码,但时间不多.然后那些弯路进一步嵌套绕道,有时30层深.弯路越是嵌套,它们中的一些就越不可能 - 实际上是浪费 - 并且它几乎总是源于疾驰的普遍性 - 毫无疑问过度放纵"抽象".

  • 探究者 - 一个普遍的好事,对吗?你要做的就是获取一个分析器并进行一些分析,对吧?曾经想过,当你的目标是找出你需要修复的东西以获得更好的性能时,欺骗分析器告诉你很多东西是多么容易?在你的呼叫树的某个地方,收集一个小文件I/O,或者稍微调用一些系统例程,或让你的邪恶双胞胎在你不知情的情况下完成它.在某些时候,这将是你的问题,大多数剖析器将完全错过它,因为他们考虑的唯一低效率是算法效率低下.或者,并非所有例程都会很少,并且他们可能不会在少数几个地方调用另一个例程,因此您的调用图表示两个例程之间存在链接,但是哪个调用?或者假设你可以发现在路径中花费了大部分时间A调用B调用C.你可以看一下并认为你可以做的事情不多,如果你还可以查看传递的数据在这些电话中,你可以看到它是否必要.这是一个有趣的项目 - 选择你最喜欢的探查器,然后看看有多少种方法可以欺骗它.也就是说,找到使程序花费更长时间而不让分析器能够告诉你所做的事情的方法,因为如果你能够有意识地做到这一点,你也可以不用打算这样做.

  • 测量 - (即测量时间)是剖析器几十年来所做的事情,他们为测量的准确性和精确度感到自豪.但是衡量什么时间?为什么准确?请记住,目标是精确定位性能问题,以便您可以有效地优化它们以获得加速.当你获得加速时,它就是它的本质,无论你事先估计它有多精确.如果以牺牲位置精度为代价购买测量精度,那么当你需要的是橘子时,你就买了苹果.

这是关于表现的神话清单.

  • 嗯,剖析器对我来说非常有用,而且由于它们既可测量又可感知,我已经做了改进......我真的不明白你的意思. (2认同)
  • @alex:是的,他们发现*有些问题.你知道你没有更多的加速机会吗?没有证据不是缺席的证据.这是我的意思的一个例子,在几次迭代中,证明了超过40次的加速:http://stackoverflow.com/questions/926266/performance-optimization-strategies-of-last-resort/927773#927773 (2认同)

Mic*_*gan 14

当没有有效的配置文件进行优化时会发生这种情况.所有你没有个人资料的人都在猜测并且可能浪费时间和金钱.我可以列出一堆其他误解,但很多人都认为,如果有问题的代码不是顶级资源消费者,它可能就好了.有点像展开正在进行磁盘I/O的for循环......

  • 绝对是最大的误解 - 你认为你知道为什么它很慢.个人资料,个人资料! (4认同)
  • 这里的关键字是_valid_.确保用于识别瓶颈的性能测试类似于生产负载. (4认同)

ale*_*lex 6

  • 关系数据库很慢.
  • 我比优化器更聪明.
  • 这应该优化.
  • Java很慢

并且,无关:

有些人在面对问题时会想"我知道,我会使用正则表达式".现在他们有两个问题.

-jwz


Dan*_*boo 6

如果我将整个代码库转换为[在此处插入xxx最新技术],它会更快.


sla*_*ker 5

  • 优化代码的错误部分(人们,请使用您的探查器!)。
  • 我的编译器中的优化器很聪明,因此我不必提供帮助。
  • Java快速(LOL)
  • 关系数据库速度很快(ROTFL LOL LMAO)


Dav*_*man 5

"这必须尽可能快."

如果您没有性能问题,则无需担心优化性能(除了注意使用好的算法).

这种误解也体现在为程序的每个方面优化性能的尝试中.我经常看到这种情况,人们试图从低容量Web应用程序的执行时间开始削减每一毫秒,同时未能考虑到网络延迟将比代码的执行时间长几个数量级,从而减少了执行时间无论如何都无关紧要.