【发布时间】:2014-01-23 08:15:10
【问题描述】:
我今天早上与同事讨论了 for-loop-optimization。这与this question 中描述的情况差不多,但是代码是 C++/CLI,并且方法来自不同的程序集。我知道在这种情况下,编译器无法通过内联函数来优化循环。但是,主题是图像处理,调用的属性是图像的宽度和高度,即:
for (unsigned int y = 0; y < image.Height; ++y) {
for (unsigned int x = 0; x < image.Width; ++x) {
// Do something with pixel x,y
}
}
对于 5M 灰度图像,该循环大约需要 450 毫秒,而在执行循环之前将宽度和高度保存到局部变量时,耗时大约 10 毫秒! (这些数字仅用于显示差异的大小。)
当然,我们现在正走向局部变量解决方案,但我想知道上面给出的幼稚 for 循环是否真的是糟糕的设计?在编写这样的代码时,我不希望有任何真正的编译器优化,但调用 trivial 属性,如图像的宽度和高度,我希望能更快地返回它们的值。那么,整个问题难道不是由于图像库作者的糟糕设计造成的吗?使用琐碎的属性时,我不应该牺牲可读性吗?
【问题讨论】:
-
您是否在没有附加调试器和发布版本的情况下对此进行了测量?
-
“我不应该保留可读性吗?” - 好吧,我不相信首先将两个属性保存到局部变量会降低可读性,但我想知道你的编译器设置和环境。
-
当然是在发布模式下运行的。
-
是的,两个本地人不会影响可读性,但我想知道这些属性是否应该设计在循环中使用。
标签: .net for-loop properties c++-cli