GTF*_*GTF 2 javascript arrays sorting performance primitive
我正在研究一个先入之见,认为用javascript对字符串进行排序比对整数进行排序要慢。这是基于我读过(但现在找不到)的内容,这似乎是错误的,它表示javascript将字符串存储为Array<Array<int>>而不是just Array<int>。该MDN文档似乎矛盾的:
JavaScript的String类型用于表示文本数据。它是一组16位无符号整数值的“元素”。字符串中的每个元素在字符串中都占有一个位置。第一个元素在索引0处,第二个元素在索引1处,依此类推。字符串的长度是其中的元素数。
如果我们将元素(数字或字符串)的“大小”定义为其文本表示形式的长度(因此size = String(x).length对于数字元素或字符串元素),则对于相同大小的一大数组元素(一个数字,和一个字符串),我期望字符串的排序等于或慢于数组的排序,但是当我运行一个简单的测试(下面的代码)时,结果发现字符串的排序速度大约是数组的两倍。
我想知道关于字符串和数字的含义,以及javascript是如何进行排序的,这使得字符串排序比数字排序更快。也许有些误会。
~/sandbox > node strings-vs-ints.js 10000 16
Sorting 10000 numbers of magnitude 10^16
Sorting 10000 strings of length 16
Numbers: 18
Strings: 9
~/sandbox > node strings-vs-ints.js 1000000 16
Sorting 1000000 numbers of magnitude 10^16
Sorting 1000000 strings of length 16
Numbers: 3418
Strings: 1529
~/sandbox > node strings-vs-ints.js 1000000 32
Sorting 1000000 numbers of magnitude 10^32
Sorting 1000000 strings of length 32
Numbers: 3634
Strings: 1474
Run Code Online (Sandbox Code Playgroud)
"use strict";
const CHARSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghjijklmnopqrstuvwxyz0123456789:.";
function generateString(L) {
const chars = [];
while(chars.length < L) {
chars.push(CHARSET[Math.floor(Math.random() * CHARSET.length)]);
}
return chars.join("");
}
function generateNumber(L) {
return Math.floor(Math.random() * Math.pow(10, (L - 1))) + Math.pow(10, L - 1);
}
function generateList(generator, L, N) {
const elements = [];
while(elements.length < N) {
elements.push(generator.call(null, L));
}
return elements;
}
function now() {
return Date.now();
}
function getTime(baseTime) {
return now() - baseTime;
}
function main(count, size) {
console.log(`Sorting ${count} numbers of magnitude 10^${size}`);
const numbers = generateList(generateNumber, size, count);
const numBaseTime = now();
numbers.sort();
const numTime = getTime(numBaseTime);
console.log(`Sorting ${count} strings of length ${size}`);
const strings = generateList(generateString, size, count);
const strBaseTime = now();
strings.sort();
const strTime = getTime(strBaseTime);
console.log(`Numbers: ${numTime}\nStrings: ${strTime}`);
}
main(process.argv[2], process.argv[3]);
Run Code Online (Sandbox Code Playgroud)
我正在研究一个先入之见,认为用javascript对字符串进行排序比对整数进行排序要慢。
没错,字符串比较比数字比较要昂贵得多。
这是基于我阅读的内容,该内容表明javascript将字符串存储为,
Array<Array<int>>而不是justArray<int>。MDN文档似乎与此矛盾。
是的,您阅读的内容确实确实是错误的。字符串只是字符序列(每个字符为16位值),因此它们通常存储为整数数组,或者指向它们的指针。但是,您的字符串数组确实可以视为数组的数组。
当我进行一个简单的测试时,结果表明字符串的排序速度大约是其两倍。
代码的问题在于,您将数字按字符串排序,这会将每个数字转换为字符串,然后进行比较。请参阅如何正确对整数数组排序。修复此问题后,请注意,对比较函数的调用仍然对内置字符串比较有很多开销,因此,如果您对不同类型的关系运算符(,,)进行了基准测试<,我希望数字的性能更好。==>
| 归档时间: |
|
| 查看次数: |
718 次 |
| 最近记录: |