代码比较

时间:2011-05-09 14:13:41

标签: c# performance design-patterns programming-languages readability

以下哪两个代码中的哪一个应优先于其他代码?一般来说应该以什么为基础做出决定?

在此函数的各种调用中,MAX_LIMIT可能在1000到5000之间变化。

for (i=0;i<MAX_LIMIT;++i)
{
    for (j=0;j<MAX_LIMIT;++j)
    {
         anObj.setMatrix(i,j,0);
    }
}
for (i=0;i<MAX_LIMIT;++i)
{
    anObj.setMatrix(i,i,1);
}

VS

for (i=0;i<MAX_LIMIT;++i)
{
    for (j=0;j<MAX_LIMIT;++j)
    {
         if(i==j)
         {
             anObj.setMatrix(i,j,1);
         }
         else
         {
             anObj.setMatrix(i,j,0);
         }
    }
}

感谢。

4 个答案:

答案 0 :(得分:4)

两者的性能应该渐近相等,因为它们都在O(n ^ 2)中运行。 您应该更喜欢具有最易读性的那个。

答案 1 :(得分:3)

第二个,它做了它所说的。但是,我非常喜欢

for (i=0;i<MAX_LIMIT;++i)
{
    for (j=0;j<MAX_LIMIT;++j)
    {
         anObj.setMatrix(i, j, i==j ? 1 : 0);
    }
}

答案 2 :(得分:1)

在我看来,我会选择两者中的第二个。最好限制循环访问的次数。既然你至少看了O(n ^ 2)运行时,我肯定会将自己限制在2个循环中。

答案 3 :(得分:0)

更好的是什么?我认为第二版最容易理解,虽然其他人可能有其他意见。

如果您对性能感兴趣,应该很容易计算两种方法。 (甚至可能是相关的。)

看一下这个性能,我怀疑第二种方法会更快,因为它一次可以通过数组一个缓存行。第一种方法一次通过数组一个缓存行,然后继续执行N缓存错误。我的猜测是,这比在循环中添加额外的条件更重要。

因此,如果数组初始化与其他操作相比需要花费大量时间,而这很重要,请为每个操作计时并查看。如果没有,那么请使用更易阅读的版本。