我目前正在为一位客户工作,他们因“性能原因”而害怕更改低劣的、无法测试和难以维护的代码。很明显,有许多误解流传,并且这些原因仅仅是盲目信从,而非真正理解。
我遇到的一个这样的反模式是需要将尽可能多的类标记为sealed internal...
*重新编辑:我认为在C#中将所有东西标记为sealed internal是一种过早的优化。
我想知道人们可能意识到或遇到的其他性能反模式有哪些?
我目前正在为一位客户工作,他们因“性能原因”而害怕更改低劣的、无法测试和难以维护的代码。很明显,有许多误解流传,并且这些原因仅仅是盲目信从,而非真正理解。
我遇到的一个这样的反模式是需要将尽可能多的类标记为sealed internal...
*重新编辑:我认为在C#中将所有东西标记为sealed internal是一种过早的优化。
我想知道人们可能意识到或遇到的其他性能反模式有哪些?
我遇到的最大性能反模式是:
收集性能数据将显示某种技术是否成功。不这样做将导致相当无用的活动,因为有人会“感觉”性能提高了,但实际上什么都没变。
房间里的大象:将注意力集中于实现层面的微观优化,而非更好的算法。
变量重用。
我曾经总是这样做,认为在声明上节省了几个周期并降低了内存占用。与代码调试时的混乱相比,这种节省微不足道,尤其是当我移动代码块并且关于起始值的假设发生改变时。
过早的性能优化让人想起来。我倾向于尽可能避免性能优化,当我决定需要它们时,我会将问题传递给我的同事们,经过几轮尝试,确保我们将混淆...嗯,优化放在正确的位置。
我曾经遇到过的一个问题是,在一些严重有问题的代码上投入硬件资源,试图让它变快,这有点像Jeff Atwood在Rulas评论中提到的相反情况。我不是在谈论使用更快的硬件来加速使用基本正确算法的排序与使用优化算法之间的差异。我所说的是,当标准库中存在O(n log n)算法时,使用一个不明显正确的自制O(n^3)算法。还有一些手写例程的事情,因为程序员不知道标准库里有什么。这种情况非常令人沮丧。
仅仅为了使用设计模式而使用它们。
使用#define代替函数来避免函数调用的惩罚。我曾经看到过一些代码,其中宏定义的扩展生成了巨大而且非常缓慢的代码。当然,这也是不可能进行调试的。内联函数是解决这个问题的方法,但是也要小心使用。
我曾经看到过一些代码,其中独立测试被转换为一个字中的位,可以在switch语句中使用。Switch语句可以非常快速,但是当人们将一系列独立测试转换为位掩码并开始编写一些256个优化特殊情况时,他们最好有一个很好的基准证明这会带来性能提升。从维护的角度来看,这真的很麻烦,并且将不同的测试视为独立的使得代码更小,这对于性能也很重要。
在编写代码时不要重构或优化。 在完成代码之前,不要试图优化你的代码,这一点非常重要。