torutkのブログ

ソフトウェア・エンジニアのブログ

処理時間の算出にSTLのadjacent_difference

何事にも七面倒くさいC++ですが、STLライブラリにadjacent_differenceというアルゴリズムが用意されています。

これは、例えば繰り返しタイムスタンプを取得し、そのタイムスタンプの間隔を出したいときにぴったり適合します。

id:torutk:20121019で、Windowsの高精度タイマーQueryPerformanceCounterを連続実行し、その間隔から処理時間を算出しましたが、これはadjacent_differenceにぴったりの処理です。

次は、64bit整数(long long型)のカウンタ値を20回計測し、ある回と次の回とのカウンタ値の差を算出する想定で単純化したコード例です。

  • C++11規格の機能を使ったコードです(Visual C++ 2010で実行)
#include <vector>
#include <algorithm>
#include <numeric>
#include <iostream>

void adjacent_difference_sample()
{
    long long a[10] = {1, 2, 4, 7, 11, 16, 22, 29, 37, 46};
    std::vector<long long> laps(10);
    laps.assign(a, a + 10);

    std::vector<long long> diffs(laps.size());
    std::adjacent_difference(std::begin(laps), std::end(laps), std::begin(diffs));

    std::for_each(std::begin(diffs), std::end(diffs), [](long long diff) {
        std::wcout << diff << std::endl;
    });
}

10個の数値を持つvector lapsがあり、そのlapsの要素の隣同士の値の差を新たなvecotor diffsに生成しています。

これを実行すると、

1
1
2
3
4
5
6
7
8
9

となります。diffsの最初の要素は、lapsの先頭の値となります。