この質問はすでに良い答えを持っている:彼らはバグを修正するまで
ので、残念ながら、高解像度のタイマーのために、あなたはそうのような直接boost::chrono
またはQueryPerformanceCounterのを使用する必要があります。しかし、別の提案を追加したいと思います。
<chrono>
フレームワーク内で作業してください。あなた自身の時計を造る。独自のtime_pointを構築する。独自の期間を構築する。 <chrono>
フレームワークは非常にカスタマイズ可能です。そのシステム内で作業することで、std::chrono
を学ぶだけでなく、ベンダーがあなたが満足している時計の出荷を開始すると、コードをstd::high_resolution_clock
(または何でも)にクロノクロール::クロックから移行するのは簡単です。
あなたの元のコードについてのマイナーな批判は、しかし最初に:あなた自身があなたが正しくchrono
を使用していない、あなたが望む結果を得るために(1000000など)の変換定数を導入見るたび
std::cout << "seconds since start: " << ((double) difference/1000000);
。あなたのコードは、壊れやすいだけではありません。 あなたはその定数にゼロの正しい数を持っていますか?
も、この単純な例では、自分自身に言う必要があります。
私はダブルで表さ秒の条件で出力を見てみたいです。
次に、chrono
を使用してください。
typedef std::chrono::duration<double> sec;
sec difference = end - start;
std::cout << "seconds since start: " << difference.count() << '\n';
最初の行は、1秒の周期で2倍で表される型を作成します。
2行目はtime_pointsを減算し、それをあなたのカスタム期間タイプに割り当てます。 steady_clock::time_point
の単位からカスタム期間(2秒間)への変換は、chrono
ライブラリによって自動的に行われます。これは、よりはるかに簡単です:
auto difference = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count()
そして最後に、あなただけの.count()
メンバ関数を使用して、結果をプリントアウト。これは、再びよりもはるかに簡単です:
std::cout << "seconds since start: " << ((double) difference/1000000);
しかし、あなたはstd::chrono::steady_clock
の精度で満足していない、とあなたはQueryPerformanceCounterのへのアクセス権を持っているので、あなたはより良い行うことができます。あなたはQueryPerformanceCounterの上に独自のクロックを構築することができます。
<disclaimer>
私は、上の次のコードをテストするには、Windowsのシステムを持っていません。
</disclaimer>
struct my_clock
{
typedef double rep;
typedef std::ratio<1> period;
typedef std::chrono::duration<rep, period> duration;
typedef std::chrono::time_point<my_clock> time_point;
static const bool is_steady = false;
static time_point now()
{
static const long long frequency = init_frequency();
long long t;
QueryPerformanceCounter(&t);
return time_point(duration(static_cast<rep>(t)/frequency));
}
private:
static long long init_frequency()
{
long long f;
QueryPerformanceFrequency(&f);
return f;
}
};
あなたは二重の第二の面であなたの出力を望んでいたので、私はこのクロックのrep
にdouble
とperiod
1秒を作りました。 rep
と同じように簡単に作ることができ、period
マイクロ秒やナノ秒のような他の単位を作ることもできます。 typedef
秒をQueryPerformanceCounter
からduration
までnow()
に調整してください。
そして今、あなたのコードは非常にあなたの元のコードのように見えることができますあなたのためのなし
int main()
{
auto start = my_clock::now();
for (unsigned long long int i = 0; i < 10000; ++i) {
std::vector<int> v(i, 1);
}
auto end = my_clock::now();
auto difference = end - start;
std::cout << "seconds since start: " << difference.count() << '\n';
}
しかしハンドコーディング変換定数、およびと(私が望んでいることである)十分な精度ニーズ。また、を使用すれば、より容易にstd::chrono::steady_clock
の実装への移植パスがより容易になります。
<chrono>
は、伸長可能なライブラリーであるように設計された。それを拡張してください。 :-)
代わりに 'std :: chrono :: high_resolution_clock'を試してみてください。 –
@KerrekSB:これは良い提案ですが、 'steady_clock :: now()'はすでに正確にナノ秒、または少なくともティック(100ナノ秒の間隔)であるべきです。私はここに数学の問題があると思う。 –
@RobertHarvey:ああ、たぶんキャストの間違ったかっこですか? –