'固定'换循环 - 什么更有效?

时间:2011-01-16 11:36:33

标签: javascript algorithm

我正在创建一个井字游戏,其中一个功能必须遍历9个字段中的每一个(tic-tac-toe在3x3网格上播放)。我想知道什么更有效(哪一个可能更快,或者在这种情况下脚本的首选方式是什么) - 使用两个嵌套循环,如下所示:

for(var i=0; i<3; i++) {
 for(var j=0; j<3; j++) {
  checkField(i, j);
 }
}

或像这样硬编码:

checkField(0, 0);
checkField(0, 1);
checkField(0, 2);
checkField(1, 0);
checkField(1, 1);
checkField(1, 2);
checkField(2, 0);
checkField(2, 1);
checkField(2, 2);

由于只有9种组合,使用两个嵌套的for循环可能有点过分,但是再次阅读这一点会更清楚。然而,for循环将增加变量并检查i和j是否每次都小于3。

在这个例子中,节省时间至少可以忽略不计,但在这种情况下编码的首选方法是什么?

感谢。

7 个答案:

答案 0 :(得分:5)

不要硬编码相同代码的9行!

  • 可读性
  • 灵活性/维护
  • 代码长度

答案 1 :(得分:3)

这是一个过早的微优化。在这种情况下总是寻求更清晰的解决方案 - 所以使用for循环:)顺便说一下,想想明天网格是否是4x4:)

答案 2 :(得分:3)

节省时间:可以忽略不计。可能无法衡量。

首选样式:嵌套for循环。好吧,你可能永远不会把它变成4x4或5x5或3d(或4d!)井字游戏 - 但这是一个很好的习惯。如果您忘记了某些内容并且避免了剪切和粘贴错误,也更容易看到。

答案 3 :(得分:3)

具有讽刺意味的是,对支票进行硬编码可能会更快,但是(这里很重要)毫无意义

因此,你应该真正瞄准的是你想要实现的目标最大的意图清晰度。此外,您应该尝试让生活更轻松,以便将来进行任何改进(可能不会由您执行。)例如,如果tic-tac-toe网格扩展到4x4哪个解决方案最好?

在此基础上,我很想接受循环方法以及适当的评论等等。

答案 4 :(得分:3)

  

我们应该忘记小事   效率,约占97%   时间:过早优化是   万恶之源。     - 唐纳德克努特

绝对是第一个。首先,性能差异绝对可以忽略不计 - 我的猜测是展开的程序会运行得更慢,因为编译/解释它需要更多的时间,因为更长(另外,客户端,服务器和路由器处理能力和带宽将是必需的。)

其次,作为概括,您不知道哪个版本会更快。也许某些解释器会增加第一个版本的寄存器,但是从内存中加载参数(waaay较慢)用于第二个版本?

特别是在JavaScript的情况下,你绝对没有关于解释器和编译器工作速度有多快的固定规范,所以这种“优化”绝对是毫无意义的,并且让其他编程人员最好使用你的代码。

答案 5 :(得分:1)

请不要硬编码。永远不要做那样的事情。

不止一次?使用循环。

另外,你真的担心自己没有的问题。

答案 6 :(得分:1)

正如您所提到的,节省的时间可以忽略不计。即使你把那个网格放到100平方100左右,你仍然看不出任何差别。 如果我们稍微大一点,比如10.000倍10.000,我们可能会看到一些差异。我想知道那可能是什么,因为编译器和优化器非常好,特别是在一个循环中,环境可能通过获取这些信息来加速(函数将被调用几次)。

为什么不尝试一下并与我们分享您的结果?

然而,在实践中,我绝不会建议采用第二种方法。可读性和灵活性远比CPU时间重要。正如他们所说,早期优化本身就是非常邪恶的,因为它会混淆代码并引入许多不必要的复杂性而不会对性能产生真正的影响。