让我举一个基于经验的例子。我每天使用的大多数库都以某种方式使用OOP。OOP能够隐藏许多域所需的复杂性,它并不是真正有助于提高性能的机制。可能发生的事情是,一个库能够基于对象层次结构使用特定的优化,但是大多数情况下是向用户隐藏了复杂性。查找设计模式,它们是通常用来完成这种复杂性隐藏的机制。
以PETSc为例。PETSc使用OOP的检查器/执行器模型,其中的任何算法都会查看给定对象中的可用例程,并选择要执行的例程以完成例程。这允许用户分离问题,例如,矩阵动作可以包括任何类型的阻塞或优化例程,并且可以被众多迭代求解器有效地使用。通过使用户能够指定自己的数据类型和评估,他们可以加快一些重要的例程,并且仍然可以使用整个库的功能。
我要举的另一个例子是FEniCS和deal.II。这两个库都使用OOP来概括大量有限元方法。在元素类型,元素顺序,正交表示等所有方面都是可以互换的。尽管这两个库都比某些专用结构化FEM代码“慢”,但它们能够以用户不知道的FEM复杂性来解决各种各样的问题。
我最后一个例子是元素。Elemental是一个新的稠密线性代数库,它已将管理MPI通信器和数据位置的难度简化为非常简单的语言构造。结果是,如果您具有FLAME串行代码,则通过更改数据类型,还可以通过Elemental获得并行代码。更有趣的是,您可以通过将分布设置为相等来处理数据分布。
应该将OOP视为管理复杂性的一种方法,而不是与手动装配竞争的范例。同样做得不好也会导致大量的开销,因此必须保持定时并更新使用它的机制。