【发布时间】:2012-10-10 11:52:25
【问题描述】:
在我的项目中,我有一个以执行时间为首要目标的课程。对于它我不太关心维护,订单等。至少我直到昨天才在意……现在我也不得不有点担心。
我有一个类,比如 A,它对来自相机的图像执行多次扫描,即可变宽度窗口实时扫描它们。
class A{
// methods and attributes of A:
...
void runiterator(){
...
for{ // change window’s dimension
for{ // rows
for{ // columns
// many lines of code of operations to be executed for each window at each position
...
}
}
}
}
};
性能显示已经有一点延迟,但我可以跳过图像的有限区域来解决它。此外,我还有第二个函数,比如 B,它与 A 具有完全相同的方案,并且在每次扫描时执行不同的操作(幸运的是比 A 快得多)。
嗯,现在是时候加入所有操作以显着受益于整体结果。只是代码真的会变得混乱,庞大并且混合了真正不同的东西。我想定义一个执行迭代的类 X,并在每次扫描时执行对 A_new 中的一个函数和 B_new 中的一个函数的函数调用。但我担心每张图像大约 200000x2 次函数调用会导致性能下降。
你有什么建议?
编辑
对于只调用 Anew 的 X 类(所以它只能与现在的 A 进行比较),平均而言,我得到了多次重复:
在一系列 56 张图像上执行 X 的时间 = 6.15 秒
在同一系列的 56 张图像上执行 A 的时间 = 5.98 s
看来我的嫌疑人并没有那么天真。
差价大约是3%,不算多,但还是对损失感到抱歉。
X 的 __forceinline 时间也是 5.98 秒,但我不想依赖它。
我认为代码已经过优化,进一步改进的余地很小。
事实上,它在相对较短的时间内对图像做了很多事情。
在 A 类中按顺序处理数据是不可能的,因为它基于来自图像的不可预测的值。这就是为什么 B 级(设法做到这一点)要快得多的原因。
【问题讨论】:
-
你能尝试和测量两个版本吗?我们不能真正说出调用增加了多少开销,因为它是相对的。
-
是的,测量,让编译器有机会内联函数调用。
-
这取决于这些函数的作用。
-
如果您以执行时间为主要目标而牺牲了清晰度,那么您很可能会得到执行非常糟糕的代码。相反,将清晰度和可维护性作为您的首要任务。无论如何,您可能会以这种方式获得最佳性能。除非您比这个问题所暗示的更有经验,否则您对性能的直觉无论如何都会在很大程度上是错误的,并且您的“优化”代码将很脆弱,因此难以实际优化。 (例外是高级算法选择——这适用于低级和中级选择,比如函数边界应该在哪里。)
-
如果算法太慢,尝试优化它!
标签: c++ performance function-call