Firefox如何优化这个循环?

当n很小时,用Ω(n)循环方法显示我的Ω(log n)数字填充algorithm,Firefox 9.0.1令我感到惊讶。 在我见过的每一个浏览器中,循环速度都比较慢 ,即使对于很小的n值也是如此。 我知道所有的浏览器都在优化JS,但是由于所有其他的浏览器都显示循环速度较慢,是否有解释Firefox 9的行为?

// Ω(log n) function padNumberMath(number, length) { var N = Math.pow(10, length); return number < N ? ("" + (N + number)).slice(1) : "" + number } // Ω(n): function padNumberLoop(number, length) { var my_string = '' + number; while (my_string.length < length) { my_string = '0' + my_string; } return my_string; } 

更新:我不认为这是与原来的问题,但我刚刚发现IE 9切换行为时,从32位切换到64位模式。 在32位模式下,math方法获胜。 在64位模式下,Loop方法获胜。 只是觉得我应该指出。

更新2: MAK在下面的评论中引起了我的注意。 math方法不是Ω(1),它可能更像Ω(log n)。

看看结果,很明显的是,Firefox没有做任何事情来获得性能提升。

browserscope

这些酒吧可以读作“速度”(操作/秒),所以更大的酒吧更好 。 一切都是按比例的。

在Firefox 9中,“math”方法非常清晰,而“版本”之间的“循环”方法几乎没有变化。

所以在Firefox 9中没有任何types的“优化” 。所有在Firefox 8和9之间发生的关于这些testing的方式都是他们的math库变慢( Math.pow变慢),或者他们的string库变慢了.slice()缓慢)。

进一步研究,很明显, 这些基本操作在ff9中有点慢 :

ff8 vs ff9

FF 9中的连接和Math.pow都比FF 8慢了一些,这可能会解释你在testing中看到的差异。

有趣的是,FF8中新的无操作条比FF9长得多。

这可能是一个arrays拷贝参数string到一个新的字符数组,可能是默认情况下初始化为相关字符,在这种情况下,一个数字。

也许关于识别涉及一个常量的recursion赋值的一些事情允许一个长度为mystring.length + 1的string与mystring的快速连接。

或者,它可能是一样简单的Firefox的幂指数变得sloppier不使用指数的二进制扩展重复平方。

当n很小的时候,Firefox 9.0.1使用Ω(n)循环方法显示我的Ω(1)数字填充algorithm让我感到惊讶。

这句话是不是缺less一些部分? 它显示为更快 ,或什么? 你为什么要将空String连接到Number s? 为什么不只是构造一个String

是的,你的O(1)确实是O(log)…

无论如何,这个解释可能是由于Firefox 9中的types推断