Firefox如何优化此循环?

koj*_*iro 35 javascript algorithm performance firefox-9

当n很小时,Firefox 9.0.1通过使用Ω(n)循环方法显示我的Ω(log n)数字填充算法让我感到惊讶.在我见过的每个其他浏览器中,循环速度较慢,即使是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;
}
Run Code Online (Sandbox Code Playgroud)

更新:我不认为这与原始问题有关,但我刚刚发现IE 9在从32位模式切换到64位模式时会切换行为.在32位模式下,Math方法获胜.在64位模式下,Loop方法获胜.我想我应该指出这一点.

更新2: MAK在下面的评论中抓住了我.数学方法不是Ω(1),它可能更像Ω(log n).

bob*_*obo 11

综观结果它很清楚,火狐没有做任何事情来实现性能增益.

browserscope

这些条可以读作"速度"(操作/秒),因此更大的条形更好.一切都是规模化的.

在Firefox 9中,非常清楚"数学"方法执行得非常糟糕,而版本之间的"循环"方法几乎没有变化.

所以在Firefox 9 中没有任何 "优化".在Firefox 8和9之间就这些测试发生的一切都是他们的数学库变慢(Math.pow慢),或者他们的字符串库变慢(.slice()慢).

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

ff8 vs ff9

连接和Math.pow在FF 9中比在FF 8中慢一点,这可能会导致您在测试中看到的差异.

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