端数を切り捨てて32bitでできるところまで頑張ってみました。
最後のµsを求める部分は表現領域の広い浮動小数点を使用しました。
本当は整数のみで完成させたかったです。
時間の間隔が2msを下回るのであれば、整数のみで計算できそうです。
#uselib "kernel32.dll"
#func QueryPerformanceFrequency "QueryPerformanceFrequency" int
#func QueryPerformanceCounter "QueryPerformanceCounter" int
dim ll_frequency,2//周波数取得用。
dim ll_count1,2//カウンター用1(前)
dim ll_count2,2//カウンター用2(後)
dim i_frequency,1//32bit化周波数
dim i_count1,1//32bit化カウンター1
dim i_count2,1//32bit化カウンター2
dim i_adjust,1//調整値(ずらす量)
dim i_deltatime,1//実行時間
//周波数取得部
mes "高分解能パフォーマンスカウンターの周波数を調べます。"
QueryPerformanceFrequency varptr(ll_frequency)
if(stat==0){
mes "高分解能パフォーマンスカウンターを利用できません。\n実行を停止します。"
stop
}
//周波数に関するレポート部
if(ll_frequency(1)){
mes strf("周波数は16進表記で%8X%08X[Hz]です。",ll_frequency(1),ll_frequency(0))
}else{
mes strf("周波数は16進表記で%16X[Hz]です。\n10進数表記では%d[Hz]です。",ll_frequency(0),ll_frequency(0))
}
if(ll_frequency(1)){
mes "周波数がHSPで扱える大きさを超えています。"
}else:if(ll_frequency(0)&0xFF000000){
mes "周波数は扱いにくいほど高いです。"
}else:if(ll_frequency(0)<1000000){
mes "周波数の逆数(周期)は1マイクロ秒を超えています。"
}
//32bitに調整(端数切捨て)部
if(ll_frequency(1)&0xFF000000){
i_adjust=5
}else:if(ll_frequency(1)&0x00FF0000){
i_adjust=4
}else:if(ll_frequency(1)&0x0000FF00){
i_adjust=3
}else:if(ll_frequency(1)&0x000000FF){
i_adjust=2
}else:if(ll_frequency(0)&0xFF000000){
i_adjust=1
}else{
i_adjust=0//本来は不要。移動量0ということを明示的にするために記述。
}
memcpy i_frequency,ll_frequency,3,0,i_adjust
*retry
//計測部
QueryPerformanceCounter varptr(ll_count1)
QueryPerformanceCounter varptr(ll_count2)
//分析部
memcpy i_count1,ll_count1,3,0,i_adjust
memcpy i_count2,ll_count2,3,0,i_adjust
i_deltatime=i_count2-i_count1
if(i_deltatime<0){
mes "ループしました。\n測定をやり直します。"
wait 100
goto *retry
}
i_deltatime=1000000.0*i_deltatime/i_frequency
mes strf("QueryPerformanceCounter自体の処理時間は%fマイクロ秒です。",i_deltatime);
wait 500
mes "再度計測します。"
goto *retry