parseInt()比toString()更快吗?

时间:2016-02-22 20:47:55

标签: javascript performance

我正在检查JavaScript中的数字数组是否为pandigital。简而言之,这意味着如果它是一个9位数字,那么它必须具有所有数字1-9。我已经对数字数组进行了排序,并且我有以下循环:

for(var i = 0; i < 9; i++) {
    if(parseInt(digits[i]) != i+1) {
        return false;
    }
}

但我只是想知道以下是否会更快:

for(var i = 0; i < 9; i++) {
    if(digits[i] != (i+1).toString()) {
        return false;
    }
}

我不确定哪一个更快。我觉得转换为字符串比解析数字更快。我试图进行一些测试,但我还没有确定出任何结论:我的计算机已经老了,结果已经到位了。

哪一个会更快,为什么?速度差异会随着数字的增加而增加吗?

修改

digits是一组排序的数字字符串,例如:

var digits = [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ];

2 个答案:

答案 0 :(得分:4)

根据jsperf.com,parseInt()要快得多(至少在我的电脑和Chrome上)。

自己测试一下:

TEST

enter image description here

答案 1 :(得分:1)

我认为两者都不是很快,取决于优化器有多好。

完全避免字符串转换并直接使用序数值(没有这种临时分配)可能要快得多:

for (var i = 0; i < 9; i++) {
    if (digits.charCodeAt(i) != 48 /* '0' */ + i + 1) {
        return false;
    }
}

这是我在快速检测到pandigital数字时的努力:

function pandigital(s) {
    var seen = [0,0,0,0,0,0,0,0,0];
    for (var i = 0; i != s.length; ++i) {
        var ord = s.charCodeAt(i);
        if (ord <= 48 || ord > 48 + s.length) return false;
        if (seen[ord - 48 - 1]++) return false;
    }
    return s.length > 0;
}