繁体   English   中英

C ++中的性能损失

[英]Performance penalty in C++

在以下情况下,我对成员函数调用中的性能损失有疑问:

我正在编写用于物理计算的代码,并且有很多时间要求很高的任务,例如处理大型矩阵,线性代数等。我设计了一个类来处理日志文件,并且如果有布尔类型debug_mode_ontrue 功能签名是

void write_debug_msg(const data_type1 &text1, const data_type2 &text2, etc)

内联,模板化和重载的代码。 它最多可以接收15个任何类型的参数作为输入。

好的...问题是,当debug_mode_onfalse ,将调用该函数,并且不执行任何操作。 否则,显然,参数将写入日志文件中。 那么,有没有某种可观的惩罚表现? 我的观点是,它是一个空函数类型,没有返回值。 所有参数均作为参考。 而且它也是内联的。 在我看来,唯一真正的惩罚是对布尔类型的评估(不是if而是switch语句)。 那正确吗?

还是调用带有引用给定参数的内联void函数可能以某种方式昂贵,并且我们谈论的是评估而不是switch语句?

当然,我们不会采用用于解决此问题的相同策略,即将与调试模式有关的所有内容放在某种宏中,例如#ifdef DEBUG_MODE#endif 我们这样做是为了能够在运行时中控制调试模式。

确保性能降低的唯一方法是在探查器上运行代码,并查看代码是否甚至值得针对性能进行优化。 否则,您将花费时间担心可能存在或可能不存在的问题。

您提到了“文件”,这意味着I / O。 相对于debug_mode_on为false而言,无论进行任何缓存,(相对而言)进行的“处理”都要多得多。 即使只是将数据格式化为文本并将其放在RAM缓冲区中,这也可能很大(同样,相对而言)。

也可能是您在某些算法中“记录”了很深的时间(可能被称为“数百万”次)(在某些矩阵算法的最内层考虑O(NlogN)或O(N ^ 2))。 。

我要说的是,尝试对您的应用程序进行性能分析,并查看在write_debug_msg中花了什么地方和/或花了多少钱。

可能不会影响性能。 但是,如果您真的很担心,则应该进行简介。 您可以分析整个应用程序,也可以在小型独立应用程序中复制相关的调用语义,并使用类似gprof的名称。

问题是,编写此调试消息功能的位置完全是任意的,我的意思是,取决于代码中的每个开发人员(我对humberto十分满意)。 如果这些函数始终在检查此变量debug_mode_on是否为true,那么我担心如果频繁调用它们可能会导致性能损失。 测试代码的版本是可以的,但是为什么最终版本(用户处理的版本)应该取决于我在哪里放置调试消息呢? 这就是为什么我建议在编译过程中使用代码中任何语句的#ifdef DEBUG来分隔两个版本。 我不是这些方面的专家,所以也许我担心一些微不足道的事情。 所有建议都将是很好的。 我只是想发表自己的观点。 谢谢。 (请记住,这是化学物理代码,并且某些算法本身对系统大小本身的缩放比例很差)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM