2016-07-27 7 views
1

私はopencv 3.1を使用し、Visual Studio 2015アップデート3でWindows 10でintel TBBを有効にします。最初のトランスポーズ時間は100 msが必要で、もう一方のトランスポーズは0.02-0.05 ms必要です。最初のトランスポーズがなぜ1 * 1マトリックスのために多くの時間を必要とするのかを知っています。私はTBBが有効になっていませんが、問題は、パフォーマンスを測定している方法と思わopencv transpose first time long timeが必要です

double ts = time_measure("start", 0); 
Mat_<uchar> A = (Mat_<uchar>(1, 1) << 1); 
Mat at = A.t(); 
cout << "transpose Times needed : " << time_measure("end", ts) * 1000 << " ms " << endl; 

for (int i = 0; i < 10; i++) { 
    ts = time_measure("start", 0); 
    Mat_<uchar> B = (Mat_<uchar>(1, 1) << 1); 
    Mat bt = B.t(); 
    cout << "transpose Times needed : " << time_measure("end", ts) * 1000 << " ms " << endl; 
} 


double time_measure(const string mode, double ts) { 
    double t = 0.0; 
    if (mode == "start") { 
     t = (double)getTickCount(); 
    } 
    else { 
     t = ((double)getTickCount() - ts)/getTickFrequency(); 
    } 
    return t; 
} 

The output 

transpose A Times needed : 112.062 mstranspose B Times needed : 0.0337221 ms 
transpose B Times needed : 0.0205265 ms 
transpose B Times needed : 0.0195491 ms 
transpose B Times needed : 0.0283461 ms 
transpose B Times needed : 0.0234589 ms 
transpose B Times needed : 0.0298123 ms 
transpose B Times needed : 0.0249251 ms 
transpose B Times needed : 0.0283461 ms 
transpose B Times needed : 0.0273687 ms 
transpose B Times needed : 0.02688 ms 

答えて

1

  1. は行列
  2. 使用aを作成するための時間は含まれません。行列は十分に大きい。とにかく1x1行列を転置するのは意味がありません。
  3. あなたはこのような何かを試みることができるブール

のための文字列を使用していない、そして私はあなたの実行時間を教えてください:あなたのコメントについて

double time_measure(bool start, double ts) { 
    double t = 0.0; 
    if (start) { 
     t = (double)getTickCount(); 
    } 
    else { 
     t = ((double)getTickCount() - ts)/getTickFrequency(); 
    } 
    return t; 
} 

int main() 
{ 
    for (int i = 0; i < 10; i++) { 

     // 1000 x 1000 random matrix 
     Mat_<uchar> B(1000, 1000); 
     randu(B, 0, 256); 

     double ts = time_measure(true, 0); 
     Mat bt = B.t(); 
     cout << "transpose Times needed : " << time_measure(false, ts) * 1000 << " ms " << endl; 
    } 

    getchar(); 
    return 0; 
} 
0

感謝。あなたのコードを試してみましたが、マトリックスの作成時間は固定されていて、最初のトランスポーズ時間も他のトランスコードよりも時間がかかります。テスト結果は以下の通りです。私は行列の作成時間と時間を印刷するコードを変更します。

int _tmain(int argc, _TCHAR* argv[]) { 
    for (int i = 0; i < 10; i++) { 
     double ts = time_measure(true, 0); 
     // 1000 x 1000 random matrix 
     Mat_<uchar> B(1000, 1000); 
     randu(B, 0, 256); 
     cout << "create matrix Times needed : " << time_measure(false, ts) * 1000 << " ms " << endl; 

     ts = time_measure(true, 0); 
     Mat bt = B.t(); 
     cout << "transpose Times needed : " << time_measure(false, ts) * 1000 << " ms " << endl; 
    } 
} 

double time_measure(bool start, double ts) { 
double t = 0.0; 
if (start) { 
    t = (double)getTickCount(); 
} 
else { 
    t = ((double)getTickCount() - ts)/getTickFrequency(); 
} 
return t; 
} 

出力に含まには、以下のリストです:

create matrix Times needed : 49.3267 ms 
transpose Times needed : 427.299 ms 
create matrix Times needed : 51.8431 ms 
transpose Times needed : 0.889971 ms 
create matrix Times needed : 51.8084 ms 
transpose Times needed : 0.718917 ms 
create matrix Times needed : 52.4946 ms 
transpose Times needed : 0.742376 ms 
create matrix Times needed : 45.5454 ms 
transpose Times needed : 0.705721 ms 
create matrix Times needed : 45.218 ms 
transpose Times needed : 0.70621 ms 
create matrix Times needed : 44.5748 ms 
transpose Times needed : 0.713541 ms 
create matrix Times needed : 46.2501 ms 
transpose Times needed : 0.68715 ms 
create matrix Times needed : 45.153 ms 
transpose Times needed : 0.663691 ms 
create matrix Times needed : 44.1892 ms 
transpose Times needed : 0.584028 ms 
+0

起こって奇妙な何かが、マトリックスの作成が40以上のミリ秒かかり方法来る、あり? – cxyzs7

+0

時間はrand関数に最も費やされます。 –

+0

私は自分のコンピュータで試してみましたが、作成と転置の両方が〜1.2msかかります – cxyzs7