2017-06-25 6 views
-2

私は現在、行を解析するために複数のケースをテストしています。当然のラインがたくさんありますV8とのPerfomanceの比較

"dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF=dHdX5jOa7ww9cGsW7jQF" 

、と私はキーを抽出する必要があり、かつ

各行には、そのようにフォーマットされます。

キーは、最初の "="で区切られています。 キーには "="文字はありません。

は、最初の "="記号の後の文字列の残りの部分です。このためだから、

結果がでなければなりませんexemple:

{ 
    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 
    }; 
} 

そしてjsBenchで結果出来上がり:

[I」にGoogle Chromeバージョン59.0.3071.104(公式ビルド)(64ビット)を使用しています。

enter image description here

あなたは、私は何が起こっているか理解していないブラウザin this jsBench

でこれらの関数の結果をチェックアウトすることができます。

組み込みの文字列操作は明らかにはるかに高速である理由:私は

私の質問がある...私は(ネイティブに必要なだけのコードを書いたので、それが可能にすることはできません想像)、このような他の詰め込みますか?

なぜこの繰り返しの文字列連結が不適切ですか?

代替手段はありますか?

+0

組み込みの文字列操作を使用します。それらの 'return'ステートメントは' return {[key]:value} 'でなければなりません; '投稿されたJSBenchページは私のためには機能しません。彼らはNaNを呼ぶ。 – Pointy

+1

あなたの特定の質問が何であるかは明確ではありません。大幅に異なる実行が必要な実装がありますか? – pvg

+1

まあ、組み込みの文字列操作は、明らかに、これらの手作りの非効率的な繰り返し文字列の連結よりもはるかに高速です。 – Bergi

答えて

1

なぜ組み込み文字列操作が明らかにはるかに高速ですか?

これらは最適化されているため、JavaScriptコードでは使用できない内部実装方法を使用しているためです。たとえば、結果を一度に構築することで、繰り返しの文字列の連結を避けることができます。

なぜこの繰り返しの文字列連結は非効率的ですか?

中間結果として多くの文字列が作成されるためです。

代替手段はありますか?

掲載、あなたのコードは、構文エラーを有しているので:-)

関連する問題