Performance 性能与可读性
在阅读中,我发现这是(注意引号)解决问题的“代码”(顺便说一句,这是perl) 显然,这是一个没有实际含义的智力示例(我希望在我的生活中永远看不到这一点),但是,当您不得不做出选择时,您何时会为了性能而牺牲代码的可读性?你只是运用常识吗?你总是把它当作最后的手段吗?你的策略是什么Performance 性能与可读性,performance,Performance,在阅读中,我发现这是(注意引号)解决问题的“代码”(顺便说一句,这是perl) 显然,这是一个没有实际含义的智力示例(我希望在我的生活中永远看不到这一点),但是,当您不得不做出选择时,您何时会为了性能而牺牲代码的可读性?你只是运用常识吗?你总是把它当作最后的手段吗?你的策略是什么 编辑:很抱歉,看到答案我可能表达得很糟糕(英语不是我的母语)。我的意思不仅仅是性能与可读性的对比在编写代码之后,在编写代码之前,我也会询问一下。有时,您可以通过制作一些较暗的设计或提供一些将使您的类更暗的属性来预见将来
编辑:很抱歉,看到答案我可能表达得很糟糕(英语不是我的母语)。我的意思不仅仅是性能与可读性的对比在编写代码之后,在编写代码之前,我也会询问一下。有时,您可以通过制作一些较暗的设计或提供一些将使您的类更暗的属性来预见将来的性能改进。您可能会决定使用多个线程,或者只使用一个线程,因为您希望这些线程能够提供可伸缩性,即使这会使代码更难理解。我总是从我能想到的最可读的版本开始。如果性能有问题,我会重构。如果可读版本使其难以概括,我将进行重构 关键是要有好的测试,这样重构就容易了
我认为可读性是代码中最重要的问题,尽管正确工作离性能只有一步之遥。选择可读性而不是性能,除非你能证明你需要性能。我想说的是,如果有一个经验证的性能问题非常严重,你应该只为性能牺牲可读性。当然,“重要的”是关键,重要的和不重要的应该针对您正在处理的代码。可读性是最重要的。对于现代计算机,只有最密集的例行程序和最苛刻的应用程序才需要过分担心性能。我运用常识——这类事情只是工程所需要的无数权衡之一,而且我几乎看不到有什么特殊特征
但更具体地说,绝大多数以性能为名做奇怪的不可读的事情的人都是过早地、不加衡量地做这些事情。你应该始终首先考虑可读性。系统的形状通常会随着您的开发而演变,而真正的性能瓶颈将出乎意料。只有当系统运行并且能够看到真实的证据时(由探查器或其他类似工具提供),优化的最佳方法才会被揭示出来 “如果你赶时间,走远一点。” 程序必须是为人们阅读而编写的,而且只是为了方便阅读 要执行的机器
-Abelson&Sussman,SICP
编写良好的程序可能更容易实现。“过早优化是万恶之源。”-Donald Knuth在需要优化的时候,我宁愿牺牲紧凑性并保持性能提升。显然,perl在寻求简洁性/性能比方面有一些深层次的探索,但是,尽管编写一行代码很可爱,但维护代码的人(根据我的经验,通常是6个月后的我)可能更喜欢扩展样式,如本文所述:
我认为绩效可能是一个问题的情况下的流程:
请注意,这不适用于更高级别的设计决策,这些决策在后期更难更改。同意上述所有内容,但也: 当您决定要优化时:
实际上,尽可能保持可读性-在优化代码中查找模糊的错误比在简单的明显代码中查找模糊的错误更加困难和烦人可读性总是赢的。总是。除非它没有。这应该是非常罕见的。早熟优化规则也有例外。例如,当访问内存中的图像时,读取像素不应是一种越位功能。在图像上提供自定义操作时,千万不要这样做:
typedef Pixel PixelModifierFunction(Pixel);
void ModifyAllPixels(PixelModifierFunction);
相反,让外部函数访问内存中的像素,尽管它更难看。否则,您肯定会编写很慢的代码,以后无论如何都要进行重构,所以您需要做额外的工作
至少,如果你知道你要处理大图像,这是真的。我最喜欢这个问题的答案是:
问得好。在创建使用perl正则表达式替换的迁移脚本时,我也很想知道这一点。维护单独的正则表达式替换表达式以逐渐转换输入要比维护单独的正则表达式替换表达式容易得多
typedef Pixel PixelModifierFunction(Pixel);
void ModifyAllPixels(PixelModifierFunction);