【发布时间】:2013-03-26 18:49:59
【问题描述】:
我有一张手的二进制图像(大小:100x100),我们可以将其表示为仅由 0 或 1 个值组成的矩阵。这是一个例子:
假设我有一个代表线性化图像的double数组,我们称之为image,我需要执行以下操作:
double accumulator = 0;
for (int j = 0; j < image.Length; ++j)
{
accumulator += image[j] * weights[j];
}
也就是说,我需要计算image数组的每个像素的加权和。 weights 表示包含double 值的数组,用于对图像的每个像素进行加权。
下面的代码比前面的代码效率高吗?
double accumulator = 0;
for (int j = 0; j < image.Length; ++j)
{
if (image[j] != 0)
{
accumulator += image[j] * weights[j];
}
}
【问题讨论】:
-
运行两个,自己看看。
-
如果都是非 0 显然会更慢。如果都是 0,它可能会快很多。线条交叉的地方是任何人的猜测。 :) 我推荐秒表和大量使用不同位图的试验!如果您甚至需要打扰...
-
对于100x100的尺寸,如果有一点差别,差别不会很大。除非您要处理许多这样的图像,或者图像可能更大(数百万像素),否则可能会有明显的差异。
-
撇开过早的优化问题(以便有一些事情要讨论),分支可能会在处理器级别引入各种潜在的延迟,具体取决于分支是否易于预测。效果取决于处理器,效果的大小在这里不太可能很明显。
-
我问上面的问题只是为了理解'if'指令是否像乘法一样慢......正确的答案是'不可能说'。对吗?
标签: c# performance algorithm