benbjo のアドバイスは確かなものです。パフォーマンスが本当に問題である場合、最適なテスト ケースは、実際にコードを使用する状況です。特に、ガベージ コレクションと JIT'er によって実際のパフォーマンスが予測不能になるためです。
とは言っても、charAt
一般的にこのアプローチはsplit()
. メモリに関しては、大きな違いはないはずです。どちらのアプローチも、文字ごとに新しい文字列を作成しています。それに加えて、split()
明らかに追加の配列も作成します。
これら 2 つの方法の比較:
文字:
var s:String = "";
for (var j:int = 0; j < len; j++)
{
// The string concat seems to be enough to confuse the JIT compiler.
s += v.charAt(j);
}
スプリット:
var s:String = "";
var arr:Array = v.split("");
for (var j:int = 0; j < len; j++)
{
// The string concat seems to be enough to confuse the JIT compiler.
// Using just arr[j] seems to be unfairly optimized.
s += arr[j];
}
関連するコンパイル済み ABC バイト コードは、split の呼び出しと、配列アクセスと呼び出しを除いて、2 つの間でほぼ同じですcharAt()
。言い換えれば、ASC コンパイラーによるおかしな最適化スタントはありません (とにかくまれです)。
10 回の実行、上記のコードのそれぞれ 1000 回の反復、リリース プレーヤーでのリリース ビルド:
FP WIN 11,5,502,110 : #Runs #Iter Avg Min Max Iter
charAt :: string length: 50 : 10 1000 9.0 ms 6 ms 10 ms 0.0090 ms
split :: string length: 50 : 10 1000 13.0 ms 8 ms 19 ms 0.0130 ms
charAt :: string length: 500 : 10 1000 68.5 ms 58 ms 97 ms 0.0685 ms
split :: string length: 500 : 10 1000 100.5 ms 86 ms 136 ms 0.1005 ms
charAt :: string length: 1000 : 10 1000 149.3 ms 119 ms 202 ms 0.1493 ms
split :: string length: 1000 : 10 1000 201.2 ms 162 ms 261 ms 0.2012 ms
charAt :: string length: 2000 : 10 1000 283.8 ms 230 ms 378 ms 0.2838 ms
split :: string length: 2000 : 10 1000 326.9 ms 307 ms 423 ms 0.3269 ms
charAt :: string length: 4000 : 10 1000 575.8 ms 475 ms 752 ms 0.5758 ms
split :: string length: 4000 : 10 1000 665.0 ms 609 ms 888 ms 0.6650 ms
charAt :: string length: 5000 : 10 1000 650.9 ms 581 ms 915 ms 0.6509 ms
split :: string length: 5000 : 10 1000 863.4 ms 769 ms 1219 ms 0.8634 ms
charAt :: string length: 10000: 10 1000 1300.5 ms 1155 ms 1707 ms 1.3005 ms
split :: string length: 10000: 10 1000 1797.3 ms 1534 ms 2461 ms 1.7973 ms
Avg = 各実行の平均時間 (1000 回の反復)
Min = 1 回の実行の最小時間
最大 = 1 回の実行の最大時間
Iter = 1 回の反復の平均時間。
実行間の差異はかなり大きく、実行中にガベージ コレクションが発生する可能性があります。しかし、結果は一貫してcharAt()
. split()
各反復で呼び出しをやり直すのではなく、各実行の前に呼び出しを行っても、大きな違いはありません。つまり、パフォーマンスの違いは、配列へのアクセスが呼び出しよりも遅いことにありcharAt()
ます。ただし、たとえば、文字列の検索に正規表現の代わりに使用することで得られる大きな違いはありません。indexOf
一般に、これは厳格なルールではありませんが、文字列操作などの単純なタスクに対する最も明白なアプローチは、より高速な方法である可能性があります。FlashPlayer チームは、文字列操作や連結などの最適化に多くの時間を費やしました。