私は画像処理を行うポータブルCライブラリを開発してきました。Cでテストパフォーマンスの最適化をどのようにユニット化できますか?
私はGCCの自動ベクトル化(ターゲットプロセッサに応じてSSEまたはAVX)モードを利用するために、いくつかの低レベル関数にかなりの時間を費やしていますが、やはり移植性の高いCコード使用:restrict
および__builtin_assume_aligned
)。
Windows上でコードをテストする時間です(MSVCコンパイラ)。しかし、その前に、GCCの自動ベクトル化コードをそのまま保存するために、自分の足を踏み外したり、慎重に選択したすべての指示を緩和したりしないように、何らかのユニットテストをセットアップしたいと思います。
私は単純に#ifdef/#endif
の全身機能を使うことができましたが、どの回帰のコンパイラアップデートでも検出するより長期的な解決策を考えています。
私は単体テストにかなり自信があります(そこにはたくさんの良いフレームワークがあります)が、私はそのような低レベルの機能の単体テストには自信がありません。ジェンキンなどのCIサービスでパフォーマンスユニットテストをどのように統合するのですか?
PS:私は、例えば、特定のプロセッサに基づいてハードコーディングされたタイミング結果を保存しないようにしたい:私はあなただったら、あなたはMSVCを使用するには、いくつかの良い理由を持っていると仮定すると
// start timer:
gettimeofday(&t1, NULL);
// call optimized function:
...
// stop timer:
gettimeofday(&t2, NULL);
// hard code some magic number:
if(t2.tv_sec - t1.tv_sec > 42) return EXIT_FAILURE;
最適化されていない(汎用)関数がありますか?実行時間を比較すると良いでしょう... 't_opt'は' t_non_opt'よりも小さいと予想されますが、それでも100%の保証はありません。他のプロセスがランダムにディスクにアクセスすると、あなたのテストはいつでもプリエンプションになる可能性があります。あなたのテストでは他のことが起こるかもしれません... – zaufi
あなたは何を目指していますか?コードを修正した後、コードが正しく(ユニットテストを行う)、結果コードのパフォーマンスを確認したいのですか(何か違っていて、さまざまな方法でアプローチされる可能性がありますか?)後者の場合は、生成されたアセンブリコードを出力して期待と比較することもできます。 –
@DirkHerrmannそれは全体のポイントです! 「ポータブル」アセンブリコードを印刷するにはどうすればよいですか?これは正確なgccのバージョンに依存するかもしれません。 – malat