冷めたコーヒー

Weniger, aber besser

C++ で実行時間の計測

f:id:mirucacule:20191012191247j:plain 調べてみると色々な方法があるようですが,現状は以下のように計測しています.

実験では調和級数の部分和:

$$ \sum_{k=1}^{n} \frac{1}{k} = 1 + \frac{1}{2} + \frac{1}{3} + \cdots + \frac{1}{n} $$

を計算しています.

#include <iostream>
#include <time.h>

int main()
{
    double a = 0.0;
    int n = 1000000000;

    clock_t start = clock();

    //処理
    for (int i=0; i<n; i++)
    {
        a += (double)1 / (i+1);
        if (i%100000000==0)
        {
            std::cout << "i = " << i << " : " << a << std::endl;
        }
    }


    clock_t end = clock();

    // const double time = static_cast<double> (end-start) / CLOCKS_PER_SEC * 1000000.0; //microsec
    // const double time = static_cast<double> (end-start) / CLOCKS_PER_SEC * 1000.0; //millisec
    const double time = static_cast<double> (end-start) / CLOCKS_PER_SEC * 1.0; //sec

    std::cout << "time = " << time << " [sec]" << std::endl;
    std::cout << "a = " << a << std::endl;

    return 0;

}

出力結果は次のようになりました.

i = 0 : 1
i = 100000000 : 18.9979
i = 200000000 : 19.691
i = 300000000 : 20.0965
i = 400000000 : 20.3842
i = 500000000 : 20.6073
i = 600000000 : 20.7897
i = 700000000 : 20.9438
i = 800000000 : 21.0773
i = 900000000 : 21.1951
time = 4.64131 [sec]
sum = 21.3005

以上です.余談ですが,調和級数の和は無限大に発散するのにもかかわらず,1億回加算しても$21.3$程度にしかならないのは驚きですね.