有没有人知道任何涉及高性能应用程序设计模式的最佳实践或理论的网站/书籍/文章?似乎很多模式使用间接/抽象/封装的方式可能会影响计算密集型代码的性能。 Head First Design Patterns甚至GoF提到了许多模式的性能可能性,但没有更具体的建议如何处理它。
答案 0 :(得分:5)
我很惊讶我们没有问你遇到的性能问题!
根据我的经验,性能问题通常与特定条件和情况有关。另一方面,设计模式是更一般和抽象问题的解决方案。在同一文本中处理两者似乎有点尴尬:如果作者可以比较设计模式的性能,可能会有多少“非图案化”解决方案?当性能问题很普遍时,肯定已经有了解决它们的模式: Flyweight 就是一个很好的例子。
使用设计模式所施加的惩罚是有限的,非常小的集合:虚拟调用的引入,由于委托引起的延迟增加,由于对象的扩散导致的额外内存消耗等等。如果在分析之后,您发现这些是造成您困境的原因,那么可以采用已知的方法来最小化它们。
了解模式也可能有助于解决性能问题。首先,有人已经提到模式可以解决较小位的问题:这可能会轻松查明问题的根源并隔离丑陋但高性能的代码。他们还为开发人员创建了推理和期望的框架。如果由于性能原因必须引入偏差,那么很明显:“除了这里,我们放弃X并做Y以提高性能,这是责任链。”它们是规则在需要时破碎。
(唉,有一个非常好的模式可以获得良好的表现:衡量,精确定位,修复。)
答案 1 :(得分:4)
设计模式的存在是为了帮助您掌握如何设计软件或提高其灵活性。如何实现模式决定了从使用模式中会看到什么样的性能损失(或好处)。
确实存在一些模式,因为构建事物的整体方式通常会导致更快的程序。但与算法不同的是,没有什么好方法可以真正正式地分析模式来决定模式的速度或速度。
我的建议是使用一种模式,如果它可以帮助你弄清楚如何设计一段特定的代码,或者你需要重构以使代码更灵活或更清晰。如果您遇到性能问题,请使用标准的分析技术来查找它们。
如果您在遇到性能问题时进行重构,那么成本可能不值得重构,或者可能有一种方法可以缓解它。如果你正在设计新的代码,也许有一种方法可以改变一些事情来解决性能问题,如果它确实存在于模式工作的必要间接方面。
答案 2 :(得分:3)
最具体的建议是:在您的应用程序中对其进行分析,看看它真正产生了多大的影响。
任何其他建议都会更加通用,并且可能不一定适用于您在平台上使用编译器在应用程序中实现给定模式的方式。
答案 3 :(得分:1)
设计模式主要是将程序分解为更小的部分,这些部分更易于重用,组合,设计和测试。一些设计模式将导致代码比简单设计更糟糕,但是当您考虑80/20规则时,它们具有显着优势。
80/20规则表明,80%的程序执行时间将用于执行20%的代码。当您的程序很好并且模块化时,可以很容易地将它放入分析器中,并确切地查看哪些组件可以进行调整/优化,或者在哪里使用灵活性较低的设计以提高性能。尽管最初分开的设计使得更容易找到性能热点。
答案 4 :(得分:1)
可以帮助你获得更好打击的一个术语是“模式语言”。这是为了某种目的而聚集在一起的模式集合。如果您有一个更具体的目标,即高性能,某人可能已经为您的域规划了一条路径,例如:pattern language for parallel software。这是来自UIUC的另一个很好的parallel programming patterns集合,是模式工作的温床。
ACE / TAO伙伴使用C ++有很多关于高性能网络模式的papers
答案 5 :(得分:0)
设计模式真正关注的是如何构建代码并定义类抽象和交互。您的计算性能的性能实际上将主要受您编写实际代码实现(方法体)的方式的影响。
对于C ++,我绝对建议阅读Scott Meyers关于Effective C ++和More Effective C ++系列丛书的书,这本书本身就真正揭示了编写高性能代码的许多习语。
答案 6 :(得分:0)
对于涉及多线程和并发模式以及它们如何影响性能的事情,您可以在“有效并发”下阅读Herb Sutter的条目。
答案 7 :(得分:0)
GoF设计模式是关于使用经过验证的模式来解决优雅,可维护代码的常见问题。他们没有针对性能。
如果您想要性能模式,您可能需要查看系统架构模式,算法,数据结构等。
你的应用做了什么?
如果你的应用程序是用C ++编写的,并且写得很合理,你的代码很可能会在现代硬件上快速运行,直到它必须等待I / O.例外的是像处理器密集的实时图像分析。
如果性能问题,你真的是指I / O性能吗? (磁盘,数据库,网络等)
有'模式'允许您的应用程序即使在经常等待I / O(异步回调等)时也能执行。
如果处理不均匀负载,峰值负载可能远高于平均负载,则常用的体系结构模式是将系统组件与消息队列分离。
答案 8 :(得分:0)
记住古老的说法“你可以把它变得好,快而便宜,挑选两个” 设计模式解决了这个问题。需要一个良好的基础,因此代码可以准确,可维护 如果性能是一个问题,那么基准测试然后优化那些给你带来问题的部分。很多时候性能只是选择一个合适的算法的问题。但是这可能意味着你需要突破一些可怕的优化代码,占10%,占90%的时间。只要确保你用它来评论S ^^ T。