Performance 性能与可读性

Performance 性能与可读性,performance,Performance,在阅读中,我发现这是(注意引号)解决问题的“代码”(顺便说一句,这是perl) 显然,这是一个没有实际含义的智力示例(我希望在我的生活中永远看不到这一点),但是,当您不得不做出选择时,您何时会为了性能而牺牲代码的可读性?你只是运用常识吗?你总是把它当作最后的手段吗?你的策略是什么 编辑:很抱歉,看到答案我可能表达得很糟糕(英语不是我的母语)。我的意思不仅仅是性能与可读性的对比在编写代码之后,在编写代码之前,我也会询问一下。有时,您可以通过制作一些较暗的设计或提供一些将使您的类更暗的属性来预见将来

在阅读中,我发现这是(注意引号)解决问题的“代码”(顺便说一句,这是perl)

显然,这是一个没有实际含义的智力示例(我希望在我的生活中永远看不到这一点),但是,当您不得不做出选择时,您何时会为了性能而牺牲代码的可读性?你只是运用常识吗?你总是把它当作最后的手段吗?你的策略是什么


编辑:很抱歉,看到答案我可能表达得很糟糕(英语不是我的母语)。我的意思不仅仅是性能与可读性的对比在编写代码之后,在编写代码之前,我也会询问一下。有时,您可以通过制作一些较暗的设计或提供一些将使您的类更暗的属性来预见将来的性能改进。您可能会决定使用多个线程,或者只使用一个线程,因为您希望这些线程能够提供可伸缩性,即使这会使代码更难理解。

我总是从我能想到的最可读的版本开始。如果性能有问题,我会重构。如果可读版本使其难以概括,我将进行重构

关键是要有好的测试,这样重构就容易了


我认为可读性是代码中最重要的问题,尽管正确工作离性能只有一步之遥。

选择可读性而不是性能,除非你能证明你需要性能。

我想说的是,如果有一个经验证的性能问题非常严重,你应该只为性能牺牲可读性。当然,“重要的”是关键,重要的和不重要的应该针对您正在处理的代码。

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

我运用常识——这类事情只是工程所需要的无数权衡之一,而且我几乎看不到有什么特殊特征


但更具体地说,绝大多数以性能为名做奇怪的不可读的事情的人都是过早地、不加衡量地做这些事情。

你应该始终首先考虑可读性。系统的形状通常会随着您的开发而演变,而真正的性能瓶颈将出乎意料。只有当系统运行并且能够看到真实的证据时(由探查器或其他类似工具提供),优化的最佳方法才会被揭示出来

“如果你赶时间,走远一点。”

程序必须是为人们阅读而编写的,而且只是为了方便阅读 要执行的机器
-Abelson&Sussman,SICP


编写良好的程序可能更容易实现。

“过早优化是万恶之源。”-Donald Knuth

在需要优化的时候,我宁愿牺牲紧凑性并保持性能提升。显然,perl在寻求简洁性/性能比方面有一些深层次的探索,但是,尽管编写一行代码很可爱,但维护代码的人(根据我的经验,通常是6个月后的我)可能更喜欢扩展样式,如本文所述:


我认为绩效可能是一个问题的情况下的流程:

  • 让它发挥作用
  • 说清楚
  • 测试性能
  • 如果存在有意义的性能问题:重构以提高速度

  • 请注意,这不适用于更高级别的设计决策,这些决策在后期更难更改。

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

    当您决定要优化时:

  • 在语法之前修复算法方面(例如,不要在大型数组中查找)
  • 确保你证明你的改变确实改善了事情,衡量一切
  • 注释您的优化,以便下一个看到该函数的人不会将其简化回您的起点
  • 您是否可以预计算结果或将计算移动到更有效的位置(如db)

  • 实际上,尽可能保持可读性-在优化代码中查找模糊的错误比在简单的明显代码中查找模糊的错误更加困难和烦人

    可读性总是赢的。总是。除非它没有。这应该是非常罕见的。

    早熟优化规则也有例外。例如,当访问内存中的图像时,读取像素不应是一种越位功能。在图像上提供自定义操作时,千万不要这样做:

    typedef Pixel PixelModifierFunction(Pixel);
    
    void ModifyAllPixels(PixelModifierFunction);
    
    相反,让外部函数访问内存中的像素,尽管它更难看。否则,您肯定会编写很慢的代码,以后无论如何都要进行重构,所以您需要做额外的工作


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

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

  • 让它工作
  • 做对
  • 快点
  • 在这一范围内,除了下一个倒霉的傻瓜必须处理好你的代码外,没有人会对可读性大惊小怪。然而,尽管如此。。。如果你对你的艺术很认真,而这是一种艺术形式,你会一直努力使你的代码达到它所能达到的最大共振峰,同时仍能被其他人阅读。我的朋友和导师(他在各方面都是个坏蛋)曾经在一次代码审查中亲切地告诉我,“傻瓜写的代码只有他们自己能理解,天才写的代码任何人都能理解。”我不知道他从哪里得到的,但我一直坚持着这一点


    问得好。在创建使用perl正则表达式替换的迁移脚本时,我也很想知道这一点。维护单独的正则表达式替换表达式以逐渐转换输入要比维护单独的正则表达式替换表达式容易得多
    typedef Pixel PixelModifierFunction(Pixel);
    
    void ModifyAllPixels(PixelModifierFunction);