c纳秒级计时器_使用C+提供以纳米秒为单位的时间的计时器功能
這個(gè)新的答案使用C+11的。設(shè)施。雖然還有其他的答案可以說(shuō)明如何使用,它們都沒(méi)有顯示如何使用帶著RDTSC其他幾個(gè)答案中提到的設(shè)施。所以我想我應(yīng)該展示如何使用RDTSC帶著..此外,我將演示如何在時(shí)鐘上臨時(shí)編寫(xiě)測(cè)試代碼,以便您可以在RDTSC和你的系統(tǒng)內(nèi)置的時(shí)鐘設(shè)施(這很可能是基于clock(),?clock_gettime()和/或QueryPerformanceCounter.
注意,RDTSC指令是x86特定的。QueryPerformanceCounter只適用于Windows。和clock_gettime()僅限POSIX。下面我介紹兩個(gè)新的時(shí)鐘:std::chrono::high_resolution_clock和std::chrono::system_clock,如果您可以假設(shè)C+11,則現(xiàn)在是跨平臺(tái)的。
首先,下面是如何從Intel中創(chuàng)建一個(gè)與C+11兼容的時(shí)鐘。rdtsc裝配指令。我就叫它x::clock:#include?namespace?x{struct?clock{
typedef?unsigned?long?long?????????????????rep;
typedef?std::ratio<1,?2'800'000'000>???????period;?//?My?machine?is?2.8?GHz
typedef?std::chrono::duration?duration;
typedef?std::chrono::time_point?????time_point;
static?const?bool?is_steady?=??????????????true;
static?time_point?now()?noexcept
{
unsigned?lo,?hi;
asm?volatile("rdtsc"?:?"=a"?(lo),?"=d"?(hi));
return?time_point(duration(static_cast(hi)?<
}
};
}??//?x
這個(gè)時(shí)鐘所做的就是計(jì)算CPU周期,并將其存儲(chǔ)在一個(gè)無(wú)符號(hào)64位整數(shù)中。您可能需要調(diào)整編譯器的匯編語(yǔ)言語(yǔ)法。或者您的編譯器可能提供一個(gè)您可以使用的內(nèi)部特性(例如:now() {return __rdtsc();}).
要構(gòu)建一個(gè)時(shí)鐘,您必須給它表示(存儲(chǔ)類型)。您還必須提供時(shí)鐘周期,這必須是一個(gè)編譯時(shí)間常數(shù),即使您的機(jī)器可能改變不同的電源模式下的時(shí)鐘速度。根據(jù)這些基本原理,您可以很容易地定義您的時(shí)鐘的“本地”時(shí)間持續(xù)時(shí)間和時(shí)間點(diǎn)。
如果你想要做的只是輸出時(shí)鐘滴答的數(shù)量,那么你給出的時(shí)鐘周期是多少并不重要。只有當(dāng)您想將時(shí)鐘滴答的數(shù)量轉(zhuǎn)換為一些實(shí)時(shí)單位(例如納秒)時(shí),這個(gè)常數(shù)才會(huì)起作用。在這種情況下,你能提供的時(shí)鐘速度越精確,轉(zhuǎn)換到納秒(毫秒,隨便什么)的精度就越高。
下面是示例代碼,演示如何使用x::clock..實(shí)際上,我已經(jīng)對(duì)時(shí)鐘上的代碼進(jìn)行了模板化,因?yàn)槲蚁胂蚰故救绾斡猛耆嗤恼Z(yǔ)法使用許多不同的時(shí)鐘。這個(gè)特殊的測(cè)試顯示了在循環(huán)下運(yùn)行所需時(shí)間時(shí)的循環(huán)開(kāi)銷是什么:#include?template?voidtest_empty_loop(){
//?Define?real?time?units
typedef?std::chrono::duration?picoseconds;
//?or:
//?typedef?std::chrono::nanoseconds?nanoseconds;
//?Define?double-based?unit?of?clock?tick
typedef?std::chrono::duration?Cycle;
using?std::chrono::duration_cast;
const?int?N?=?100000000;
//?Do?it
auto?t0?=?clock::now();
for?(int?j?=?0;?j?
asm?volatile("");
auto?t1?=?clock::now();
//?Get?the?clock?ticks?per?iteration
auto?ticks_per_iter?=?Cycle(t1-t0)/N;
std::cout?<
//?Convert?to?real?time?units
std::cout?<(ticks_per_iter).count()
<
這段代碼所做的第一件事就是創(chuàng)建一個(gè)“實(shí)時(shí)”單元來(lái)顯示結(jié)果。我選擇了皮秒,但是你可以選擇任何你喜歡的單位,無(wú)論是積分還是基于浮點(diǎn)。舉個(gè)例子,有一個(gè)預(yù)先制作的std::chrono::nanoseconds我可以用的單位。
作為另一個(gè)例子,我希望以浮點(diǎn)數(shù)的形式打印出每次迭代的平均時(shí)鐘周期數(shù),因此我創(chuàng)建了另一個(gè)基于Double的持續(xù)時(shí)間,它具有與時(shí)鐘的刻度相同的單位(稱為Cycle在代碼中)。
循環(huán)是通過(guò)調(diào)用clock::now()兩邊都有。如果要命名此函數(shù)返回的類型,則如下所示:typename?clock::time_point?t0?=?clock::now();
(如x::clock例如,也適用于系統(tǒng)提供的時(shí)鐘)。
要獲得以浮點(diǎn)時(shí)鐘為單位的持續(xù)時(shí)間,只需減去兩個(gè)時(shí)間點(diǎn),而要獲得每一個(gè)迭代值,則將持續(xù)時(shí)間除以迭代次數(shù)。
屬性可以在任何時(shí)間內(nèi)獲取計(jì)數(shù)。count()成員函數(shù)這將返回內(nèi)部表示。最后我用std::chrono::duration_cast若要轉(zhuǎn)換持續(xù)時(shí)間,請(qǐng)執(zhí)行以下操作Cycle持續(xù)時(shí)間picoseconds打印出來(lái)。
使用此代碼很簡(jiǎn)單:int?main(){
std::cout?<
test_empty_loop<:clock>();
std::cout?<
test_empty_loop<:chrono::high_resolution_clock>();
std::cout?<
test_empty_loop<:chrono::system_clock>();}
以上我是用我們自制的測(cè)試來(lái)練習(xí)的。x::clock,并將這些結(jié)果與使用兩個(gè)系統(tǒng)提供的時(shí)鐘的結(jié)果進(jìn)行比較:std::chrono::high_resolution_clock和std::chrono::system_clock..對(duì)我來(lái)說(shuō)這是打印出來(lái)的:Using?rdtsc:
1.72632?clock?ticks?per?iteration
616ps?per?iteration
Using?std::chrono::high_resolution_clock:
0.620105?clock?ticks?per?iteration
620ps?per?iteration
Using?std::chrono::system_clock:
0.00062457?clock?ticks?per?iteration
624ps?per?iteration
這表明每個(gè)時(shí)鐘都有一個(gè)不同的刻度周期,因?yàn)槊總€(gè)時(shí)鐘的每一次迭代的滴答數(shù)都有很大的不同。然而,當(dāng)轉(zhuǎn)換為一個(gè)已知的時(shí)間單位(例如,皮秒),我得到了大約相同的結(jié)果,每個(gè)時(shí)鐘(您的里程可能有所不同)。
請(qǐng)注意,我的代碼完全沒(méi)有“神奇的轉(zhuǎn)換常量”。實(shí)際上,整個(gè)示例中只有兩個(gè)神奇的數(shù)字:我的機(jī)器的時(shí)鐘速度來(lái)定義
x::clock.
要測(cè)試的迭代次數(shù)。如果更改這個(gè)數(shù)目會(huì)使結(jié)果有很大差異,那么您可能應(yīng)該提高迭代次數(shù),或者在測(cè)試時(shí)清空計(jì)算機(jī)上的競(jìng)爭(zhēng)進(jìn)程。
總結(jié)
以上是生活随笔為你收集整理的c纳秒级计时器_使用C+提供以纳米秒为单位的时间的计时器功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python网页登录钉钉_django
- 下一篇: 米的换算单位和公式_求小学数学的公式、换