C ++(17)の新機能の調査:クロノタイマー

I.はじめに

   プログラムを作成する過程で、時間のかかるプログラムステートメントの実行をテストする必要がある場合があります。現在、使用できるライブラリは多数あり、提供できる優れたクロスプラットフォームライブラリはありません。一般的にはこれです。一種のコードもありますそれはシステムのライブラリを呼び出す私たちのプログラマーによって行われますが、不十分な精度やクロスプラットフォームの非サポートなどの問題がしばしばあります; C ++ 11はブーストでクロノライブラリを導入します;それはできます高精度のクロックを実現し、ナノ秒レベルを実現できます;

Two.chronoライブラリ

ここに画像の説明を挿入します
  クロノでは、time_pointテンプレートクラスは、基本的な算術演算をサポートする時点を表すために使用されます。異なるクロックは、対応するタイプの時点を返します。

  絶対時点を取得する必要がある場合はsystem_clockを使用し、時間間隔を取得する必要があり、システム時刻の変更の影響を受けない場合はsteady_clockを使用します。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

3.練習

例1:
ここに画像の説明を挿入します
操作結果:
ここに画像の説明を挿入します
例1コード:

#ifndef _TimerClock_hpp_
#define _TimerClock_hpp_

#include <iostream>
#include <chrono>

using namespace std;
using namespace std::chrono;

class TimerClock
{
    
    
public:
	TimerClock()
	{
    
    
		update();
	}

	~TimerClock()
	{
    
    
	}

	void update()
	{
    
    
		_start = high_resolution_clock::now();
	}
	//获取秒
	double getTimerSecond()
	{
    
    
		return getTimerMicroSec() * 0.000001;
	}
	//获取毫秒
	double getTimerMilliSec()
	{
    
    
		return getTimerMicroSec()*0.001;
	}
	//获取微妙
	long long getTimerMicroSec()
	{
    
    
		//当前时钟减去开始时钟的count
		return duration_cast<microseconds>(high_resolution_clock::now() - _start).count();
	}
private:
	time_point<high_resolution_clock>_start;
};

#endif

int main()
{
    
    
	TimerClock TC;
	int sum = 0;
	TC.update();
	for (int i = 0; i > 100000; i++)
	{
    
    
		sum++;
	}
	cout << "cost time:" << TC.getTimerMilliSec() << "ms" << endl;
	cout << "cost time:" << TC.getTimerMicroSec() << "us" << endl;

	return 0;
}

4.時間処理

4.1関連するクラス

SYSTEM_CLOCK   (主な関心事)、steady_clock、high_resolution_clockの
  time_pointの
  期間
  秒、他の時間の表現クラス

4.2関連する機能

ここに画像の説明を挿入します

4.3現在の時刻を取得する方法

例2
ここに画像の説明を挿入します
例2のコード:

#include <chrono>
#include <iostream>
using namespace std;

int main()
{
    
    
    // 获取当天的时间
    auto curTimePoint = chrono::system_clock::now();
    // 获取当前的时间戳
    cout<<"获取当前的时间戳:";
    cout << curTimePoint.time_since_epoch().count() << endl;
    // 把当前时间向后推10秒钟
    auto d1 = chrono::seconds(10);
    auto time2 = curTimePoint + d1;
    cout<<"把当前时间向后推10秒钟:";
    cout << time2.time_since_epoch().count() << endl;
    // 转为经过的小时
    cout<<"转为经过的小时:";
    cout << chrono::duration_cast<chrono::hours>(time2.time_since_epoch()).count() << endl;
    //转为time_t的结构
    cout<<"转为time_t的结构:";
    time_t t = chrono::system_clock::to_time_t(time2);
    cout << t << endl;
}

5つの期間

期間は次のように定義されます。
ここに画像の説明を挿入します
  ここで、Repは、整数または小数の算術タイプのカウント時間を表します。たとえば、doubleに設定されている場合は、小数でタイミングが調整されることを意味します。期間は、含まれる期間タイプを表します。これは、ドキュメントに記載されているさまざまな期間単位の定義など、さまざまな期間タイプの変換に一般的に使用されます。
  

クロノデュレーションタイプ

ここに画像の説明を挿入します
  期間のタイミング単位を変更するには、duration_castを使用できます
例3:
ここに画像の説明を挿入します
  std :: chrono :: time_pointタイプを返します。デフォルトでは、durationは現在の期間の秒数を記録します。Chrono
  は3つのクロックを提供します。通常、 system_clockが使用されます。高精度が必要な場合は、high_resolution_clockの例3のコードを使用し
ます。

#include <iostream>
#include <chrono>
#include <thread>
#include <ratio>
using namespace std;

int main()
{
    
    
    //auto start = chrono::system_clock::now();
    auto start = chrono::high_resolution_clock::now();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    //auto end = chrono::system_clock::now();
    auto end = chrono::high_resolution_clock::now();
    
    std::chrono::duration<double> diff = end - start;
    auto nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start);
    chrono::duration<double, std::nano> fp_nanos = end - start;
    
    cout<<"use "<<diff.count()<<" s\n";
    cout<<"use "<<nanos.count()<<" nanos\n";
    cout<<"use "<<fp_nanos.count()<<" nanos\n";
    return 0;
}

参照ブログ投稿:https
//mp.weixin.qq.com/s/ZZPTOJ5qFe2lKfSWThQx-w参照ブログ投稿:https://mp.weixin.qq.com/s/dtEELMznaeI5cvvHOghQRA
参照ブログ投稿:https:// www。 jianshu.com / p / 0ccbf45491de

おすすめ

転載: blog.csdn.net/weixin_43297891/article/details/114747414