以下哪两个代码中的哪一个应优先于其他代码?一般来说应该以什么为基础做出决定?
在此函数的各种调用中,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);
}
}
}
感谢。
答案 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缓存错误。我的猜测是,这比在循环中添加额外的条件更重要。
因此,如果数组初始化与其他操作相比需要花费大量时间,而这很重要,请为每个操作计时并查看。如果没有,那么请使用更易阅读的版本。