【问题标题】:Multiplication or if: what is more efficient? [closed]乘法或如果:什么更有效? [关闭]
【发布时间】: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


【解决方案1】:

答案是——此时此刻,您真的不需要担心这个问题。如果您的代码运行慢,那么您可以尝试一些优化。但是,“太慢”是主观的。

过早的优化是万恶之源

正如 angelatlarge 指出的那样,目前 - 使用易于阅读且易于维护的内容。

【讨论】:

  • @MatthewWatson,绝对。我过早地优化了我的打字。真丢人。 :)
  • 呵呵,我们现在可以删除这些cmets了:)
  • @Moo-Juice:嗯……我原则上同意你的观点,但问题不是“万恶之源是什么?”……而是“哪种方法是更高效”... OP 似乎“有权”回答这个问题。
  • @angelatlarge,问题在于,正如 Jason Watkins 在 cmets 中建议的那样,人们可以通过简单的实验轻松找到这一点。超过 100x100,我非常怀疑会有任何明显的差异。我担心的是,开发人员正在专注于当前不存在的问题(在我看来,诚然)。由于业务需求,将图像分辨率提高到 2000x2000 并尝试让它在 5 秒内完成 1000 次尝试...然后我们可以开始考虑优化,甚至将其完全移出 C# :)
  • 为什么没有人使用完整的引用 我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源。然而,我们不应该放弃那关键的 3% 的机会。 ——唐纳德·克努斯
猜你喜欢
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2012-09-28
相关资源
最近更新 更多