1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptの文字列は不変ですか?JavaScriptで「文字列ビルダー」は必要ですか?

2022-04-02 21:30:20

質問

javascriptはimmutableとmutableのどちらの文字列を使用しますか?文字列ビルダーは必要ですか?

どのように解決するのですか?

イミュータブル(不変)です。のような文字列の中の文字を変更することはできません。 var myString = "abbdef"; myString[2] = 'c' . のような文字列操作のメソッドは trim , slice は新しい文字列を返します。

同じように、同じ文字列への参照が2つある場合、一方を変更しても他方には影響しません。

let a = b = "hello";
a = a + " world";
// b is not affected

しかし、Ashが回答で言っていたこと(連結にはArray.joinを使うのが速い)をいつも聞いていたので、文字列を連結するさまざまな方法をテストして、最も速い方法をStringBuilderに抽象化したいと思いました。これが本当かどうか、いくつかのテストを書いてみました(本当ではありません!)。

これが一番早いと思っていたのですが、メソッドコールを追加すると遅くなるのではとずっと考えていました...。

function StringBuilder() {
    this._array = [];
    this._index = 0;
}

StringBuilder.prototype.append = function (str) {
    this._array[this._index] = str;
    this._index++;
}

StringBuilder.prototype.toString = function () {
    return this._array.join('');
}

以下はパフォーマンスのスピードテストです。この3つは、いずれも "Hello diggity dog" を10万回繰り返すと、空の文字列になります。

3種類のテストを作成しました

  • 使用方法 Array.pushArray.join
  • Array インデックスの使用により Array.push を使用し、その後 Array.join
  • 文字列の連結

次に、同じ3つのテストを抽象化して作成し StringBuilderConcat , StringBuilderArrayPushStringBuilderArrayIndex http://jsperf.com/string-concat-without-sringbuilder/5 ぜひ、このサイトでテストを行い、良いサンプルを得てください。なお、小さなバグを修正したため、テスト用のデータが消去されてしまいましたが、十分なパフォーマンスデータが揃ったら、テーブルを更新します。次のサイトへ http://jsperf.com/string-concat-without-sringbuilder/5 をクリックすると、古いデータ表が表示されます。

以下は、リンクを辿りたくない方のための数字(Ma5rch 2018年最新版)です。各テストでの数値は、1000演算/秒での数値です( 高いほど良い )

<テーブル ブラウザー インデックス プッシュ 連結 SBIndex SBPush SBCコンキャット クローム 71.0.3578 988 1006 2902 963 1008 2902 Firefox 65 1979 1902 2197 1917 1873 1953 エッジ 593 373 952 361 415 444 エクスプローダー11 655 532 761 537 567 387 オペラ 58.0.3135 1135 1200 4357 1137 1188 4294

調査結果

  • 現在、すべての常用ブラウザは、文字列の連結をうまく処理することができます。 Array.join IE 11のみ有効

  • 全体ではOperaが最も速く、Array.joinの4倍の速さ

  • Firefoxは2位で Array.join は、FFではわずかに遅いだけですが、Chromeではかなり遅く(3倍)なります。

  • Chromeは3位ですが、文字列の連結はArray.joinより3倍速いです。

  • StringBuilderを作成することは、パフォーマンスにあまり影響を与えないようです。

他の誰かがこれを役に立つと思うことを願っています。

異なるテストケース

RoyTinker が私のテストに欠陥があると考えたので、同じ文字列を連結して大きな文字列を作るのではなく、反復するたびに異なる文字を使う新しいケースを作りました。文字列の連結はまだ速いか、同じくらい速いようでした。では、これらのテストを実行してみましょう。

皆さんも他のテスト方法をどんどん考えてみてください。また、別のテストケースへの新しいリンクも以下に自由に追加してください。

http://jsperf.com/string-concat-without-sringbuilder/7