哪个循环配置需要更多时间才能运行?

时间:2010-03-23 12:40:53

标签: c

代码I:

for(i=0; i<100; i++){
  for(j=0; j<1000; j++){
    x = y;
  }
}

代码II:

for(i=0; i<1000; i++){
  for(j=0; j<100; j++){
    x = y;
  }
}

你能解释为什么这些循环配置中的一个会比另一个循环配置花费更多时间吗?

5 个答案:

答案 0 :(得分:3)

这实际上取决于您直接控制的多种因素。

正如user David V在评论中所说,两者都将被一个好的编译器淘汰。然后,如果它们不是,它们将转换为具有分支指令的一些机器代码。当处理器运行带分支的代码时,它使用所谓的推测分支预测,其行为不同,具体取决于代码转换成的确切指令。其他因素可能会起作用 - 例如缓存未命中代码。在仔细测量并彻底分析结果之前,您无法确定。

答案 1 :(得分:1)

我可能会指出,任何好的编译器,但不如上面提到的那么好,会将其编译为各种CPU指令,并且不需要用于分支或任何该分支预测逻辑,有助于避免管道停滞。

实际上,有一个简单的CPU级别构造(循环指令)将使用最少的软件仿真来完成上述操作。因此,乘法是可交换的,因此100x1000或1000x100是相同的。

答案 2 :(得分:1)

虽然我认为所有答案都是正确的。也就是说,它会被优化出来,它将取决于机器代码等。我认为在最简单的情况下,假设没有优化和没有推测分支(这可能不太现实),代码1将被证明更快,因为那里设置循环是一些开销。也就是说,您必须声明i和J变量。由于外环的开销总是只发生一次,因此内环是真正的因素。因为在代码1中,内部循环仅设置了100次,而在代码2中,内部循环设置了1000次,代码1应该更快。同样,这是最简单的情况,这可能是面试问题或测验问题的原因。

答案 3 :(得分:0)

一个好的答案可能是:它们都是在二维数组中找到某些东西的无效方法,你应该尝试某种索引来删除它。

这是一个面试问题,对吧?好吧,期待面试答案:)

答案 4 :(得分:0)

一般来说,内循环有很大的机会完全适合缓存,所以100 out-1000 in应该更快。但编译器非常聪明......