2016-04-20 37 views
1

私はいくつかのアルゴリズムを実装している計算集中的なC#プロジェクトに取り組んでいます。問題は、アプリケーションのプロファイルを作成するときに、特定のアルゴリズムに要する時間が異なることです。たとえば、アルゴリズムを100回実行すると約1100ミリ秒かかり、別の時間が100回実行されると、2000または3000ミリ秒のような時間がかかります。同じ実行であっても変更される可能性があります。したがって、コードを最適化すると、改善を測定することは不可能です。それだけでは信頼できません。ここでプロファイリングのCPU親和性を設定する

enter image description here

別の実行です:

enter image description here

だから基本的に私は1つのCPUが私のアプリに専用されていることを確認します。 PCには、古いデュアルコアインテルE5300 CPUがWindows 7 32ビットで動作しています。だから私はプロセスの親和性を設定し、永遠に一つのコアを忘れることはできません。それは、コンピュータを毎日の作業のために非常に遅くする。私が望むときに特定のコアを使用するためには他のアプリが必要です。プロファイリングを終えたら、CPUの親和性は正常に戻ります。タスクを実行するバットファイルを持つことは素晴らしい解決策になります。

私の質問は次のとおりです。Windows 7上のすべてのプロセスに対してプロセスアフィニティを設定するためのバットファイルがありますか?

PS:アルゴリズムは正しく、毎回同じコードパスを実行します。私はいくつかのオブジェクトプールを作成したので、最初の実行後にゼロメモリが割り当てられます。私はdottraceでメモリ割り当てをプロファイリングし、最初の実行後に割り当てを示さなかった。だから私はアルゴリズムが動作しているときにGCがトリガーされたとは思わない。物理メモリが使用可能で、システムのRAMが不足していません。

結果: Chris Beckeの回答は、仕事を行い、プロセスの親和性を正確に設定します。 Visual Studioやdottraceのようなバックグラウンドアプリを実行しているときに、結果がより均一になりました。分岐実行時間をさらに調べると、予測不可能なルートはCPU過熱であることが明らかになりました。温度が100℃を超えている間、CPU過熱アラームがオフになっていました。そのため、故障したファンを修理した後、結果は完全に均一になりました。

+0

ベンチマークは医師には絶対にしないでください。プロダクションでは決して再現できない楽観的な結果が得られます。計算コードで* double *を使用し、32ビット・モードで実行すると3つの異なるタイミングが得られます。ワーストケースは、ベストケースよりも脂肪が3倍遅い。それのような匂いが起こっているのです。 64ビットモードで実行できるように、ジッタ強制を削除します。 [プロジェクト]> [プロパティ]> [ビルド]タブ> [プラットフォームターゲット= AnyCpu]および[32ビット]を選択します。 –

+0

@HansPassant私はプロジェクトの設定をチェックしましたが、それはAny CPU上にあり、32bitの方が優先されていません。私はベンチマークを徹底的に分析しないというあなたの点を理解しています。私が直面している問題は、同じコード実行時間が同じ実行中のセッションでも大きく異なることです。スクリーンショットでは、呼び出しごとに実行時間が異なることがあり、時にはほぼ同じであることが示されています。私は人工的な利益を達成しようとはしていません。私は、信頼性と再現性の高い環境が必要なので、メソッドを最適化しようとするたびに、コードが速くなったり遅くなったりしているかどうかが分かります。 –

+0

さて、あなたは32ビットOSを持っているようですので、これらの設定は何の違いもありません。あなたが64ビットOSを手に入れることができず、次に進むなら、それはもっときれいにならないでしょう。中央値を取り、それを1日と呼んでください。 –

答えて

2

SetProcessAffinityMaskを意味しますか?

タグ付きウィンドウはC#ですので、私はSystem.Diagnostics.Processオブジェクトには同じ機能を実行するThreadAffinityのメンバーがあることがわかります。

これは、CPU時間を予想どおりに安定させるかどうか確信していません。 IOをしていない単一のビジーなタスクは、別のスレッドが割り込みしない限り同じコアでスケジュールされたままにしておく必要があるので、あなたの可変時間はOSよりランダムに他のスレッド/コア - あなたの好みのコアを除外するためにシステム内の他のすべてのスレッドとの親和性を設定しない限り、私はこの助けを見ることができません。

+0

実際に私はアプリケーションのパフォーマンスに影響を与えないように他のプロセスの親和性を設定する方法を求めています。私は多少誤解を招くので、C#タグを削除しました。申し訳ありません。 –

+1

さて、SetProcessAffinityMaskは、あなたが望むことをします。 'EnumProcesses'は配列にプロセスIDを設定し、' OpenProcess'はそれらを 'SetProcessAffinityMask'に必要なハンドルに変換します。おそらく、特定のシステムプロセスを開く際にいくつかのアクセス権の問題があります。後ですべてを戻すことを忘れないでください。 –

+0

これはプロダクションコードではないので、 'SetThreadPriority'によってスレッド優先度を上げるほうが良い結果が得られるかもしれません。 –

関連する問題