C# 乘法或if:什么更有效?

C# 乘法或if:什么更有效?,c#,performance,algorithm,C#,Performance,Algorithm,我有一个手的二进制图像(大小:100x100),我们可以将其表示为仅由0或1个值组成的矩阵。这是一个例子: 假设我有一个表示线性化图像的double数组,我们称之为image,我需要执行以下操作: double accumulator = 0; for (int j = 0; j < image.Length; ++j) { accumulator += image[j] * weights[j]; } 答案是——在这个关头,你真的不必担心这个问题。如果您的代码运行太慢,那么您

我有一个手的二进制图像(大小:100x100),我们可以将其表示为仅由0或1个值组成的矩阵。这是一个例子:

假设我有一个表示线性化图像的
double
数组,我们称之为
image
,我需要执行以下操作:

double accumulator = 0;
for (int j = 0; j < image.Length; ++j)
{
    accumulator += image[j] * weights[j];
}

答案是——在这个关头,你真的不必担心这个问题。如果您的代码运行太慢,那么您可以尝试一些优化。然而,“太慢”是主观的

过早优化是万恶之源


正如angelatlarge指出的,目前-使用易于阅读和维护的工具。

同时运行这两个工具,自己看看。如果都是非0,那么速度显然会慢一些。如果都是0,速度可能会快得多。线的交叉点是谁都猜得到的。:)我推荐秒表和许多不同位图的试用版!如果您甚至需要麻烦…对于100x100的大小,如果有任何差异,差异将不会非常显著。除非您正在处理许多这样的图像,或者图像可能更大(数百万像素),否则可能存在明显的差异。抛开过早的优化问题(以便讨论),分支可能会在处理器级别引入各种潜在的延迟,取决于分支是否易于预测。这种影响取决于处理器,其影响的大小在这里不太明显。我问上述问题只是为了理解“if”指令是否像乘法一样慢。。。正确的答案是“不可能说”。“是吗?”马修沃森,绝对是。我过早地优化了我的打字。我真丢脸。:)呵呵,我们现在可以删除这些评论:)@Moo Juice:Mmmm。。。原则上我同意你的观点,但问题不是“什么是万恶之源”。。。而是“哪种方法更有效”。。。似乎OP“有资格”得到这个问题的答案。@angelatlarge,问题是,正如Jason Watkins在评论中建议的那样,人们可以通过简单的实验很容易地找到答案。超过100x100,我非常怀疑会有任何明显的区别。我担心的是,开发人员正在集中精力解决目前不存在的问题(在我看来,无可否认)。将图像分辨率提高到2000x2000,并尝试使其在5秒内进行1000次尝试,因为业务需要。。。然后我们可以开始研究优化,甚至将其从C#中移出:)为什么没有人使用完整的引语我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源。然而,我们不应该在这关键的3%上放弃我们的机会高德纳
double accumulator = 0;
for (int j = 0; j < image.Length; ++j)
{
    if (image[j] != 0)
    {
        accumulator += image[j] * weights[j];
    }
}