特に文字列が十分に大きい場合、split() の使用は他の方法に比べて遅くなります。
以下のテストは、Haxe 2.10 でコンパイルされた Neko ターゲット用のコンピューターで実行されます。最初に 6 文字の文字列 ("abcdef") をテストしてみましょう。
分割/結合を使用した実装 Aには約 (0.030ms) かかります。
var s = "abcdef";
var a = s.split('');
a.reverse();
s = a.join('');
// s contains "fedcba"
実装 Bは、ソリューション A (0.032 ミリ秒) よりも遅くない場合でも、ほぼ同じくらい遅く実行されます。
var s = "abcdef";
var s2 = "";
for (i in -s.length+1...1)
s2 += s.charAt(-i);
// s2 contains "fedcba"
実装 Cは実装 A (0.006ms) よりも 5 倍高速です。
import StringBuf;
using StringTools;
var s = "abcdef";
var s2 = new StringBuf();
for (i in -s.length+1...1)
s2.add(s.charAt(-i));
// s2.toString() contains "fedcba"
実装 Dが最も速く、実装 A (0.002ms) よりも約 16 倍高速です。
import StringBuf;
using StringTools;
var s = "abcdef";
var s2 = new StringBuf();
for (i in -s.length+1...1)
s2.addChar(s.fastCodeAt(-i));
// s2.toString() contains "fedcba"
// if introducing var s3 = s2.toString() it then takes from 0.003 to 0.004ms total
// so this still seems the fastest on Neko.
Neko の測定値は 6 文字の文字列で要約されます(500,000 回の反復から計算され、それに応じて分割されます)。
- A: 0.030ms
- B: 0.032ms (最悪)
- C: 0.006ms (Aの5倍速)
- D: 0.002ms (最高、A の 16 倍の速さ)
250 文字の文字列の測定値(500,000 回の反復から計算され、それに応じて分割されます):
- A: 0.996ms
- B: 1.326ms (それでも最悪)
- C: 0.166ms (A の 6 倍の速さ)
- D: 0.044ms (ベスト、A の 22 倍の速さ)
結果は、文字列のサイズが大きくなるにつれて、実装 A が D に比べてますます遅くなることを示唆しています (つまり、その複雑度関数 O(n) は悪化しています)。
これらの理由から、実装 Dをお勧めします。