什么时候考虑 Java 中的代码效率?
When to consider code efficiency in Java?
这些天,我在学校学习不同的 Java 代码效率 (big-O)。
我不禁想知道在实际编程中何时考虑代码效率。
是程序员在PDL/Pseudo阶段思考的问题吗?
或者就在您编写代码时..
非常感谢您对此的看法!
请注意,以下内容相当笼统,因为问题非常基础。
在现实世界中,程序员往往会在设计阶段关注效率,通常在以下情况下:
- 他们正在解决的问题是时间紧迫的(例如:视频渲染和图像处理)
- 他们处理的数据量太大(例如:分析提要中的数十亿个字符串)
否则他们主要使用 'off the shelf' 方法和设计原则。
在某些情况下,代码审查会发现缺乏经验的开发人员的糟糕实现,并且需要进行大量的返工和学习:)
有时一些现有的实现是性能密集型的,并且由于各种原因(知识匮乏、时间限制、'it was a good idea at that time'、对问题的理解不明确等)。在这种情况下,通常会对实施进行 post-mortem 修复,在这些情况下,还会考虑更好的实施和效率。
另请注意 Knuth 的名言:
我们应该忘记小效率,大约 97% 的时间说:过早优化是万恶之源。但我们不应该放弃那关键的3%
的机会
和
在成熟的工程学科中,12% 的改进,很容易获得,从不被认为是微不足道的,我相信同样的观点应该在软件工程中盛行
因此需要在时间投资、复杂性和优化之间取得平衡。有关详细信息,请阅读 wiki link.
如果您在 PDL 阶段看到对于非常大的 n,复杂度将是 O(2^n) 甚至是 O(n^2) 那么您会再考虑一下,但即使那样您也可能制作这些位的原型只是为了看看会发生什么。
通常你首先把事情做对,因为在它做对之前你无法真正知道它有多快,然后你使用分析器(例如 https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html 一个非常简单的例子)来查看它实际燃烧的地方 cpu 然后专注于那些位。
大 O 表示法是表达算法效率的好方法,但在处理企业系统中的代码时,事情通常会变得更加复杂。由于 performance and stability problems,在长期 运行 中,整个系统的架构及其 运行 所依赖的基础设施可能会产生更大的影响(并且修复成本更高)如果他们错了。
大 O 符号肯定是工程师在使用性能分析器和其他工具确定瓶颈时会考虑(或根据)的东西,并且正在寻求在瓶颈所在的区域实施更有效的算法是。
这些天,我在学校学习不同的 Java 代码效率 (big-O)。 我不禁想知道在实际编程中何时考虑代码效率。
是程序员在PDL/Pseudo阶段思考的问题吗? 或者就在您编写代码时..
非常感谢您对此的看法!
请注意,以下内容相当笼统,因为问题非常基础。
在现实世界中,程序员往往会在设计阶段关注效率,通常在以下情况下:
- 他们正在解决的问题是时间紧迫的(例如:视频渲染和图像处理)
- 他们处理的数据量太大(例如:分析提要中的数十亿个字符串)
否则他们主要使用 'off the shelf' 方法和设计原则。
在某些情况下,代码审查会发现缺乏经验的开发人员的糟糕实现,并且需要进行大量的返工和学习:)
有时一些现有的实现是性能密集型的,并且由于各种原因(知识匮乏、时间限制、'it was a good idea at that time'、对问题的理解不明确等)。在这种情况下,通常会对实施进行 post-mortem 修复,在这些情况下,还会考虑更好的实施和效率。
另请注意 Knuth 的名言:
我们应该忘记小效率,大约 97% 的时间说:过早优化是万恶之源。但我们不应该放弃那关键的3%
的机会和
在成熟的工程学科中,12% 的改进,很容易获得,从不被认为是微不足道的,我相信同样的观点应该在软件工程中盛行
因此需要在时间投资、复杂性和优化之间取得平衡。有关详细信息,请阅读 wiki link.
如果您在 PDL 阶段看到对于非常大的 n,复杂度将是 O(2^n) 甚至是 O(n^2) 那么您会再考虑一下,但即使那样您也可能制作这些位的原型只是为了看看会发生什么。
通常你首先把事情做对,因为在它做对之前你无法真正知道它有多快,然后你使用分析器(例如 https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html 一个非常简单的例子)来查看它实际燃烧的地方 cpu 然后专注于那些位。
大 O 表示法是表达算法效率的好方法,但在处理企业系统中的代码时,事情通常会变得更加复杂。由于 performance and stability problems,在长期 运行 中,整个系统的架构及其 运行 所依赖的基础设施可能会产生更大的影响(并且修复成本更高)如果他们错了。
大 O 符号肯定是工程师在使用性能分析器和其他工具确定瓶颈时会考虑(或根据)的东西,并且正在寻求在瓶颈所在的区域实施更有效的算法是。