1

ソケットを介して渡すすべてのデータを暗号化する必要があるカジノ ゲームを作成しているので、できるだけ多くのパフォーマンスが必要です。遅れる。

私の質問は、あなたが持っていて、Stringそのキャラクターを高速で取得したい場合、myString.charAt(i)または持っvar a:Array = myString.split('');てからこのように取得したい場合、どちらがパフォーマンス的に速いかですa[i];

私のforサイクルは 60 ~ 100 回以上実行されることがあります。前もって感謝します

4

3 に答える 3

4

コードの実行の前後にgetTimerを使用することで、自分の状況で何がより効果的であるか、そしてそれがまったく重要かどうかを確認するために、いつでも自分自身をテストできます。

var testTime:int;
var before:int = getTimer();

//You code here

testTime = getTimer() - before;
trace(testTime);

したがって、基本的には、2つのアルゴリズムを入力し、実行にかかる時間を確認します。

編集:Apocalyptic0n3は当然正しいです。フリーズした場合の方が正確であるため、getTimer()の代わりにnew Date.time()を使用することをお勧めします。

于 2012-11-19T17:31:31.857 に答える
2

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 チームは、文字列操作や連結などの最適化に多くの時間を費やしました。

于 2012-11-19T21:35:22.707 に答える
1

OK、これはコメントするには多すぎます。

まず第一に、何をしようとしているのか、なぜこれらのことを比較する必要があるのか​​ を伝えるのは難しいですが、すでに述べたように. シリアライゼーションを検討している場合は、組み込みのシリアライゼーションの使用方法を学んでください。誰かが車輪を再発明したときにそれが何度も起こるのを見てきましたが、それはあらゆる点で桁違いに悪く、次に組み込みのものでした。これを行う唯一の言い訳は、物事がどのように機能するかを学んでいる場合です。

もちろん、何十万ものファイルを処理することを計画している場合は、C で記述し、AIR などでネイティブ拡張を使用することができます。これは間違いなく成功するでしょう。

さて、文字列データを処理する最速の方法について疑問に思っているなら、それは私たちの選択ではありません. 最も速いのは、ドメインのメモリにロードし、いわゆる「Alchemy オペコード」を使用してデータのバイトにアクセスすることです。これは、文字列が 8 ビット エンコーディングを使用している場合は非常に高速ですが、Unicode を使用している場合はそれほど高速ではありません。明らかに、以前に提案したものをテストする場合、これはテストにも影響します。

2 番目に良いオプション: 文字コードである整数で構成されるベクトル。これらはより最適化されており、異なるメモリ割り当てモデルを使用しています。

ByteArray3番目に速いのはまたはかもしれませんBitmapData

しかし、シリアライゼーションでばかげたことをしている場合、これはまったく重要ではありません。そして、それを適切に行うには、優れた戦略が本当に必要です。情報理論を適切なレベルで理解して、データを圧縮するこの方法または他の方法がどのようにサイズを縮小するか、実装がより簡単または高速になるかなどを予測する必要があります。の上。この分野では、よく知られた悪い決断の良い例がたくさんあります。Base64 エンコーディング、XML および JSON 形式は、よく考えられていない設計の例です。

Flash に関して言えば、選択肢は明白です。あらゆる点で、AMF は、テーブルにあるどのオプションよりも優れています。自分がやっていることについて非常に高度な理解を持ち、自分自身をロールバックし、それをより良くする必要があります.

PS。もう 1 つ注意: charAt-で追加の割り当てを行いたくない場合は、 substrorを使用できますsubstring。これらは再割り当てを引き起こさないためですが、減算された文字列が存続するまでソース文字列の割り当てが解除されるのを防ぎます。

于 2012-11-19T22:27:50.303 に答える