Javascript 与V8发动机的性能比较

Javascript 与V8发动机的性能比较,javascript,performance,google-chrome,benchmarking,v8,Javascript,Performance,Google Chrome,Benchmarking,V8,我目前正在测试多个解析行的案例 每行的格式如下: "dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF" 当然有很多行,我需要提取键和值 键由找到的第一个“=”分隔。 键中从来没有“=”字符 值是第一个“=”符号后面的字符串的剩余部分 因此,对于本例,结果应为: { key: "dHdX5jOa7ww9cGsW7jQF", value: "dHdX5jOa7ww9cGsW

我目前正在测试多个解析行的案例

每行的格式如下:

"dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF"
当然有很多行,我需要提取键和

键由找到的第一个“=”分隔。 键中从来没有“=”字符

值是第一个“=”符号后面的字符串的剩余部分

因此,对于本例,结果应为:

{
  key: "dHdX5jOa7ww9cGsW7jQF",
  value: "dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF"
}
从这里,我们可以迭代多个解决方案:

// the first one is not very efficient with split splice join method
function first(line) {
  const lineSplit = line.split('='),
        key       = lineSplit[0],
        value     = lineSplit.splice(1, lineSplit.length).join('=');

  return {
    key,
    value
  };
}

// the second one execute only what i want to do
// with built-in String prototype's functions
function optimized(line) {
  const index = line.indexOf("="),
        key   = line.substr(0, index),
        value = line.substr(index + 1, line.length);

  return {
    key,
    value
  };
}

// i tried to code the logic myself
function homemade(line) {
    const len = line.length;
    let value = "", key = "", valued = false;
    for (let i = 0; i < len; ++i) {
        const char = line[i];
        if (valued === false) {
            if (char !== '=') {
                key += char;
            } else {
                valued = true;
            }
        } else {
            value += char;
        }
    }

    return {
        key,
        value
    };
}

// and next recode substr and foreach built-in to implemant the same
// function but with homemade substr&foreach
String.prototype.substr2 = function(from, to){
    let str = "";
    for (let i = from; i < to; ++i) {
        str += this[i];
    }
    return str;
};

String.prototype.indexOf2 = function(occ){
    const len = this.length;
    for (let i = 0; i < len; ++i) {
        if (this[i] === occ) {
            return i;
        }
    }
    return -1;
};

function overload(line) {
  const index = line.indexOf2("="),
        key   = line.substr2(0, index),
        value = line.substr2(index + 1, line.length);

  return {
    key,
    value
  };
}
//第一种方法在拆分拼接方法中效率不高
功能第一(行){
常量lineSplit=line.split('='),
key=lineSplit[0],
value=lineSplit.splice(1,lineSplit.length).join('=');
返回{
钥匙
价值
};
}
//第二个只执行我想做的事情
//内置字符串原型的函数
功能优化(线路){
const index=line.indexOf(“=”),
key=line.substr(0,索引),
值=行substr(索引+1,行长度);
返回{
钥匙
价值
};
}
//我试着自己编写逻辑代码
函数(行){
const len=直线长度;
让value=”,key=”,value=false;
for(设i=0;i
看看jsBench的结果:

[我使用的是Google Chrome版本59.0.3071.104(官方版本)(64位)]

您可以使用浏览器签出这些函数的结果

我不明白发生了什么事。我认为这是不可能的,因为我只使用native for()和其他类似的东西编写了所需的代码

我的问题是:

为什么内置字符串操作明显快得多

为什么这种重复的字符串连接是不充分的

还有别的选择吗

为什么内置字符串操作明显快得多

因为它们经过了优化,并且使用了JavaScript代码无法使用的内部实现技巧。例如,它们通过一次性生成结果来避免重复的字符串连接

为什么这种重复的字符串连接效率很低

因为它会创建许多字符串作为中间结果

还有别的选择吗


使用内置字符串操作:-)

正如所发布的,您的代码有语法错误。那些
return
语句应该是
return{[key]:value}发布的JSBench页面对我不起作用;他们把你的问题称为NaN,不清楚你的具体问题是什么。是否有一些实现您认为应该执行明显不同的操作?嗯,内置字符串操作显然比手工制作的低效重复字符串连接要快得多。谢谢@Bergi,但您能回答为什么吗?为什么这个循环是不完善的?我编辑了这篇文章。@john这些自定义实现不符合规范。它们省略了一些关键的细节,如:可选thisArg、检查数组是否实际具有属性等。