Chrome认为99,999与100,000完全不同

Mar*_*ahn 38 javascript google-chrome

当有人发布了一个jsperf基准测试时,我遇到了一个非常有趣的问题,该基准测试与先前的,几乎相同的基准测试相冲突.

Chrome 在这两行之间做了一些截然不同的事情:

new Array(99999);  // jsperf ~50,000 ops/sec
new Array(100000); // jsperf ~1,700,000 ops/sec
Run Code Online (Sandbox Code Playgroud)

基准:http://jsperf.com/newarrayassign/2

我想知道是否有人知道这里发生了什么!

(为了澄清,我正在寻找关于V8内部的一些低级细节,例如它使用不同的数据结构,一个与另一个以及这些结构是什么)

eyk*_*nal 53

只是因为这听起来很有趣,我在V8代码库中搜索了一个定义为100000的静态,我发现了这个kInitialMaxFastElementArray随后在内置ArrayConstructInitializeElements函数函数中使用的var.虽然我不是程序员并且不知道这里的细节,但你可以看到它正在使用一个if循环来确定它是否小于100,000,并return根据它在不同的点上进行.

  • 谢谢:)对我来说,看起来Chrome实际上是在为所有数组<100,000进行指针内存分配,而不是分配任何> = 100,000.这在基准测试中是有意义的,因为声明只有___far___更快,但是然后使用该数组比使用99,999数组慢. (10认同)

nai*_*sts 10

当您设计适应数据大小的算法时,总会有一些阈值数(例如,当您将1000个项添加到列表时,SharePoint会更改其工作方式).因此,猜测是您已经找到实际数字并且性能不同,因为使用了不同的数据结构或算法.