第11回は時間関係になります。

従来の方法で時間計測を行う場合

 1: #include <iostream>
 2: #include <array>
 3: #include <algorithm>
 4: #include <random>
 5: #include <ctime>
 6:
 7: using namespace std;
 8:
 9: int main()
10: {
11:	//10万の長さの配列
12:	array<double, 100000> arr;
13:	random_device rd;
14:
15:	//乱数で初期化
16:	generate(arr.begin(), arr.end(), [&rd](){return rd();});
17:
18:	//計測開始
19:	clock_t start = clock();
20:
21:	for_each(arr.begin(), arr.end(), [](double& i){i = i*i;});
22:
23:	//計測終了
24:	clock_t end = clock();
25:
26:	//結果の表示
27:	cout << "time[s] = " << (double)(end - start) / CLOCKS_PER_SEC << endl;
28:
29:	return 0;
30: }

C言語にもある<time.h>あるいは、<ctime>を使用していましたが、これでは秒でしか計測出来ないため他の単位に変換する場合は自分で処理を書く必要がありました。
C++11では<chrono>を利用することによって複数の単位を扱うことが出来るようになりました。

 1: #include <iostream>
 2: #include <array>
 3: #include <algorithm>
 4: #include <random>
 5: #include <chrono>
 6:
 7: using namespace std;
 8:
 9: int main()
10: {
11:	//10万の長さの配列
12:	array<double, 100000> arr;
13:
14:	random_device rd;
15:
16:	//乱数で初期化
17:	generate(arr.begin(), arr.end(), [&rd](){return rd();});
18:
19:	//計測開始
20:	auto start = chrono::system_clock::now();
21:
22:	for_each(arr.begin(), arr.end(), [](double& i){i = i*i;});
23:
24:	//計測終了
25:	auto end = chrono::system_clock::now();
26:
27:	//結果の表示
28:	auto diff = end - start;
29:	//秒
30:	cout << "time[s] = " << chrono::duration_cast<chrono::seconds>(diff).count() << endl;
31:	//ミリ秒
32:	cout << "time[ms] = " << chrono::duration_cast<chrono::milliseconds>(diff).count() << endl;
33:	//マイクロ秒
34:	cout << "time[μs] = " << chrono::duration_cast<chrono::microseconds>(diff).count() << endl;
35:	//ナノ秒
36:	cout << "time[ns] = " << chrono::duration_cast<chrono::nanoseconds>(diff).count() << endl;
37:
38:	return 0;
39: }

結果の所を見ればわかりますが、複数の単位に変換出来ることが分かります。(もちろん時、分にも変換可能)
また、演算にも対応しているため

 1: #include <iostream>
 2: #include <chrono>
 3:
 4: using namespace std;
 5:
 6: int main()
 7: {
 8:	chrono::seconds sec(60);//60秒
 9:	chrono::minutes min(2);//2分
10:
11:	//秒+分
12:	auto result = sec + min; 
13:
14:	//結果は秒で表示される(180秒)
15:	cout << result.count() << endl;
16:
17:	//もちろん分にすることも可能
18:	cout << chrono::duration_cast<chrono::minutes>(result).count() << endl;
19:
20:	return 0;
21: }

このようなことも出来ます。
従来の方法に比べると記述が複雑になりますが、便利なのでぜひ使ってみてください。
※ちなみにautoにしている部分を正式に書くと

std::chrono::duration<数値型, 単位型>

になります。(単位型はC++11講座14回の有理数を使います)

以上でC++11での時間計測の説明を終わります。

前→C++11講座10回
次→C++11講座12回

選択肢 投票
汚れるんだよC++が 1  
これこそC++だな! 0  
観葉植物くんは全てを見ていた 0  

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-12-17 (木) 12:33:11