// Ω(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)。
答案 0 :(得分:11)
明确the results很明显Firefox没有任何来实现获得的性能。
这些条形可以读作“速度”(操作/秒),因此更大的条形更好。一切都是为了扩展。
在Firefox 9中,非常明确的“数学”方法执行得非常糟糕,而版本之间的“循环”方法几乎没有变化。
因此在Firefox 9中有任何类型的没有 “优化”。所有在Firefox 8和9之间发生的关于这些测试的事情都是他们的数学库得到的慢(Math.pow
慢),或者他们的字符串库变慢(.slice()
慢)。
进一步研究,显然somehow these elementary operations got a bit slower in 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