先日使った VC のプロファイラがうまく動作しなくなった?
動作としては開始するが,結果が取れない.
「CPU 使用率」で,実行中のグラフは表示されている.
実行終了後,下の部分の関数名などが表示される所のデータがうまく生成されない?
次の様にやってもうまくいかない.
MSDN クイック スタート: Visual Studio の CPU 使用率データの分析 (C++)
「手順 2: CPU 使用率データの分析」のデータが取れない.
設定なども確認したが,特に影響しそうな所はわからない.
PC を再起動してもダメ.
何で?
ここに入っている VS 2008 は Team System なので,プロファイラが何とか動くみたい.
結果が表示されるまで時間がかかるのと,ボトルネックを見つけるのに使い勝手があまり良くなさそう.
もう少しあたりを付けて,単体テスト用のコードを書いて調べた方が効率が良さそう.
VC 2008 でやってみた.
VC 2015 などと比べると,生成までの時間がかかる.その後の操作も面倒.
更に出来上がっていた vsp が,193 GB .
先ず簡単に変更できるコード.
template <class V3> long V3_Search (const std::vector<V3>& pnts,const V3& pos) { for (size_t index=0 ; index<pnts.size() ; index++) { V3 pnt = pnts[index] ; if (pnt == pos) { return long(index) ; } } return -1 ; }
pnt の変数を使わず,直接比較するコードに.VC 6 でビルドして実行.
最近のコンパイラはうまく最適化してくれるので,VC 8 などでは効果がなかった(最初から速い).
ここでの検索で一致するデータは,比較的後ろの方に存在することが多いので,後ろから検索する様に変更.
// for (size_t index=0 ; index<pnts.size() ; index++)
for (long index=long(pnts.size())-1 ; index>=0 ; index--)
2021/04/12
更にコードを変更.
この関数は,呼び元との多重ループとなることがあるのと,検索して見つからないことも多いので,検索最大数を指定可能に.
template <class V3> long V3_Search_ (const std::vector<V3>& pnts,const V3& pos,const size_t max=-1) { size_t count = 0 ; for (long index=long(pnts.size())-1 ; index>=0 && count<max ; index-- , count++) { if (pnts[index] == pos) { return long(index) ; } } return -1 ; }
最大数を 1000 として,処理速度の許容範囲にはなった.
出来上がったデータとして問題ないかの検証はこれから.
検索して一致するデータは,最後と最初に存在することが多いので,その判断部分を変更.
template <class V3> long V3_Search_ (const std::vector<V3>& pnts,const V3& pos,const size_t max=-1) { for (size_t index=0 ; index<pnts.size() /*&& index<max*/ ; index++) { if (pnts[index] == pos) { return long(index) ; } size_t index_l = pnts.size()-index-1 ; if (index>=index_l) { break ; } if (pnts[index_l] == pos) { return long(index_l) ; } } return -1 ; }
20% 程度の効果.但し VC 8 でビルドしたものは遅くなってしまった.
2021/04/14
やはり,頂点などの検索のループで最大数を指定すると,得られる結果が異なる.
そのため,最大数を指定するのは限定的とする.今回は STL 読込み で 10000 に.