(十分最近の) JavaScript では、TextEncoder
クラスのオブジェクトを用いて、文字列を UTF-8 のバイト列に変換できる。
この変換を行う際は、クラスの静的メソッドではなく、オブジェクトを用いる。
このオブジェクトは、最初に1個生成してそれを何度も使うこともできるし、変換のたびに生成することもできる。
しかし、オブジェクトを変換のたびに生成していたら、効率が悪いのではないか?
というわけで、JSBench.me で実験をしてみた。
テストコード
reuse or recreate TextEncoder (version 1) - JavaScript benchmark at JSBench.me
Setup JavaScript
使いまわし用の TextEncoder
を生成する。
また、入力用の文字列も用意しておく。
const encoder = new TextEncoder();
const input = "こんにちはworld";
Test Case: reuse
生成しておいた TextEncoder
のインスタンスを使用して、エンコードを行う。
encoder.encode(input);
Test Case: recreate
TextEncoder
のインスタンスを生成して、エンコードを行う。
new TextEncoder().encode(input);
実験結果
筆者の環境で1回実行した結果、以下の結果が得られた。
ブラウザ | 使いまわし | 毎回生成 |
---|---|---|
Firefox 142.0.1 |
2492万 ops/s ± 0.47% Fastest |
921万 ops/s ± 5.67% 63.05 % slower |
Google Chrome 140.0.7339.128 |
72万 ops/s ± 1.55% Fastest |
54万 ops/s ± 1.43% 25.6 % slower |
結論
Firefox・Google Chrome ともに、TextEncoder
のインスタンスを毎回生成したほうが効率が悪いという結果になった。
- とにかく効率を重視したい
- 変数に入れて短い表現で呼び出したい
などの場合は、最初にインスタンスを生成し、使い回すのがいいだろう。
一方、
- 効率はあまり重視しない (変換の頻度が低いなど)
- 変数を作りたくない
などの場合は、毎回インスタンスを生成してもいいだろう。