C++ 设计模式的效率

C++ 设计模式的效率,c++,performance,design-patterns,C++,Performance,Design Patterns,有人知道关于高性能应用程序设计模式的最佳实践或理论的网站/书籍/文章吗?似乎很多模式使用间接/抽象/封装的方式可能会影响计算密集型代码的性能。首当其冲的设计模式,甚至GoF都提到了许多模式可能会影响性能,但没有更多关于如何处理的具体建议 设计模式真正关注的是如何构造代码并定义类抽象和交互。计算性能的性能实际上主要受编写实际代码实现(方法体)的方式的影响 对于C++,我绝对建议阅读Scott Meyers书,关于有效C++和更有效的C++系列书籍,它们本身在编写高性能代码时确实揭示了许多习语。p>

有人知道关于高性能应用程序设计模式的最佳实践或理论的网站/书籍/文章吗?似乎很多模式使用间接/抽象/封装的方式可能会影响计算密集型代码的性能。首当其冲的设计模式,甚至GoF都提到了许多模式可能会影响性能,但没有更多关于如何处理的具体建议

设计模式真正关注的是如何构造代码并定义类抽象和交互。计算性能的性能实际上主要受编写实际代码实现(方法体)的方式的影响


对于C++,我绝对建议阅读Scott Meyers书,关于有效C++和更有效的C++系列书籍,它们本身在编写高性能代码时确实揭示了许多习语。p> 设计模式可以帮助您掌握如何设计软件或提高其灵活性。您如何实现该模式决定了您将从其使用中看到什么样的性能损失(或好处)

有些模式确实存在,因为这种整体的结构化方式通常会导致更快的程序。但与算法不同的是,没有一种好的方法可以真正正式地分析一个模式,以决定它有多慢或多快

我的建议是,如果模式有助于您了解如何设计特定的代码段,或者如果您需要重构以使代码更灵活或清晰,那么就使用模式。如果随后出现性能问题,请使用标准分析技术查找它们


如果您在遇到性能问题时进行重构,那么重构的成本可能不值得,或者有一种方法可以降低成本。如果您正在设计新的代码,如果性能问题确实存在于模式工作所必需的间接方式中,那么可能有一种方法可以改变一些东西来解决性能问题。

最具体的建议是:在应用程序中对其进行分析,看看它真正产生了多大的影响


任何其他建议都会更加通用,可能不一定适用于在平台上使用编译器在应用程序中实现给定模式的方式。

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


设计模式主要是将程序分解成更小的部分的方法,更易于重用、编写、设计和测试。一些设计模式会导致代码比一个更简单的设计更坏,但是在考虑80/20个规则时,它们具有显著的优势。
80/20规则规定,程序80%的执行时间将用于执行20%的代码。当您的程序很好且模块化时,很容易将其放入探查器中,并准确地查看哪些组件可以进行调整/优化,或者使用不太灵活的设计以提高性能的意义何在。尽管最初的设计相距甚远,但它更容易找到性能热点。

一个可能帮助您获得更好点击率的术语是“模式语言”。它是一个为某种目的而结合在一起的模式集合。如果您有一个更具体的目标,即高性能,则可能有人为您的域绘制了一条通过模式的路径,例如:。这是UIUC的另一个不错的收集,一个模式工作的温床


ACE/TAO的人有很多关于使用C++的高性能网络模式的问题。

我很惊讶我们没有问你有什么性能问题

根据我的经验,性能问题通常与特定的条件和情况有关。另一方面,设计模式是更一般和抽象问题的解决方案。在同一个文本中处理这两个问题似乎有点尴尬:作者应该将设计模式的性能与可能的许多“非模式”解决方案中的哪些进行比较?当性能问题普遍存在时,肯定已经有了解决方案:Flyweight就是一个很好的例子

使用设计模式所造成的惩罚是有限的、非常小的:引入虚拟调用、由于委派而增加的延迟、由于对象的扩散而导致的额外内存消耗等等。如果在分析之后,您注意到这些是您的不幸的原因,那么有一些已知的方法可以将它们最小化

了解这些模式也可能有助于解决性能问题。首先,有人已经提到,模式可以将问题分解为更小的部分:这可能有助于确定问题的根源,并隔离丑陋但性能良好的代码。它们还为开发人员创建了一个推理和期望的框架。如果出于性能原因必须引入偏差,那么很明显:“除了这里,我们放弃X并做Y来提高性能,这是一个责任链。”它们是在需要时需要打破的规则


(唉,有一种非常好的模式可以获得良好的性能:测量、精确定位、修复。)

GoF设计模式是关于使用经过验证的模式,以优雅、可维护的代码解决常见问题。他们不以绩效为目标

如果您想要性能模式,您可能需要查看系统架构模式、算法、数据结构等

你的应用程序做什么

如果你的应用程序是C++的,并且写得很清楚,那么你的代码在现代硬件上运行速度会很快,直到它不得不等待I/O。这个异常将是像实时图像分析一样的处理器密集型的。 如果性能是一个问题,您真的是指I/O性能吗?(磁盘、数据库、网络等)

有一些“模式”允许您的应用程序在频繁等待时执行