0

我有一个关于在以下情况下调用成员函数时的任何性能损失的问题:

我正在编写用于物理计算的代码,并且有很多需要时间的任务,例如操作巨大的矩阵、线性代数等。我设计了一个类来处理日志文件,并且如果有一个成员函数来编写它bool 类型称为debug_mode_onis true。函数签名是

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

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

好的......所以问题是,什么时候debug_mode_on调用false函数并且什么也没做。否则,很明显,参数被写入日志文件中。那么是否有任何可观的惩罚表现?我的观点是,它是一个 void 函数类型,没有返回的东西。所有参数都作为参考给出。它也是内联的。从我的角度来看,唯一真正的惩罚是对 bool 类型的评估(不是陈述,if而是switch陈述)。那正确吗?

或者使用引用给出的参数调用内联 void 函数可能会有点昂贵,我们谈论的是评估而不是switch语句?

当然,我们并没有采用相同的策略来解决这个问题,即把所有关于调试模式的东西都放在某种宏中,比如#ifdef DEBUG_MODEand #endif。我们这样做只是为了能够在运行时控制调试模式。

4

4 回答 4

3

您提到了“文件”,这意味着 I/O。无论任何缓存如何,与 debug_mode_on 为假时相比,(相对而言)完成了更多的“处理”。即使它只是将数据格式化为文本并将其放入 RAM 缓冲区 - 这也可能是巨大的(再次,相对而言)。

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

我会说尝试分析您的应用程序并查看在 write_debug_msg 中花费的位置和/或多少。

于 2013-11-15T01:18:42.680 回答
3

确保任何性能下降的唯一方法是在分析器上运行您的代码,并查看代码是否值得优化性能。否则,您会花时间担心可能存在或不存在的问题。

于 2013-11-15T01:14:56.783 回答
2

可能没有性能影响。但是,如果你真的很担心,你应该配置文件。您可以分析整个应用程序,也可以在小型独立应用程序中复制相关的调用语义并使用 gprof 之类的东西。

于 2013-11-15T01:19:34.227 回答
0

问题在于,编写此调试消息函数的位置完全是任意的,我的意思是,取决于此代码中的每个开发人员(我正在和 humberto 一起工作)。如果这些函数总是检查这个变量 debug_mode_on 是否为真,我担心如果过于频繁地调用它们可能会损失一些性能。代码的测试版本可以,但是为什么最终版本(用户处理的版本)应该取决于我在哪里放置了调试消息?这就是为什么我建议在编译期间使用代码中任何语句的#ifdef DEBUG 来分隔两个版本。我不是这些事情的专家,所以也许我担心一些微不足道的事情。所有的建议都会受到欢迎。我只是想发表我的观点。谢谢。

于 2013-11-15T16:52:07.000 回答