代码之家  ›  专栏  ›  技术社区  ›  Strae

什么时候优化才是真正值得花在上面的时间呢?

  •  9
  • Strae  · 技术社区  · 16 年前

    在我之后 last question ,我想了解什么时候优化才是真正值得开发人员花在优化上的时间。

    花4个小时快速处理20%的查询是否值得?是的,不,也许,是的,如果…?

    为了节省大约40%的CPU使用量,将一个任务切换到另一种语言是否浪费了7个小时?

    我对新项目的正常迭代是:

    1. 了解客户想要什么,以及他需要什么;
    2. 规划项目:语言和地点,数据库设计;
    3. 开发项目;
    4. 测试和错误修复;
    5. 运行项目的最终分析和最终优化;
    6. 如果项目需要,进一步分析资源的实际使用情况,然后进一步优化;

    暗含“编写良好、可维护的代码”。

    显然,大的“优化”部分发生在第2点,但通常在项目结束后检查代码时,我会发现一些部分,即使它们做得很好,也可以改进。这就是第5点的基本原理。

    为了给出最后一点的具体示例,一个简单的示例是当我期望90%的查询 SELECT 10%是 INSERT/UPDATE ,所以我用索引为DB表充电。但6个月后,我发现现实生活中有10% 选择 查询和90% 插入/更新 所以查询速度没有优化。这是我想到的第一个例子(显然,这更像是对初始MIS设计的“补丁”,而不是优化;)。

    请注意,我是一个开发人员,而不是一个商人-但我喜欢有一个明确的良心,给我的客户最好的,如果可能的话。

    我的意思是,我知道如果我浪费50个小时来获得应用程序总速度的5%,而应用程序被10个用户使用,那么它可能不值得花时间……但什么时候呢?

    你认为什么时候优化是至关重要的?

    你通常采用什么公式,知道花在优化(和最终收益)上的时间并不总是可以在纸上量化的?

    编辑 :抱歉,但我不能接受这样的回答:“除非所有人都不抱怨ID,不需要优化”;它可以是业务视图(可疑,imho),但不能是开发人员或(imho也是)一个明智的答案。我知道,这个问题很主观。

    我同意Cheeso的观点,在对项目的实际使用和负载进行分析之后,性能优化应该推迟,但是在项目结束后,可以立即进行一个小的、不快速的优化。

    感谢所有人;)

    9 回复  |  直到 16 年前
        1
  •  6
  •   Aaronaught    16 年前

    这里(至少)要提到两类“效率”:

    • UI应用程序(及其依赖项),其中最重要的度量是 对用户的响应时间 .

    • 批处理,主要指标是 总运行时间 .


    第一种情况是 well-documented rules about response times .如果您关心产品质量,您需要保持响应时间短。当然,越短越好,但关键是:

    • 100 ms的“即时”响应;动画和其他“实时”活动至少需要以这种速度发生;

    • “不间断”响应1秒。除此之外,用户将感到沮丧;您还需要开始考虑显示一个超过此点的进度屏幕。

    • 10秒保持用户焦点。比这更糟的是,你的用户 生气 .

    如果发现多个操作耗时超过10秒,则可以使用 理智的 努力的数量(我不认为有严格的限制,但我个人肯定会说1人月以下的话,可能是3-4个月以下的话),那么你应该 一定地 努力修理它。

    同样,如果你发现自己已经超过了1秒的门槛,你应该努力让它更快。至少,将改善应用程序性能所需的时间与用户可以取消的进度对话框和后台线程的每个慢屏幕重做所需的时间进行比较,因为 是 你作为设计师的责任就是在应用程序速度太慢的情况下提供这一点。

    但不要仅仅基于此做出决定——用户体验也很重要。如果您需要1周时间来进行一些异步进度对话,3周时间来获得1秒以下的运行时间,那么我仍然会使用后者。在我看来,如果问题是广泛应用的话,任何低于人月的情况都是合理的;如果只是一个相对不经常运行的报告,我可能会放弃它。

    如果你的应用程序是实时的——比如图形相关的——那么我会按照非实时应用程序的10秒标记对它进行分类。也就是说,你需要尽一切努力加快速度。闪烁在游戏或图像编辑器中是不可接受的。在音频处理中,口吃和故障是不可接受的。即使是像文本输入这样基本的东西,在按键和字符显示之间的500毫秒延迟是完全不可接受的,除非你通过远程桌面或其他东西连接。解决这类问题不需要付出太多的努力。


    现在,对于第二个案例,我认为这基本上是不言而喻的。如果您正在进行批处理,那么通常 可扩展性 关注。只要批处理能够在分配的时间内运行,就不需要改进它。但是,如果你的数据在增长,如果一批数据应该在一夜之间运行,并且你开始看到它一直蔓延到凌晨9点15分,打断人们的工作,那么显然你需要提高性能。

    事实上,你真的等不了那么久,一旦在规定的时间内不能完成,你可能已经遇到了很大的麻烦。你必须积极监控情况并保持一定的安全系数,比如说在你开始担心之前,最长的运行时间是5小时。

    因此,批处理过程的答案是显而易见的。你有一个 坚硬的 要求私生子 必须 在一定时间内完成。因此,如果你接近边缘, 无论有多困难/成本多高,都必须提高性能。 问题就变成了 改进工艺最经济的方法是什么?

    如果在问题上投入更多的硬件(并且你知道问题确实与硬件有关),那么不要花费任何时间优化,只需购买新的硬件。否则,找出什么样的设计优化和硬件升级的组合将使您获得最佳的投资回报率。在这一点上,这几乎完全是一个成本决定。


    关于这个问题我只想说这些。对那些用“雅格尼”回应此事的人感到羞耻。你的职业责任是 知道 或者至少 找出 不管你是否“需要它”,假设在客户抱怨之前任何事情都是可以接受的,这就是放弃责任。

    仅仅因为你的客户不需要它并不意味着你不需要考虑它。您的客户也不需要单元测试,甚至不需要相当好的/可维护的代码,但是您无论如何都要提供这些东西,因为它是您职业的一部分。最后,与其他以开发人员为中心的产品相比,使用平稳、快速的产品,您的客户会更高兴。

        2
  •  7
  •   Cheeso    16 年前

    YAGNI . 除非人们抱怨,很多。


    编辑 :我建立了一个比现有的备选方案稍慢的库。它仍然得到使用和分享,因为它更好地使用和更强大。我继续投资于特性和功能,推迟了性能方面的任何工作。

    在某种程度上,有足够多的特性和性能冒泡到了列表的顶部,我最终花了一些时间在性能改进上,但只是在考虑了很长时间之后。

    我认为这是接近它的正确方法。

        3
  •  5
  •   U62    16 年前

    必要时,优化是值得的。

    如果我们承诺假日包搜索的客户端响应时间不超过5秒,并且系统将在单个Oracle服务器上运行(任何规格),并且搜索在峰值负载下需要30秒,那么优化肯定是值得的,因为我们不会以其他方式获得报酬。

    当您最初开发一个系统时,您(如果您是一个优秀的开发人员)正在设计一个高效的系统,而不会在过早的优化上浪费时间。如果生成的系统不够快,则需要进行优化。但你的问题似乎表明,如果你觉得值得的话,你可能会做一些手摇式的额外优化。这不是一个很好的思考方式,因为它意味着你还没有一个坚定的目标来考虑什么是可以接受的开始。在开始担心需要做什么样的优化之前,您需要与利益相关者讨论并设置某种目标。

        4
  •  1
  •   user177800    16 年前

    就像大家在其他问题中所说的,答案是,当改变某件事在金钱上有意义时,它就需要改变。在大多数情况下,足够好的一天会赢。如果顾客不抱怨,那就足够好了。如果他们在抱怨,那就把它修好,这样他们就不再抱怨了。敏捷方法论将为您提供一些关于如何知道何时足够的指导。谁在乎某个东西是否比你想象的多用了40%的CPU,如果它正常工作并且客户满意,那么它就足够好了。非常简单,让它工作和维护,然后等待可能永远不会出现的投诉。

    如果你担心的是一个问题,没有人会开始使用Java来构建关键任务的服务器端应用程序。或者是python或者erlang或者其他任何与C无关的东西。如果他们这样做了,在一个时间框架内什么也做不到,即使是获得第一个客户,你是如此担心失去。你会提前知道你需要在事情变成问题之前改变它。

        5
  •  1
  •   Josh Molina    16 年前

    每个人都发帖很好。

    您是否看过简单选择不必要的事务用法?我被那个烫伤了几次…我还做了一些代码清理,发现有很多图被返回,可能需要10个记录……一天又一天…有时候不是你的代码本身,而是有人偷工减料……祝你好运!

        6
  •  0
  •   Kaleb Brasee    16 年前

    如果客户机不认为需要进行性能优化,那么就没有理由这样做。

    定义可度量的性能需求 SLA 当客户机(即95%的查询在2秒内完成)接近项目开始时,您可以知道您是否达到了目标,或者您是否有更多的优化工作要做。当前和预计未来负载下的性能测试为您提供了需要查看是否满足SLA的数据。

        7
  •  0
  •   Brian Hasden    16 年前

    在您知道需要优化什么之前,优化很少是值得的。请始终记住,如果I/O基本上是空闲的,并且CPU很低,您就不会从计算机中得到任何东西。很明显,您不希望CPU一直处于挂接状态,也不希望I/O带宽耗尽,但要意识到在计算机执行高强度操作时,让它基本上整天处于空闲状态是不现实的。

    等到你开始达到一个预先定义的阈值(80%的利用率是我通常使用的标记,其他人认为这太高/太低),然后在必要的时候进行优化。请记住,最好的解决方案可能是扩大规模或缩小规模,而不是实际优化软件。

        8
  •  0
  •   lmsasu    16 年前

    使用 Amdal's law . 它向您展示了在优化系统的某个部分时,哪一个是整体的改进。

    也: If it ain't broke, don't fix it .

        9
  •  0
  •   Community Mohan Dere    9 年前

    优化是值得花时间的,当你得到良好的加速,花很少的时间优化(显然)。要做到这一点,你需要引导你的工具/技术 很快 对优化效果最好的代码。

    通常认为找到代码的方法是 测量函数所花费的时间 但在我看来,这只是提供线索——你还得扮演侦探。我需要什么 直奔密码 是 stackshots . Here is an example of a 40-times speedup, achieved by finding and fixing several problems. 其他人则报告了从7到60的加速因素,几乎不费吹灰之力就实现了这一目标。*

    *(7X: Comment 1 . 60X: Comment 30 )