Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么排序javascript字符串比排序数字更快?_Javascript_Arrays_Performance_Sorting_Primitive - Fatal编程技术网

为什么排序javascript字符串比排序数字更快?

为什么排序javascript字符串比排序数字更快?,javascript,arrays,performance,sorting,primitive,Javascript,Arrays,Performance,Sorting,Primitive,我在调查一个先入为主的想法,即在javascript中对字符串排序要比对整数排序慢。这是基于我读到的东西(现在找不到),这似乎是错误的,它指出javascript将字符串存储为数组似乎与此相矛盾: JavaScript的字符串类型用于表示文本数据。它是一组16位无符号整数值的“元素”。字符串中的每个元素在字符串中占据一个位置。第一个元素位于索引0处,下一个元素位于索引1处,依此类推。字符串的长度是其中的元素数 如果我们将一个元素(数字或字符串)的“大小”定义为其文本表示的长度(对于数字元素或字符

我在调查一个先入为主的想法,即在javascript中对字符串排序要比对整数排序慢。这是基于我读到的东西(现在找不到),这似乎是错误的,它指出javascript将字符串存储为
数组似乎与此相矛盾:

JavaScript的字符串类型用于表示文本数据。它是一组16位无符号整数值的“元素”。字符串中的每个元素在字符串中占据一个位置。第一个元素位于索引0处,下一个元素位于索引1处,依此类推。字符串的长度是其中的元素数

如果我们将一个元素(数字或字符串)的“大小”定义为其文本表示的长度(对于数字元素或字符串元素,因此
size=string(x).length
),那么对于相同大小的大量元素(一个数字和一个字符串),我希望字符串的排序等于或略慢于数组排序,但当我运行一个简单的测试(下面的代码)时,结果表明字符串的排序速度是数组排序速度的两倍

我想知道字符串和数字是什么,javascript是如何排序的,这使得字符串排序比数字排序更快。也许有什么我误解了

结果: 资料来源:
“严格使用”;
const CHARSET=“abcdefghijklmnopqrstuvxyzabcdefghjijklmnopqrstuvxyzo123456789:”;
函数生成器(L){
常量字符=[];
而(字符长度
我在调查一个先入为主的想法,即在javascript中对字符串排序要比对整数排序慢

没错,字符串比较比数字比较要昂贵得多

这是基于我读到的一些东西,其中指出javascript将字符串存储为
数组。您的字符串数组实际上可以被视为数组的数组

当我运行一个简单的测试时,结果表明字符串的排序速度是原来的两倍


代码的问题在于,您将数字排序为字符串,这会将每个数字转换为一个字符串,然后进行比较。看见当您解决这个问题时,请注意,对比较函数的调用对于内置字符串比较仍然有相当大的开销,因此,如果您真的对不同类型的关系运算符(
)进行了基准测试,我希望数字的性能会更好。

字符串-无需找到权重。数字-您需要找到重量,并根据重量进行排序。比如考虑
“500”、“1000”与
500、1000
。前者被交换,而后者是正确的。这就是我对为什么会这样的理解。它可能正确,也可能不正确。明显的问题是。请注意,
10^32
量级的浮点数无论如何都将使用科学符号进行字符串化。熵只有64位,你不能得到任意长的字符串表示。@Bergi是对的,如果你不提供对
sort
函数的回调,那么它将继续默认排序,强制将值比较为字符串(如果它们还不是字符串类型)。啊,好的,谢谢@Bergi。我将重新运行测试,看看这是否会显著改变情况。
~/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
"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]);