日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

c纳秒级计时器_使用C+提供以纳米秒为单位的时间的计时器功能

發(fā)布時(shí)間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c纳秒级计时器_使用C+提供以纳米秒为单位的时间的计时器功能 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這個(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。