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没有做任何事情来获得性能提升。
这些酒吧可以读作“速度”(操作/秒),所以更大的酒吧更好 。 一切都是按比例的。
在Firefox 9中,“math”方法非常清晰,而“版本”之间的“循环”方法几乎没有变化。
所以在Firefox 9中没有任何types的“优化” 。所有在Firefox 8和9之间发生的关于这些testing的方式都是他们的math库变慢( Math.pow
变慢),或者他们的string库变慢了.slice()
缓慢)。
进一步研究,很明显, 这些基本操作在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推断