整数数组排序:为什么Int32Array.sort比Array.sort慢?

时间:2016-06-07 17:05:41

标签: javascript arrays sorting

与当前JavaScript引擎上的无类型数组相比,我观察到类型化整数数组的enableSuggestions()实现性能较低。

我的直觉告诉我TypedArray.prototype.sort()应该更快,因为它默认执行数字比较而不是Array.prototype.sort()使用的字符串比较,因此我们需要提供比较函数{{1 }}

然而,在实践中,这种直觉是错误的。 Chrome和Firefox都可以更快地对无类型数组进行排序:

disableSuggestions()
.sort()

差异必须由(a, b) => b - a而不是var length = 1000, array = new Array(length), int32Array = new Int32Array(length); // Fill arrays with random integers: for (var i = 0; i < length; ++i) { int32Array[i] = array[i] = Math.random() * length | 0; } // Run benchmark.js test suite: var suite = new Benchmark.Suite; suite.add('Array.sort', function() { var input = array.slice(); var result = input.sort((a, b) => b - a); }) .add('Int32Array.sort', function() { var input = int32Array.slice(); var result = input.sort(); }) .on('complete', function() { console.log(this[0].toString()); console.log(this[1].toString()); console.log('Fastest is ' + this.filter('fastest').map('name')); }) .run();造成,其速度比前者快两个数量级。

是否存在解释观察到的低性能的固有原因?

PS:根据Fastest way to sort 32bit signed integer arrays in JavaScript?,对整数数组进行排序的最快方法是提供一个自己的<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/2.1.0/benchmark.js"></script>实现。

2017年更新:在Firefox 52 / Ubuntu上,排序Int32Array现在的执行速度略快于无类型数组。

0 个答案:

没有答案