性能与可读性

时间:2008-08-27 18:09:43

标签: performance

阅读this question我发现这是(注意引号)“代码”来解决问题(顺便说一下,这是perl)。

100,{)..3%!'Fizz'*\5%!'Buzz'*+\or}%n*

显然,这是一个没有实际意义的知识范例(我希望永远不会在我生活中的真实代码中看到它),但是,当你必须做出选择时,你何时牺牲代码的可读性才能获得性能?你是否只是应用常识,你是否总是作为最后的手段?你有什么策略?

编辑:对不起,看到答案我可能已经严重地表达了这个问题(英语不是我的母语)。我并不仅仅意味着性能与可读性 之后您编写了代码,我也会在您编写代码之前询问。有时你可以通过制作一些较暗的设计或提供一些会使你的课程更暗的属性来预见未来的性能提升。您可能决定使用多个线程或仅使用一个线程,因为您期望这些线程可以提供的可伸缩性,即使这会使代码更难以理解。

14 个答案:

答案 0 :(得分:24)

我认为表现可能成为问题的情况我的过程:

  1. 让它发挥作用。
  2. 说清楚。
  3. 测试表现。
  4. 如果存在有意义的性能问题:重构速度。
  5. 请注意,这不适用于更难以在以后更改的更高级别的设计决策。

答案 1 :(得分:6)

我总是从我能想到的最易读的版本开始。如果性能是一个问题,我重构。如果可读版本难以概括,我会重构。

关键是要进行良好的测试,以便轻松进行重构。

我认为可读性是代码中最重要的问题,尽管正常工作紧随其后。

答案 2 :(得分:6)

可读性是最重要的。对于现代计算机,只有最苛刻的应用程序中最密集的例程需要过多担心性能。

答案 3 :(得分:4)

  

必须编写程序供人们阅读,并且只是偶然的   要执行的机器。
- Abelson& Sussman,SICP

编写好的程序可能更容易profile and hence improve performance

答案 4 :(得分:4)

我对这个问题最喜欢的答案是:

  1. 让它发挥作用
  2. 正确
  3. 快点
  4. 在事物的范围内,除了下一个不得不照顾你的代码的不幸的傻瓜之外,没有人会给你一个关于可读性的废话。然而,话虽如此......如果你对自己的艺术很认真,而且这是一种艺术形式,你将始终努力使你的代码尽可能地保持其他人的可读性。我的朋友和导师(他在各方面都是BADASS)曾经在代码审查中慷慨地告诉我“傻瓜写的代码只有他们能理解,天才才会编写任何人都能理解的代码。”我不知道他从哪里得到了它,但它一直困扰着我。

    Reference

答案 5 :(得分:2)

我运用常识 - 这种事情只是工程所需的众多权衡之一,而且我所能看到的特征很少。

但更具体地说,绝大多数人以表演的名义做出了奇怪的不可读事情,他们过早地做了这些事情而没有进行衡量。

答案 6 :(得分:2)

你应该首先考虑可读性。系统的形状通常会随着您的开发而发展,真正的性能瓶颈将是出乎意料的。只有当系统运行并且能够看到真实证据时 - 如分析器或其他此类工具所提供的 - 才能揭示优化的最佳方式。

“如果你赶时间,请走很远的路。”

答案 7 :(得分:2)

同意上述所有内容,但同时也是:

当您决定要优化时:

  1. 在语法之前修复算法方面(例如,不要在大型​​数组中进行查找)
  2. 确保您证明您的更改确实改善了事情,衡量一切
  3. 评论您的优化,以便下一个看到该功能的人不会将其简化回到您开始的地方
  4. 您是否可以预先计算结果或将计算结果移动到更有效的位置(如数据库)
  5. 实际上,只要你能保持可读性 - 在优化的代码中找到模糊的错误比在简单明显的代码中更难和烦人

答案 8 :(得分:1)

选择性能可读性,除非您能证明自己需要性能。

答案 9 :(得分:1)

我会说,如果存在重要的经过验证的性能问题,那么您应该只牺牲性能的可读性。当然,“重要”是那里的捕获,而重要的是什么,不应该是你正在处理的代码所特有的。

答案 10 :(得分:1)

“过早优化是所有邪恶的根源。” - 唐纳德克努特

答案 11 :(得分:1)

可读性永远胜利。总是。除非它没有。这应该很少。

答案 12 :(得分:0)

在需要优化时,我宁愿牺牲紧凑性并保持性能增强。 perl显然有一些深层次的东西可以用来寻找简洁/性能比,但是编写单行的人很可爱,那个维护代码的人(根据我的经验,通常是我自己6个月后) )可能更喜欢扩展样式中的更多内容,如下所示:

http://www.perl.com/pub/a/2004/01/16/regexps.html

答案 13 :(得分:0)

过早优化规则有例外。例如,当访问存储器中的图像时,读取像素不应该是外部函数。当在图像上提供自定义操作时,永远不要这样做:

typedef Pixel PixelModifierFunction(Pixel);

void ModifyAllPixels(PixelModifierFunction);

相反,让外部函数访问内存中的像素,尽管它更加丑陋。否则,你肯定会编写慢速代码,无论如何你都要重构,所以你正在做额外的工作。

至少,如果你知道你要处理大图像,那就是真的。