目的
値渡しと参照渡しの違いによる処理時間への影響を調べる
経緯
C++開発をする中で処理時間がボトルネックになる処理に遭遇。
処理時間を解決するための方法として、オブジェクトを値渡ししている処理を参照渡しにすることで改善するかどうかを調査したいため。
環境など
Microsoft Windows XP Professional Service Pack 3
Microsoft Visual C++ 2008 Express Edition (MSVC9.0)
C++プロジェクト(WindowsフォームもCLRも使用しない)
処理の概要
- オブジェクトを値渡しするメソッドを実装
- オブジェクトを参照渡しするメソッドを実装
- 上記メソッドを実装したクラスのインスタンスを生成
- 上記メソッドを順次実行し、それぞれの開始時および終了時の時刻を取得
- 3.4.の処理を100回実行し、処理時間の最大値・平均値・最小値を算出
処理の実装に関する事項
- 各メソッドは内部では何もせず、引数としてオブジェクトもしくはオブジェクトへの参照を受け取るだけ
- 時間の計測にはwinmm.libに含まれるQeueryPerformanceCounter()/QueryPerformanceFrequency()を使用する
- winmm.libのリンクは#pragmaで実施する
- プログラムの出力は「出力」ウィンドウにするため、::OutputDebugString()を使用する
- OutputDebugString()のため、windows.hをインクルードする
- 計測結果の出力にはostringstreamクラスを使用するため、<sstream>をインクルードする
ソースコード
添付のTemporaryObjectTest.zipを参照下さい。
計測結果
| 項目 |
値渡し |
参照渡し |
比率 |
| 最大値 |
2186.16 usec |
208.35 usec |
0.095 |
| 平均値 |
537.99 usec |
192.95 usec |
0.359 |
| 最小値 |
458.97 usec |
184.19 usec |
0.401 |
比率は、値渡しに対する参照渡しの処理時間の割合
結果についての考察
- 最大値が大きいのは何故か初回計測時のみ時間が掛かっているため(原因は別途調査する必要がある)
- どの結果を見ても参照渡しの方が処理時間が早い。
結論
上記の結果から、処理時間の改善には値渡しを参照渡しに変更することが有効であることを確認できた。
課題
- 一時オブジェクトが生成される過程を実際に確認していないのでデバッガ等を使って確認する
- 初回のみ時間が掛かる原因についての調査
最終更新:2012年09月24日 15:57