什么时候优化才真正值得花时间呢?

2024-04-01

在我之后最后一个问题 https://stackoverflow.com/questions/2116826/how-to-explain-at-your-boss-that-code-resources-optimization-is-important,我想了解什么时候优化确实值得开发人员花时间在上面。

是否值得花费 4 小时来获得速度提高 20% 的查询?是的,不,也许,是的,如果……?

“浪费”7 个小时将任务切换到另一种语言以节省大约 40% 的 CPU 使用率“值得”吗?

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

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

隐含着“编写好的、可维护的代码”。

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

举一个具体的例子来说明最后一点,一个简单的例子是当我期望 90% 的查询是SELECT和 10%INSERT/UPDATE,所以我给数据库表添加了索引。但 6 个月后,我发现现实生活中有 10%SELECT查询和 90%INSERT/UPDATEs,所以查询速度没有优化。这是我想到的第一个例子(显然这更多的是对初始错误设计的“补丁”而不是优化;)。

请注意,我是一名开发人员,而不是一名商人 - 但我希望问心无愧,尽可能为我的客户提供最好的服务。

我的意思是,我知道如果我损失 50 个小时来获得应用程序总加速的 5%,并且该应用程序由 10 个用户使用,那么可能不值得花时间......但是当它是时呢? ?

您认为什么时候优化至关重要?

当您意识到优化所花费的时间(以及最终收益)并不总是可以在纸上量化时,您通常会应用什么公式?

EDIT:抱歉,但我不能接受“除非人们不抱怨 id,否则不需要优化”这样的答案;它可以是一个业务视图(有问题,恕我直言),但不是开发人员或(恕我直言)一个明智的答案。我知道,这个问题确实很主观。

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

谢谢大家 ;)


YAGNI http://en.wikipedia.org/wiki/YAGNI。除非人们抱怨很多。


EDIT:我构建了一个比其他替代方案稍慢的库。它仍在获得使用和分享,因为它更好用且更强大。我继续投资于特性和功能,推迟了任何有关性能的工作。

在某些时候,有足够的功能和性能出现在列表的顶部,我终于花了一些时间致力于性能改进,但只是在考虑了很长时间的努力之后。

我认为这是处理这个问题的正确方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候优化才真正值得花时间呢? 的相关文章

  • 未使用的功能会产生什么后果

    我想知道在代码中使用未使用的函数会产生什么 如果有什么后果 如果您查找并删除所有未使用的函数和变量 性能是否会有明显的改进 或者删除未使用的函数和变量只是一个好习惯 未使用的功能不会损害性能 他们让维护代码的人的工作变得更加困难 现代 ID
  • C# 的快速线程安全随机数生成器

    我需要在多个正在运行的线程中快速生成随机浮点数 我尝试过使用System Random 但它对于我的需求来说太慢了 并且它在多个线程中返回相同的数字 当我在单线程中运行应用程序时 它工作正常 此外 我需要确保生成的数字在 0 到 100 之
  • 如何在 C++ 中对静态缓冲区执行字符串格式化?

    我正在处理一段对性能要求非常高的代码 我需要执行一些格式化的字符串操作 但我试图避免内存分配 甚至是内部库的内存分配 在过去 我会做类似以下的事情 假设是 C 11 constexpr int BUFFER SIZE 200 char bu
  • HTML5 Canvas 性能:加载图像与绘图

    我正计划使用 javascript canvas 编写一个游戏 我只有一个问题 在加载图像与仅使用 canvas 的方法进行绘图方面 我应该考虑什么样的性能考虑因素 因为我的游戏将使用非常简单的几何图形 圆形 正方形 直线 所以任何一种方法
  • 加快写入文件的速度

    我已经分析了一些我用 cProfile 继承的遗留代码 我已经做了很多有帮助的更改 例如使用 simplejson 的 C 扩展 基本上 该脚本将数据从一个系统导出到 ASCII 固定宽度文件 每一行都是一条记录 并且有许多值 每行有 71
  • 性能计数器的性能影响是什么

    当考虑使用性能计数器作为我公司的基于 NET 的站点时 我想知道使用它们的开销有多大 我是否想让我的网站不断更新其计数器 或者我最好只在测量时更新 设置性能计数器的开销通常不够高 无需担心 设置共享内存区域和一些 NET 对象 以及 CLR
  • 如何为 CUDA 内核选择网格和块尺寸?

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • 哪个更快:堆栈分配或堆分配

    这个问题听起来可能相当简单 但这是我与另一位合作的开发人员进行的辩论 我小心翼翼地在可能的地方进行堆栈分配 而不是堆分配它们 他一边跟我说话 一边看着我 并评论说没有必要 因为他们的表现是一样的 我总是有这样的印象 堆栈的增长是恒定的时间
  • Xcode“使用性能工具运行”被禁用?

    我正在尝试从我的 Xcode 项目中查找内存泄漏 我不知道发生了什么 我无法选择任何内容Run gt Run with performance tool 事物列表被禁用 请帮助我 我是初学者 问题是我已经删除了构建文件夹并尝试使用性能工具运
  • 有没有办法分析 WCF 应用程序的性能?

    我们正在尝试测量我们的系统的性能 该系统是一个使用 WCF 调用的 NET 3 5 应用程序 问题是到目前为止 我们无法分析这些调用中的方法 编写了一个 winforms 客户端应用程序来测试我们的系统 我们尝试使用ANTS 4 Profi
  • java charAt() 和startsWith() 哪个更快? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题是 如果我想检查特定索引中字符串的一个字符 仅检查一个字符 哪种方法非常有效charAt or startsWith 我的意思是 据我所
  • 方法返回 IOrderedEnumerable 而不是 IEnumerable 是否有利?

    Can it be advantageous for a method to return IOrderedEnumerable instead of IEnumerable 仅当您希望人们每次都订购该枚举并且发现很难弄清楚如何执行此操作时
  • 处理 C++ 中执行时间的大量分析

    我目前正在进行一个科学计算项目 涉及海量数据和复杂算法 因此需要进行大量代码分析 我目前依靠的是
  • R:使用带有 .Call 和 C/C++ 包装器的 Fortran 子例程而不是 .Fortran 的优点?

    我有一个 R 包 它使用大量 Fortran 子例程来进行递归线性代数计算的嵌套循环 很大程度上依赖于 BLAS 和 LAPACK 例程 作为 Fortran 的接口 我使用 Fortran功能 我刚刚读过乔纳森卡拉汉的博客文章 http
  • 为什么 pandas 在简单的数学运算上比 numpy 更快?

    最近 我观察到 pandas 的乘法速度更快 我在下面的例子中向您展示了这一点 如此简单的操作怎么可能做到这一点 这怎么可能呢 pandas 数据帧中的底层数据容器是 numpy 数组 测量 我使用形状为 10k 10k 的数组 数据框 i
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • 带有闭包的 JavaScript 性能

    var name function n var digits one two three four return digits n var namenew function digits one two three four return
  • 通过增加索引之和来生成排序组合的有效方法

    对于启发式算法 我需要一个接一个地评估特定集合的组合 直到达到停止标准 由于它们很多 目前我正在使用以下内存高效迭代器块生成它们 受到 python 的启发 itertools combinations http docs python o
  • 为什么 Java 11 中对于空白字符串 String.strip() 比 String.trim() 快 5 倍

    我遇到过一个有趣的场景 因为某些原因strip 针对空白字符串 仅包含空格 明显快于trim 在Java 11中 基准 public class Test public static final String TEST STRING 3 w
  • 当我使用可变参数而不是常量参数时,为什么我的内联表 UDF 慢得多?

    我有一个表值内联 UDF 我想过滤该 UDF 的结果以获得一个特定值 当我使用常量参数指定过滤器时 一切都很好 并且性能几乎是瞬时的 当我使用可变参数指定过滤器时 它会花费明显更大的时间块 大约是逻辑读取的 500 倍和持续时间的 20 倍

随机推荐