在我的项目中,我有一些像这样的抽象层:
Vector3 normalizeVector(Vector3 v);
Vector3 vectorMultiplyMatrix(Vector3 v, Matrix3 m);
这些只是平台特定数学库(如DirectXMath)的“代理”功能。
我的问题是如何降低这些图层的成本?通过内联所有这些功能,可以完全消除调用它们而不是直接调用平台特定功能的成本吗?
由于
答案 0 :(得分:4)
在另一个函数调用中捆绑一堆函数调用的意义上添加新抽象级别(代理,外观等)的成本可以忽略不计。将数据传递给它们的方式可能会给您带来麻烦,尤其是在使用复杂对象,容器等时。
Vector3 normalizeVector(Vector3 v);
在每次调用时创建传递的Vector3
对象的副本。如果您遇到性能问题,请通过将传递值改为传递const
引用来避免创建副本:
Vector3 normalizeVector(const Vector3& v);
此函数的这个新原型表示:“我需要引用现有的有效Vector3
对象,我将使用但不会更改”。
除非您真的遇到性能问题,否则不要优化代码。 过早优化一直都是邪恶的,而且永远都是。
答案 1 :(得分:1)
公开函数体将为编译器提供机会,以通过内联消除函数调用。
它是否真的需要它取决于它的内部启发式:内联可能会扩大生成的代码的整体大小,使其对缓存不太友好,并最终否定消除调用的好处。
您可以使用特殊关键字(例如VC ++下的__forceinline)来覆盖编译器的成本/收益分析,但编程人员通常比编程人员对这些决策更合适!
使用profile-guided optimization可以帮助编译器根据程序的实际使用模式做出更好的优化决策,包括哪些函数“热”足以内联,哪些函数“冷”并且应该单独使用。 / p>
要记住的一个特别有效的技术是template metaprogramming。我们的想法是尽可能多地计算编译时间。