性能与可读性

性能与可读性

Performance vs Readability

阅读此问题后,我发现它是(请注意引号)"代码"以解决问题(顺便说一下,这是perl)。

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

显然,这是一个理性的例子,没有真实的含义(我希望永远不要在真实的代码中看到),但是,当您必须做出选择时,何时牺牲代码的可读性以提高性能?您是否仅应用常识,是否总是将其作为最后的手段?你有什么策略?

编辑:很抱歉,看到答案我可能表达得很不好(英语不是我的母语)。我并不是说性能与可读性只在您编写代码之后出现,而是在您编写代码之前询问。有时您可以通过做一些更暗的设计或提供一些使您的类更暗的属性来预见将来的性能改进。您可能会决定使用多个线程还是仅使用一个线程,因为您期望此类线程可以为您提供可伸缩性,即使这样做会使代码更难以理解。


我认为绩效可能是一个问题的过程:

  • 让它起作用。
  • 讲清楚。
  • 测试性能。
  • 如果存在有意义的性能问题:重构速度。
  • 请注意,这不适用于在以后阶段更难更改的更高级别的设计决策。


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


    我总是从我能想到的最易读的版本开始。如果性能有问题,请重构。如果可读性版本难以一概而论,则可以重构。

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

    我认为可读性是代码中排名第一的最重要问题,尽管正确地工作仅次于第二。


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

  • 让它起作用
  • 改正它
  • 快一点
  • 在事情的范围内,除了下一个必须照顾您的代码的傻瓜之外,没有人对可读性有所抱怨。 但是,话虽如此...如果您对艺术很认真,并且这是一种艺术形式,您将始终努力使您的代码成为可能表现出的最高性能,同时仍可被他人阅读。 我的朋友和导师(从各个方面来说都是坏蛋)曾经在一次代码审查中亲切地告诉我:"傻瓜只写他们能理解的代码,而天才则写任何人都可以理解的代码。" 我不确定他从哪儿得到的,但这一直困扰着我。

    参考


    Programs must be written for people to read, and only incidentally for
    machines to execute. Abelson & Sussman, SICP

    编写良好的程序可能更易于分析,从而提高性能。


    同意以上所有内容,但还:

    当您决定要优化时:

  • 在语法之前修复算法方面的内容(例如,不要在大型??数组中进行查找)
  • 确保您证明自己的改变确实可以改善一切,衡量一切
  • 评论您的优化,以便下一个看到该功能的人不会将其简化为从头开始的地方
  • 您可以预计算结果还是将计算移到可以更有效地完成的地方(例如数据库)
  • 实际上,请尽可能保持可读性-与简单的显而易见的代码相比,在优化的代码中发现晦涩的bug更加困难和烦人


    您应该始终首先阅读。系统的形状通常会随着您的开发而发展,而真正的性能瓶颈将是意料之外的。仅当您的系统正在运行并且可以看到真实的证据(由探查器或其他此类工具提供)时,才会显示出优化的最佳方法。

    "如果你着急,那就走很长的路。"


    我运用常识-这种事情只是工程需要进行的无数折衷之一,而且我看不到一些特殊的特征。

    但更具体地说,绝大多数以表演为名的人在做怪异的,难以理解的事情,都是过早地,没有衡量地进行。


    可读性总是赢。总是。除非不是这样。那应该很少。


    "过早的优化是万恶之源。" -唐纳德??·努斯


    我要说的是,只有在存在已证明的重要性能问题时,才应该牺牲性能的可读性。当然,"重要"是关键所在,重要的和不重要的应该针对您正在处理的代码。


    除非可以证明需要性能,否则请选择可读性而不是性能。


    过早的优化规则也有例外。例如,当访问存储器中的图像时,读取像素不应成为离线功能。并且在图像上提供自定义操作时,切勿这样做:

    1
    2
    3
    typedef Pixel PixelModifierFunction(Pixel);

    void ModifyAllPixels(PixelModifierFunction);

    取而代之的是,让外部函数访问内存中的像素,尽管比较麻烦。否则,您一定要编写慢速的代码,无论如何稍后都必须重构它们,因此您需要做更多的工作。

    至少,如果您知道要处理大图像,那就是事实。


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

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


    推荐阅读

      学习写字楼新选择6000元主流配置

      学习写字楼新选择6000元主流配置,,这种配置需要考虑双核心的办公和娱乐平台,充分考虑办公室的办公需求和娱乐需求,以约6000元的预算和cost-e

      提高3A四核羿龙II游戏配置的性能

      提高3A四核羿龙II游戏配置的性能,,以节能环保为主题的IT产业,目前3A低端平台处理器、主板芯片组、独立开发卡性能突出,特别是在与AMD的处理

      优化PostgreSQL中的批量更新性能

      优化PostgreSQL中的批量更新性能,数据,表格,在Ubuntu 12.04上使用PG 9.1. 我们目前需要24小时才能运行大量UPDATE数据库上的语句,其形式

      诺基亚威图性能好到哪里

      诺基亚威图性能好到哪里,诺基亚,手机,诺基亚威图性能好到哪里这是一部以前列出的手机。即使当时配置不高,该品牌的手机也不依赖于该功能吸

      魅蓝note6性能参数有哪些

      魅蓝note6性能参数有哪些,摄像头,蓝牙,魅蓝note6性能参数有哪些魅力蓝色Note6最好拍照。电池寿命更长。蓝色Note6使用高通 snapdragon 625

      玩游戏,i7/i5如何选择

      玩游戏,i7/i5如何选择,,CPU和显卡都在不断更新,每年都有越来越多的性能和特点,但它不一定对每个球员的必要。作为最强的英特尔旗舰处理器酷睿

      Win8平板电脑,这是Win8片好四

      Win8平板电脑,这是Win8片好四,,之前我们看到Android系统绝大多数的平板电脑,与巨头微软的Win8平板系统中加入了这一行列,导致Win8平板电脑,迅

      自己配置电脑选择cpu|电脑配置怎样选

      自己配置电脑选择cpu|电脑配置怎样选,,电脑配置怎样选买笔记本电脑主要看CPU、显卡、主板、内存、硬盘等硬件的性能参数,当然最关键的是考