またプロファイリングを行うツールをプロファイラといいます。インテル社、マイクロソフト社などの製品がよく使われますが、これらの製品は高価なこともあり、個人の開発でプロファイラを使うのは簡単ではありませんでした。しかし、近年登場したVisual Studio Communityは条件があるものの無料で利用できます。Professionalなどの製品版とほぼ同等な機能があり、これにプロファイラも含まれていますので、個人開発でもプロファイラを使う機会が増えてきました。
プロファイリングのための準備
本稿では、Visual Studio Communityを使ったプロファイリングを紹介します。以下のURLからVisual Studio Communityのインストーラをダウンロードし、インストールを行ってください。
#include"stdafx.h"#pragma optimize("", off )structLargeStruct{int a;int b;};LargeStruct aosSrc[10000];LargeStruct aosDst[10000];void copy1(){for(int i =0; i <10000;++i){
aosDst[i].a = aosSrc[i].a;}for(int i =0; i <10000;++i){
aosDst[i].b = aosSrc[i].b;}}void copy2(){for(int i =0; i <10000;++i){
aosDst[i].a = aosSrc[i].a;
aosDst[i].b = aosSrc[i].b;}}void func1(){for(int i =0; i <100;++i){
copy1();
copy2();}}int main(){for(int i =0; i <100;++i){
func1();
copy1();
copy2();}return0;}#pragma optimize("", off )
copy1の実装はarray of structureを飛び飛びにアクセスしているので効率がよくありません。たとえばcopy2の実装でcopy1を置き換えて再度プロファイリングすると、copy1だけ処理が重いのが改善できることが確認できます。なお、ここでは説明は省きますが、興味のある人は参考文献や"array of structure"をキーワードに調べてみてください。
それではプログラムの実行を通して関数が何回呼び出されているかはどのように調べればいいでしょうか。Visual Studio Communityのプロファイラではインストルメンテーション方式を使うことで、呼び出し回数を調べられます。インストルメンテーション方式とは、プロファイラが関数呼び出し毎に記録する方式です。正確な呼び出し回数が分析できますが、オーバーヘッドがCPUサンプリングよりも大きく、もともと処理時間のかかるプログラムの解析にはさらに時間がかかる点は注意が必要です。