2

次のC#コードを最適化しようとしています。このコードは、バイトをしきい値に設定する0x000xFF、しきい値に基づいて設定します。

for (int i = 0; i < veryLargeNumber; i++)
{
    data[i] = (byte)(data[i] < threshold ? 0 : 255);
}

Visual Studioのパフォーマンスプロファイラーは、上記のコードがかなり高価であり、計算に8秒近くかかることを示しています。これは私の総処理費用の98%です。私は1000を少し下回るアイテムを処理しているので、合計で2時間以上になります。

問題は、分岐を引き起こすので、三元条件演算子に関係していると思います。CPUキャッシュに対応しているので、ある種の純粋な数学演算は大幅に高速になると思います。

これを最適化する方法はありますか?それが助けになるなら、私がしきい値を修正することは可能です。パフォーマンスが7%を超えると、合計処理時間が10分短縮されるため、勝利が増えると思います。

4

3 に答える 3

3

.NET 4.0 Frameworkを使用している場合は、次のリンクでParallelLibraryを利用できます。

http://msdn.microsoft.com/en-us/library/dd460717

あなたの場合、しきい値を確認する必要がありますが、とにかく時間がかかります。したがって、スレッドまたはラムダ式を利用してください

于 2012-06-08T09:15:48.330 に答える
1

ただ提案するために、並列アプローチと一緒に、より高速であるため、この目的のためにビット演算子を使用してください。

0x00 = 0000 0000 
0xFF = 1111 1111

オペレーターで試してくださいOR(つまり0 | 1 = 1、オペレーター|の略ですOR

編集:

これは、どの数字が大きいかを比較する方法です。a,b数字にしましょう。

int temp= a ^ b;
temp|= temp>> 1;
temp|= temp>> 2;
temp|= temp>> 4;
temp|= temp>> 8;
temp|= temp>> 16;

temp&= ~(temp>> 1) | 0x80000000;
temp&= (a ^ 0x80000000) & (b ^ 0x7fffffff);
于 2012-06-08T09:19:52.163 に答える
0

ビット単位の解決策が必要な場合-

int intSize = sizeof(int) * 8 - 1;
byte t = (byte)(threshold - 1);
for (....)
{
    data[i] = (byte)(255 + 1 ^ ((t - data[i]) >> intSize));
}  

注:0のコーナーケースでは機能しません。申し訳ありませんが、

また、byteの代わりにint配列を使用してみて、より高速かどうかを確認してください

于 2012-06-08T10:10:40.247 に答える