编写应用程序时,首先完成功能,然后优化?

时间:2013-01-27 14:08:14

标签: c# .net performance

唐纳德克努特说“过早优化是一切罪恶的根源”,我渐渐相信这句话。

所以我可以说,在编写应用程序时,我们应该专注于完成功能,而不考虑性能问题,直到我们无法承受低性能

我担心如果我多次使用错误的模式会降低应用程序的速度,那么修复问题可能会花费相当多的时间。我应该在广泛使用之前测试模式的性能吗?

我提到的模式可能指的是使用Linq或for-loop,使用Delegate.BeginInvokeParallel.ForTask<T>,处置IDisposable或忽略它等等。

任何参考材料都欢迎。

2 个答案:

答案 0 :(得分:2)

我同意Knuth关于过早优化的引用的精神,因为它可能导致代码在开发过早变得过于复杂和笨拙,影响代码的质量和完成项目所需的时间。

我对你的帖子有两个担忧:

您应该了解您的功能/算法是否可以在理论上扩展/执行或不符合您的要求(例如解决方案的O复杂性 - &gt; http://en.wikipedia.org/wiki/Analysis_of_algorithms

您提到的模式实际上是具体的实现项目,其中只有一些与性能有关,例如

  • Parallel.For / Task - 这些对于在多核系统上获得性能非常有用
  • IDisposable - 这是与资源管理相关的,而不是要避免的事情
  • Linq vs. for-loop - 这可以是点优化,但您需要对您的用例进行基准测试/评估,以确定哪种方法最适合您(例如,在某些情况下,Linq可以移至PLinq以实现并行化)
  • Delegate.BeginInvoke - 线程同步的非可选组件

答案 1 :(得分:1)

不要在不考虑性能的情况下编码 在代码变得更复杂(例如并行)之前的性能代码 但是使用C#5.0,即使并行也不复杂 如果您有一些电话,您认为可能需要优化然后进行设计。
设计代码,以便优化不会改变方法的接口。

有速度,内存,并发(如果是服务器应用程序),可靠性,安全性和支持 清洁代码通常是最好的代码。

在你知道自己遇到性能问题但不要草率之前不要发疯。

在回答关于SO的另一个问题时,我告诉那个人他们不需要DataTable,DataReader会更快,内存更少。他们的反应是它仍然在1/2秒内运行我不在乎。对我来说这是邋code的代码。

@JonhSanders我不同意“在代码变得更复杂之前执行代码”将导致错误或不完整。对我来说,性能编码与优化不同。首先传递任何东西,但扔掉代码我代码的性能 - 没有异国情调只是最佳实践。在那里,我看到了潜在的热点,我可能需要回来并优化,我会考虑优化。附:我同意结束这个问题。