1

特定の文字を探して Web から受信したテキストのチャンクを頻繁に読み取り、それに応じてデータを解析するプログラムを作成しています。私はC++にかなり熟練しており、うまく機能していますが、アセンブリは

for(size_t len = 0;len != tstring.length();len++) {
    if(tstring[len] == ',')
        stuff();
}

cmp と jz/jnz を使用したインライン アセンブリ ルーチンは高速ですか? 私はそれを使用したと言うことができるという事実のためにasmで作業する時間を無駄にしたくありませんが、真の速度の目的のために.

ありがとうございました、

4

4 に答える 4

3

とんでもない。あなたのループは非常に単純なので、オプティマイザがコードについて推論する能力を失うことのコストは、得られるパフォーマンスよりもはるかに高くなりますこれは SSE 組み込み関数やブートローダーではなく、単純なループです。

于 2012-07-20T00:36:15.327 に答える
1

文字を 1 つずつ確認するのは、最速の方法ではありません。多分あなたはこのようなことを試して、それがより速いかどうかを調べる必要があります.

string s("xxx,xxxxx,x,xxxx");
string::size_type pos = s.find(',');  
while(pos != string::npos){
    do_stuff(pos);
    pos = s.find(',', pos+1);       
}

ループを繰り返すたびに、「,」文字の次の位置が得られるため、プログラムがジョブを完了するのに数回のループしか必要ありません。

于 2012-07-20T02:22:11.757 に答える
1

"plain old" jz/を使用したインライン アセンブリ ルーチンjnzは、持っているものよりも高速になる可能性は低いです。とはいえ、コードにはいくつかの非効率性があります。

  • tstring.length()ループの反復ごとに 1 回取得しています。それは不要です。
  • ランダムなインデックス作成をtstring[len]使用しています。これは、前方反復子を使用するよりも高価な操作になる可能性があります。
  • stuff()ループ中に呼び出しています。それが正確に何をするかに応じて、最初にループに文字列内の場所のリストを作成させる方が速い場合があります(スキャンされた文字列とスキャンコードがキャッシュホットのままになり、何をしても追い出されないようstuff()に)、その後、それらの結果を反復処理します。

strchr()まさにその種のスキャンに使用できる、おそらく低レベルの最適化された標準ライブラリ関数が既に存在します。C++ STLstd::string::find()も目的のために最適化されている可能性があります (および/または特殊化で使用strchr()される可能性があります)。char

特に、strchr()SSE2 ( pcmpeqbmaskmov...およびを使用bsf) または SSE4.2 (文字列 op を使用pcmpistri) 実装があります。これを行う例/実際の SSE コードについては、たとえばstrchr()GNU libc (Linux で使用) を確認してください。こちらの参照とコメントも参照してください(適切な名前の Web サイト ...)。

私のアドバイス:ライブラリの実装/ドキュメント、および/またはプログラム用に実際に生成されたアセンブリコードを確認してください。すでに高速コードを使用している可能性があります...または、手作業で作成した文字ごとの単純な検索からstd::string::find()orを使用するだけに切り替えると、そうなるでしょうstrchr()
これが非常に速度が重要な場合、既知/テスト済みの実装 (監視ライセンス) で使用されるようにアセンブリ コードをインライン化strchr()すると、関数呼び出しがなくなり、数サイクルが得られます。要件によって異なります...コード、ベンチマーク、変更、再度ベンチマーク...

于 2012-07-20T11:54:53.323 に答える
0

cmp と jz/jnz を使用したインライン アセンブリ ルーチンは高速ですか?

多分そうでないかもしれません。それはstuff()、何をするか、の型と範囲はtstring何か、アセンブリがどのように見えるかによって異なります。

まず、保守可能な C++ コードの速度を測定します。このループがプログラムの速度を支配する場合にのみ、書き直しを検討する必要があります。

書き直すことを選択した場合は、両方の実装を利用可能な状態に保ち、それらを比較して測定します。より高速で、速度の向上が重要な場合は、保守性の低いバージョンのみを使用してください。また、元のバージョンが整っているので、将来の読者は、asmをよく知らなくても、あなたの意図を理解することができます.

于 2012-07-20T00:23:31.843 に答える