57055


繰り返し処理の各処理におけるパフォーマンスの中央値を求めるプログラムを書いています。  
繰り返し処理は、行列の足し算で各要素を足す処理を指しています。  
以下のコードを組み合わせて、現在のプログラムを書きました。  
[繰り返し処理（行列の足し算）の参考コード](https://teratail.com/questions/202370)  
[中央値を求める参考コード](http://y-okamoto-psy1949.la.coocan.jp/VCpp/IntroStat/median/)

**解決したいこと**  
現在のプログラムをコンパイルするとエラーが表示されるのですが、エラー文を読んでもどのように修正すれば中央値を求めることができるのかわからず困っています。

**実行結果**

[code]

    $ g++ -o simple simple.cpp
    simple.cpp:29:24: error: implicit instantiation of undefined template
          'std::__1::vector<double, std::__1::allocator<double> >'
        std::vector<double>timedata;
                           ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iosfwd:200:28: note: 
          template is declared here
    class _LIBCPP_TEMPLATE_VIS vector;
                               ^
    1 error generated.
    
[/code]

**実行プログラム**

[code]

    #include <chrono>
    #include <iostream>
    #include <thread>
    
    //繰り返し処理全体にかかった時間
    using namespace std::chrono;
    
    int main()
    {
        #define N 2
    
        double A[N][N] = {
            {3.0, 5.0},
            {9.0, 5.0}
        };
    
        double B[N][N] = {
            {3.0, 6.0},
            {8.0, 9.0}
        };
    
        double C[N][N] = {
            {0.0, 0.0},
            {0.0, 0.0}
        };
        int i, j, k, n;
    
        //各足し算にかかった時間を行列に入れていく
        std::vector<double>timedata;
    
        for(i=0; i<N; i++)
            for(j=0; j<N; j++)
                    C[i][j] += A[i][j]+B[i][j];
                    timedata.push_back(time);
    
        //繰り返し処理全体にかかった時間の計測終了
        high_resolution_clock::time_point end = high_resolution_clock::now();
    
        //行列をソート
        timedata = sort(timedata);
    
        n = sizeof(timedata);
    
        //中央値を求める
        double med;
        if ((n % 2) == 0) {
          med = (timedata[(n / 2) - 1] + timedata[n / 2]) / 2.0;
        }
        else {
          med = timedata[n / 2];
        }
    
        return med;
    
    }
    
[/code]


CC BY-SA 4.0
2019-07-31T02:30:09.440
57054
2019-07-31T07:49:31.773
2019-07-31T06:35:21.207
4236
question
c++
vectorに関するコンパイルエラー


`std::vector`を使うためには`#include <vector>`する必要があります。


CC BY-SA 4.0
2019-07-31T02:36:00.080
57055
2019-07-31T02:36:00.080
4236
57054
answer


短い答え：今のままでは無理っす

長い答え：

コンパイルエラーは `time(time_t*)` という関数が宣言済みであるので `time` とだけ書くと関数へのポインタ右辺値になってしまい
`double` にはポインタ値が代入できないと言っています。

所要時間を測定するには「開始時点と終了時点」が必要です。提示コードにおいて `end`
は（まあシンプルに読む限りにおいて）測定終了時点でしょう。が、対応する測定開始時点がありません。んで `time`
はたぶん「所要時間＝測定終了時刻－測定開始時刻」のつもりなのでしょうがそうなっていません。

で、どの処理に必要な時間を測るんでしょうか？ 一度別質問に答えた記憶がありますが質問ごと削除されているっぽいので再掲しますが `C[i][j] +=
A[i][j]+B[i][j];` の１回を測定したい、のであれば提示コードでは無理です。

[code]

    high_resolution_clock::time_point beg = high_resolution_clock::now();
    C[i][j] += A[i][j]+B[i][j];
    high_resolution_clock::time_point end = high_resolution_clock::now();
    auto time = end - beg; // time より duration のほうが適切そう
    
[/code]

で、一見測定できそうに見えますが、加算１回の実処理にかかる時間より、現在時刻を得るための実行時間のほうが大きいからです（おそらく１０万倍以上後者のほうに時間がかかる）まったくもって無意味なので諦めてください。

また、速度測定したいコードが機械語でせいぜい数十命令となるこの例では、メモリキャッシュヒット率によって実行時間が大きく変動します。測定のためのコードによってキャッシュヒット率が激減することが予想されるので、測定結果が実態を反映しない可能性がとても高くなります＝無意味。

ソート以後の処理も無茶苦茶ですね。それぞれ１つに１質問を挙げてもらうほうが stackoverflow 的に役に立ちそうですし、オイラの回答はここまで。


CC BY-SA 4.0
2019-07-31T04:56:48.160
57061
2019-07-31T07:49:31.773
2019-07-31T07:49:31.773
8589
8589
57054
answer