Firefox如何优化此循环?

时间:2011-12-28 04:22:01

标签: javascript performance algorithm firefox-9

当n很小时,Firefox 9.0.1通过使用Ω(n)循环方法显示我的Ω(log n)数字填充算法让我感到惊讶。 In every other browser I've seen, the loop is slower,即使是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在下面的评论中抓住了我。数学方法不是Ω(1),它可能更像Ω(log n)。

3 个答案:

答案 0 :(得分:11)

明确the results很明显Firefox没有任何来实现获得的性能。

browserscope

这些条形可以读作“速度”(操作/秒),因此更大的条形更好。一切都是为了扩展。

在Firefox 9中,非常明确的“数学”方法执行得非常糟糕,而版本之间的“循环”方法几乎没有变化。

因此在Firefox 9中有任何类型的没有 “优化”。所有在Firefox 8和9之间发生的关于这些测试的事情都是他们的数学库得到的慢(Math.pow慢),或者他们的字符串库变慢(.slice()慢)。

进一步研究,显然somehow these elementary operations got a bit slower in ff9

ff8 vs ff9

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

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

答案 1 :(得分:3)

将参数字符串数组复制到新的char数组中的速度可能很快,默认情况下可能默认初始化为相关字符,在本例中为数字。

也许关于识别涉及常量的递归赋值允许快速连接一串长度为mystring.length + 1'0和mystring的字符串。

或者它可能是一个简单的事情,因为Firefox指数在不使用指数的二进制扩展进行重复平方时变得更加笨拙。

答案 2 :(得分:0)

  

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

这句话是不是缺少某些部分?它显示为更快,还是什么? 为什么要将空String连接到Number s?为什么不构建一个String

是的,你的O(1)真的是O(log)......

无论如何,解释可能是由于Firefox 9中的Type Inference

相关问题