Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How did Firefox optimize this loop?

Firefox 9.0.1 surprised me by showing up my Ω(log n) number-padding algorithm with a Ω(n) loop method when n is small. In every other browser I've seen, the loop is slower, even for small values of n. I know all the browsers are working on optimizing JS, but since all the other, modern browsers are showing the loop to be slower, is there any explanation for the behavior in 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; } 

Update: I don't think this is related to the original question, but I just discovered that IE 9 switches behavior when switching from 32- to 64-bit modes. In 32-bit mode, the Math method wins. In 64-bit mode, the Loop method wins. Just thought I should point that out.

Update 2: MAK caught me in his comment below. The math method's not Ω(1), it's probably more like Ω(log n).

like image 974
kojiro Avatar asked Dec 28 '11 04:12

kojiro


1 Answers

Looking at the results its pretty clear that Firefox didn't do anything to achieve a performance gain.

browserscope

These bars can be read as "speeds" (operations/sec) so bigger bars are better. Everything is to scale.

In Firefox 9, its very clear the "Math" method performs abysmally, while there is little change in "Loop" method between versions.

So there was no "optimization" of any sort in Firefox 9. All that happened between Firefox 8 and 9 with regard to these tests is somehow their math library got slower (Math.pow being slow), or their string library got slower (.slice() being slow).

Looking into this further, it's clear somehow these elementary operations got a bit slower in ff9:

ff8 vs ff9

Both concatenation and Math.pow are a bit slower in FF 9 than in FF 8, which may account for the difference you see in your tests.

Interestingly, the new no-op bar is much longer in FF8 than FF9.

like image 151
bobobobo Avatar answered Oct 04 '22 16:10

bobobobo