Optimization 在为未知设计时,如何避免优化的危险?

Optimization 在为未知设计时,如何避免优化的危险?,optimization,Optimization,两方: < P > 1)假设你正在设计一种新的应用程序,并且你正在使用新的算法来表达概念和内容——尝试主动< /强>有意义吗?在那个阶段不要考虑优化技术,即使在你的头脑中你也担心它会以O(n)结尾。超过数百万个元素 2) 如果是这样的话,比如说,为了避免限制概念验证运行后您可能会优化的超酷功能,您如何阻止自己摆脱程序员这一终生的习惯?我一直在尝试脑力练习,纸条,但我长大后基本上是在汇编程序中计算时钟周期,我不断发现自己在充分考虑功能价值之前否决了太浪费的潜在解决方案 编辑:这是关于设计一些以前从

两方:

< P > 1)假设你正在设计一种新的应用程序,并且你正在使用新的算法来表达概念和内容——尝试<强>主动< /强>有意义吗?在那个阶段不要考虑优化技术,即使在你的头脑中你也担心它会以O(n)结尾。超过数百万个元素

2) 如果是这样的话,比如说,为了避免限制概念验证运行后您可能会优化的超酷功能,您如何阻止自己摆脱程序员这一终生的习惯?我一直在尝试脑力练习,纸条,但我长大后基本上是在汇编程序中计算时钟周期,我不断发现自己在充分考虑功能价值之前否决了太浪费的潜在解决方案

编辑:这是关于设计一些以前从未做过的事情(未知),当你甚至不确定理论上是否可以做到时,更不用说拥有无限的计算能力了。因此,“当然,你必须在拥有一个原型之前进行优化,因为这是一个既定的计算原则”,这样的回答并不是特别有用。

我最大的回答是。通过提前编写所有测试,您可以强制自己只编写足够的代码来实现所需的行为。如果时间和时钟周期成为一个要求,那么你可以编写测试来覆盖这个场景,然后重构你的代码来满足这些要求。

< P>“积极地不考虑优化”听起来真的很奇怪。通常80/20法则效果很好。如果您花费80%的时间为不到20%的用例优化程序,那么最好不要浪费时间,除非这20%的用例真的很重要


至于完美主义,它没有什么错,除非它开始让你慢下来,让你错过时间框架。计算机编程艺术是在应用程序的美观性和功能性之间取得平衡的一种行为。帮助自己考虑学习时间管理。当你学会如何分割和衡量你的工作时,你就很容易决定是立即优化它,还是创建工作版本。

优化并不完全是一种危险;在编写代码时,在某种程度上考虑速度是很好的,因为它可以阻止您在一些更简单、更快的事情可以完成时实现缓慢而混乱的解决方案。它还可以让你在头脑中检查一些东西是否实用

可能发生的最糟糕的事情是,你设计了一个大程序,却完全忽略了优化,结果却发现你的整个设计毫无用处,因为如果不完全重写它,它就无法优化。如果你在写作的时候考虑一切,那么这一切就永远不会发生,而“一切”的一部分就是潜在的性能问题。 “过早优化是万恶之源”是万恶之源。我看到过过度使用这一概念导致项目瘫痪。在我的公司,我们有一个软件程序,可以在网络上从磁盘广播传输流。它最初是为了测试目的而创建的(所以我们一次只需要几个流),但在程序的规范要求中,它总是适用于更多的流,以便以后可以用于视频点播


因为它完全无视速度,所以写得一团糟;它有大量的memcpy,尽管事实上它们从来都不是必需的,它的TS处理代码慢得离谱(它实际上多次解析了每个TS数据包),等等。它一次只处理40条流,而不是它应该处理的数千条流,当它真正用于视频点播时,我们不得不回去花大量时间清理和重写它的大部分内容。

就像安全性和可用性一样,从项目一开始就必须考虑性能。因此,设计时一定要考虑到良好的性能。

老Knuth的观点是“我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源。”O(N!)到O(poly(N))不是“小效率”


处理类型1的最佳方法是从可能工作的最简单的事情开始(O(N!)不可能工作,除非您没有扩展超过几十个元素!)并将其从应用程序的其余部分封装起来,以便您可以将其重写为更好的方法,前提是会出现性能问题。

如果我担心代码处理数据增长的能力,在我做得太多之前,我会尝试以大数据块增量设置样本数据集,以使用类似的方法进行测试:

1000条记录
10000条记录
100000条记录
1000000条记录


并查看它在哪里损坏或变得不可用。然后,您可以根据实际数据决定是否需要优化或重新设计核心算法。

我认为,对于算法来说,忘记O(N!)最坏情况是很合理的。首先,您需要确定给定的流程是否可行。记住摩尔定律仍然有效,所以即使是糟糕的算法也会在10年或20年内花费更少的时间

首先优化设计——例如,首先让它工作:-),然后优化性能。这是python程序员天生做的一种权衡。通过使用运行时通常较慢但级别较高(例如,与C/C++相比)因而开发速度较快的语言进行编程,python程序员能够完成相当多的工作。然后他们专注于优化

需要注意的是,如果完成所需的时间太长,以至于您无法确定您的算法是否正确,那么这是一个非常好的时机,可以在上游更早地考虑优化问题。我只遇到过这种情况