首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么排序javascript字符串比数字更快?

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

Stack Overflow用户
提问于 2017-06-29 10:56:03
回答 1查看 1.7K关注 0票数 2

我在调查一个先入为主的概念,即在javascript中排序字符串比排序整数要慢。这是基于我读到的东西(现在找不到),这似乎是错误的,它说javascript将字符串存储为Array<Array<int>>,而不是只存储Array<int>MDN文档似乎与此相矛盾:

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

如果我们将元素(number或string)的“大小”定义为其文本表示的长度(对于数值元素或字符串元素都是如此),那么对于一个大小相同的元素(一个数字和一个字符串)的大型数组,我期望字符串排序的等于或稍微慢于数组排序的,但是当我运行一个简单的测试(下面的代码)时,字符串的排序速度大约是排序速度的两倍。

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

结果:

代码语言: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

来源:

代码语言:javascript
复制
"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]);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-02 21:11:59

我在调查一个先入为主的概念,即在javascript中排序字符串比排序整数要慢。

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

这是基于我所读到的内容,其中指出javascript将字符串存储为Array<Array<int>>,而不仅仅是Array<int>。MDN文档似乎与此相矛盾。

是的,你所读的似乎确实是错误的。字符串只是字符序列(每个字符是一个16位值),因此它们通常存储为整数数组,或者更确切地说是给他们的指示。但是,您的字符串数组确实可以作为数组的数组来处理。

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

代码的问题是将数字排序为字符串,将每个数字转换为字符串,然后进行比较。见如何正确排序整数数组。当您修复它时,请注意,对比较函数的调用对内置字符串比较仍然有相当大的开销,因此如果您确实对不同类型的关系运算符(<==>)进行了基准测试,我希望数字的性能会更好。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44823220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档