C++ 这种错误检查方法在性能上是否成本过高?
在我的项目中,通过名为C++ 这种错误检查方法在性能上是否成本过高?,c++,optimization,error-handling,C++,Optimization,Error Handling,在我的项目中,通过名为error的类执行错误处理和日志记录。任何可能需要记录错误或警告的函数或对象方法,都将有一个error&error作为最后一个函数参数,如果遇到问题,将调用error::report(…) 例如: float ratioBetweenBounds( float between, float lowerBound, float upperBound,
error
的类执行错误处理和日志记录。任何可能需要记录错误或警告的函数或对象方法,都将有一个error&error
作为最后一个函数参数,如果遇到问题,将调用error::report(…)
例如:
float ratioBetweenBounds( float between,
float lowerBound,
float upperBound,
Error & error) // <--
{
if(upperBound != lowerBound){
return (between - lowerBound) / (upperBound - lowerBound);
}else{
error.report(Error::DivideByZero, __LINE__, __FILE__, lowerBound); // <--
return NAN;
}
}
边界间浮动比率(在,
浮动下边界,
上浮,
Error&Error)/引用通常由编译器作为隐藏指针实现,因此您实际上是在向函数调用添加一个指针参数。对于一个现代处理器来说,每帧5000次调用其实并不算多。继续分析,但我不会担心它,除非它被证明是一个问题。一个可能相关的优化技巧:
通过使error.report
成为一个cold函数,您可以使分支成为低成本/免费的。这样,编译器将生成代码,告诉CPU它不太可能被执行。然而,如果它真的这样做的话,它会更贵
// protect it with a macro for other platforms if necessary
#define COLD __attribute__((cold))
static void COLD error() {
// unlikely error code
}
以下文件(适用于GCC):
寒冷
函数的cold属性用于通知编译器该函数不太可能执行。功能是
针对尺寸而非速度进行了优化,并在许多目标上放置
进入特殊的文本小节,使所有的冷函数
似乎紧密地结合在一起,以改进代码的非冷部分的代码局部性
节目。导致在代码中调用冷函数的路径如下
被分支预测机制标记为不可能。因此
用于标记用于处理不太可能出现的情况的函数,例如
perror,如cold,以改进对热函数的优化
在罕见的情况下有明显的功能
然后,如果您可以使用“免费”异常或其他异常,那么在正常情况下,代码的其余部分根本不需要因为错误检查/报告的存在而受到任何性能影响。实际上没有“大量引用”这样的东西。评测可以告诉您这种方式与另一种方式相比的成本,但最终您必须决定收益是否大于成本。如果Visual Studio支持,我会使用这些方法,但不幸的是,它们没有什么可与不太可能的提示相比的;我想PGO会知道做些类似的事情。(与-fprofile use开关打开时的GCC一样)