2010-08-06 49 views
6

有没有人知道任何有关围绕高性能应用程序设计模式的最佳实践或理论的网站/书籍/文章?看起来很多模式以可能影响计算密集型代码的性能的方式使用间接/抽象/封装。首先设计模式,甚至是GoF都会提到与许多模式相关的性能命中的可能性,但没有关于如何处理它的更具体的建议。设计模式的效率

回答

5

我很惊讶,我们并不要求你有什么性能问题,有一个关于高性能网络的模式很多papers

以我的经验,性能问题通常是依赖于特定的条件和情况。另一方面,设计模式是解决更一般和抽象问题的方法。在同一篇文章中处理两者似乎有些尴尬:作者应该比较设计模式的性能与可能的许多“非模式化”解决方案?当性能问题一般,当然已经有解决它们的模式:Flyweight就是一个很好的例子。

通过使用设计模式判处罚款是一种有限的,非常小的一组:引入虚拟来电,增加的等待时间,由于代表团,额外的内存消耗,因为对象等的增殖。如果在分析后发现这些是造成你的灾难的原因,那么有一些已知的方法可以将它们降到最低。

知道的模式可能是解决性能问题很有用。首先,有人已经提到模式可以用较小的比特来分解问题:这可以简化查明问题的根源并隔离丑陋但性能高的代码。他们还为开发人员创建了一个推理和期望框架。如果你必须引入出于性能方面的偏差,这将是显而易见的:“除了这里,在这里我们放弃X,做y以提高性能,这是责任的链。”他们是规则,在需要的时候被打破。

(唉,对获得良好性能的一个很好的模式:测量,精确定位,修复。)

+0

你的回答比我的更清楚,更清晰,同时说大致相同的事情。 – Omnifarious 2010-08-06 02:27:39

0

设计模式的重点在于如何构造代码并定义类的抽象和交互。您的计算性能的性能将主要受您编写实际代码实现(方法主体)的方式影响。

对于C++,我绝对建议阅读Scott Meyers关于Effective C++和更高效的C++系列书籍,这本书本身在编写高性能代码时真正揭示了许多成语。

+0

嗯...他们是很好的书。但我认为在性能问题上花费的时间并不多。在某些情况下,他们会向您展示“鉴于性能问题A,您可以使用C++惯用语B来解决这个问题”,但是根本没有关于程序设计的速度问题。 – 2010-08-06 01:34:09

+0

同意,不是直接,但更多的是赞赏内部核心/内存以及如何编写干净有效的代码。 Addison Wesley的高效C++可能更适合所问的问题。在过去的2年里,我没有写出太多的C/C++,而最后一次阅读这些书籍的时间很多年前,因此无法具体指出细节 – 2010-08-06 01:47:50

4

设计模式的存在帮助您掌握如何设计软件或提高其灵活性。你如何实现这个模式决定了你从使用中会看到什么样的性能损失(或者好处)。

某些模式确实存在,因为构建事物的整体方式通常会导致更快的程序。但与算法不同的是,没有什么好方法可以真正正式地分析模式,以决定它的速度有多慢。

我的建议是使用一个模式,如果它可以帮助你弄清楚如何设计一段特定的代码,或者如果你需要重构代码使其更加灵活或清晰。如果您遇到性能问题,请使用标准分析技术来查找它们。

如果您在遇到性能问题时进行重构,也许成本不值得重构,或者可能有一种方法来缓解它。如果你正在设计新的代码,也许有办法改变事情来解决性能问题,如果它确实存在于模式工作的必要间接中。

3

最具体的建议是:在应用程序中对其进行配置并查看它实际产生的影响有多大。

任何其他的建议将会相当普遍,可能不一定适用于您如何在您的平台上使用编译器在您的应用程序中实现了给定模式。

0

对于涉及多线程和并发模式以及它们如何影响性能的内容,您可以阅读“有效并发”下的Herb Sutter条目。

http://herbsutter.com/

+0

这与GoF样式设计模式有什么关系? – 2010-08-06 01:33:31

+0

OP谈到高性能应用程序和我认为的多线程和并发环。 – David 2010-08-06 01:42:41

+0

我没有询问表现。当然,线程化是性能优化。我问到它与GoF样式设计模式有什么关系。 – 2010-08-06 02:05:37

1

设计模式大多是破坏你的程序成小块,这更容易被重用,撰写,设计和测试的方式。一些设计模式会导致代码的执行比简单的设计更差,但是当您考虑80/20规则时,它们具有显着的优势。

80/20规则说你的程序80%的执行时间将花在执行其代码的20%上。当你的程序非常好并且模块化时,很容易将它扔进一个探查器中,看看究竟哪个组件可以被调整/优化,或者在哪里使用不太灵活的设计来提高性能。尽管最初分离的设计使得更容易找到性能热点。

1

可能帮助您获得更好点击的一个术语是“模式语言”。它是为了某种目的而聚集在一起的模式集合。如果您有一个更具体的目标,即高绩效的某人可能已绘制出通过您的域的模式的路径,例如:pattern language for parallel software。这是来自UIUC的另一个不错的收集parallel programming patterns,这是模式工作的温床。

的ACE/TAO家伙用C++

0

的GoF设计模式是关于使用经过验证的模式来解决与优雅,易于维护的代码的常见问题。他们不针对性能。

如果你想为表演方式,你可能需要看看系统架构模式,算法,数据结构等

什么是您的应用程序吗?

如果你的应用是在C++,并明智地写,机会是你的代码将在现代化的硬件上运行瞬息万变,直到它必须等待I/O。例外情况就像是处理器密集型的实时图像分析。

如果性能是一个问题,你真的是I/O性能? (磁盘,数据库,网络等)

有“模式”,让您的应用程序执行即使在频繁等待I/O(异步回调等)

如果你正在处理一个负载不均,由此峰值负载可能比平均负载高得多,通常采用的架构模式是将系统组件与消息队列分离。

0

还记得那句老话:“你可以拥有它,快速和便宜,选择两个”
设计模式解决了这个问题。需要一个良好的基础,以便代码准确,可维护。
如果性能问题,然后基准,然后优化给你问题的部分。很多时候性能只是一个挑选适当算法的问题,但这可能意味着你需要分解为一些可怕的优化代码,这个10%的代码占用了90%的时间。只要确保你评论S ^^ T就可以了。