2016-08-04 11 views
-1

enter image description here最適化 - のstd ::ベクトル演算

私はこのfuncition(RotateSlownessTop)を持っており、それが対応する値を計算し、約800回と呼ばれています。しかし、計算が遅く、計算を高速化できる方法があります。

Xにおける要素の数/ Yは、7202(かなり大きいセット)である

Iは、パフォーマンス分析を行なったし、スクリーンショットは、添付されています。

void RotateSlownessTop(vector <double> &XR1, vector <double> &YR1, float theta = 0.0) 
{ 
Matrix2d a; 

a(0,0) = cos(theta); 
a(0,1) = -sin(theta); 
a(1, 0) = sin(theta); 
a(1, 1) = cos(theta); 

vector <double> XR2(7202), YR2(7202); 

for (size_t i = 0; i < X.size(); ++i) 
{ 
    XR2[i] = (a(0, 0)*X[i] + a(0, 1)*Y[i]); 
    YR2[i] = (a(1, 0)*X[i] + a(1, 1)*Y[i]); 
} 
size_t i = 0; 
size_t j = 0; 

while (i < YR2.size()) 
{ 
    if (i > 0) 
     if ((XR2[i]>0) && (XR2[i-1]<0)) 
      j = i; 

    if (YR2[i] > (-1e-10) && YR2[i]<0.0)   
     YR2[i] = 0.0; 

    if (YR2[i] < (1e-10) && YR2[i]>0.0) 
     YR2[i] = -YR2[i];      

    if (YR2[i]<0.0) 
    { 
     YR2.erase(YR2.begin() + i); 
     XR2.erase(XR2.begin() + i); 
     --i; 
    } 
    ++i; 
} 
size_t k = 0; 
while (j < YR2.size()) 
{ 
    YR1[k] = (YR2[j]); 
    XR1[k] = (XR2[j]); 
    YR2.erase(YR2.begin() + j); 
    XR2.erase(XR2.begin() + j); 
    ++k; 
} 
size_t l = 0; 
for (; k < XR1.size(); ++k) 
{ 
    XR1[k] = XR2[l]; 
    YR1[k] = YR2[l]; 
    l++; 
} 
} 

EDIT1:私は、これははるかに高速であることをどこかで読ん以来、[]演算子ですべて一back()を置き換えることにより、コードを更新しました。 しかし、プログラム全体はまだ遅いです。どんな提案も感謝しています。

+0

'vector :: reserve'が役立ちます。 – Jarod42

+0

デバッグビルドまたはリリース(最適化ビルド)を実行していますか?デバッグビルドの場合、結果は無意味です。使用したコンパイラの最適化設定を投稿してください。デバッグビルドはSTLコンテナクラスのイテレータチェックのトンに置かれるので、これは特にVisual Studioの場合です。 – PaulMcKenzie

+0

@PaulMcKenzie私はリリース中です。設定は次のとおりです。 最適化:光ファイバを有効にしません(/ Oyオプション) :デフォルト 組み込み関数を有効にします:はい(/大井) 好意サイズやスピード:どちら 省略のフレームポインタの速度(/ O2) 関数のインライン展開を最大化安全な最適化:いいえ 全体プログラムの最適化:はい(/ GL) –

答えて

2

サイズが大きい場合は、必要な領域を事前に割り当てて、push_backを改善できます。これをループの前に追加してください:

XR2.reserve(X.size()); 
YR2.reserve(X.size()); 
+0

私はpush_back()をoperator []に置き換えました。これは、それ自体がボトルネックになる可能性があります(そして、あなたが見ている問題を引き起こしている 'erase ' ]、私はどこかで読むのが速かったので、まだ遅いです。 –

関連する問題