全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:6078
推到 Plurk!
推到 Facebook!

QueryPerformanceFrequency( )取得的值

答題得分者是:Cooky Kid
Just4U
初階會員


發表:38
回覆:56
積分:28
註冊:2002-03-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-07 15:35:59 IP:211.74.xxx.xxx 未訂閱
我用QueryPerformanceFrequency()在幾台不同PC得到的值如下: Win98/266MHz : 1193180 Win98/400MHz : 1193180 Win2000/550MHz : 3579545 WinXP/700MHz : 3579545 WinXP/1.8GHz : 3579545 這個值好像與CPU無關而與OS有關, 是這樣子嗎?
Cooky Kid
初階會員


發表:5
回覆:68
積分:44
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-08 03:07:54 IP:211.76.xxx.xxx 未訂閱
小弟手頭上剛好有QueryPerformanceFrequency這個API範例, but...實在不太了解您的需求.... 請看以下程式碼。 < class="code"> //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {//將ComboBox中選項自設為1000000~21000000巨額數目 ComboBox1->Items->Clear(); for(int i=1;i<21;i ) { double b = 1000000; b *= i; ComboBox1->Items->Add(AnsiString("計算 ") AnsiString(b) AnsiString(" 數字相加")); } ComboBox1->ItemIndex = 9; //先將Memo1字串清除 Memo1->Text = ""; } //--------------------------------------------------------------------------- //按下Button1,則開始計算巨額數字相加的時間,並在Memo1中顯示高精度秒數 void __fastcall TForm1::Button1Click(TObject *Sender) { //從ComboBox1選項,取得巨額數字,以供計算時間之用 AnsiString str = ComboBox1->Items->Strings[ComboBox1->ItemIndex]; str = str.SubString(6,str.Length()); str = str.SubString(1,(str.Length()-9)); //Memo1->Text = str;//測試之用 //將擷取的字串轉成巨額變數 double dbl = str.ToDouble(); //64bit的整數變數 LARGE_INTEGER time1, time2, freq; //在迴圈運算前,取得第一次高精度的時間,存入64bit的整數變數中 ::QueryPerformanceCounter(&time1); double a = 0, i=0; //迴圈運算 for(;i<dbl;i ) a = i; //在迴圈運算後,取得第二次高精度的時間,存入64bit的整數變數中 ::QueryPerformanceCounter(&time2); //將兩次時間相減,取得迴圈運算所費時間 __int64 passtime = time2.QuadPart - time1.QuadPart; //取得系統每秒有多少的高精度頻率數目 ::QueryPerformanceFrequency(&freq); //計算出迴圈運算需要多少秒 float numSecs = (float)passtime / (float)freq.QuadPart; //將結果顯示在Memo1中 Memo1->Lines->Add(AnsiString("迴圈變數:") AnsiString(i) AnsiString(",相加結果:") AnsiString(a)); Memo1->Lines->Add(AnsiString("花費時間:") FloatToStr(numSecs) AnsiString(" 秒")); //仍由ComboBox取得焦點 ComboBox1->SetFocus(); } //---------------------------------------------------------------------------
Just4U
初階會員


發表:38
回覆:56
積分:28
註冊:2002-03-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-08 10:04:21 IP:211.74.xxx.xxx 未訂閱
我是想為一個delay的函式得到一個較精確的基準時間,    Win98/266MHz, Win98/400MHz QueryPerformanceFrequency() = 1193180    Win2000/550MHz, WinXP/700MHz, WinXP/1.8GHz QueryPerformanceFrequency() = 3579545    我的疑問是, 由上述測量值看來, QueryPerformanceFrequency()的值好像與CPU無關而與OS有關, 是這樣嗎? 可是照常理來說, 不是應該CPU越快, QueryPerformanceFrequency()的值會越大嗎?    
引言: 小弟手頭上剛好有QueryPerformanceFrequency這個API範例, but...實在不太了解您的需求.... 請看以下程式碼。 < face="Verdana, Arial, Helvetica">
Cooky Kid
初階會員


發表:5
回覆:68
積分:44
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-08 12:04:36 IP:211.76.xxx.xxx 未訂閱
據小弟所知-- QueryPerformanceFrequency 是依照cpu震盪頻率(tick)所取得的數值為基準, (真是滿詭異...竟然有API可探觸到cpu震盪頻率.....) 小弟也很好奇的請教大大-- 您也有在 550MHz, 700MHz, 1.8GHz, PC上裝win98? 跟266MHz, 400MHz, 數據一樣? or 反過來.. 在 266MHz, 400MHz, PC上裝winXP,2000? 跟550MHz, 700MHz, 1.8GHz, 數據一樣?
Just4U
初階會員


發表:38
回覆:56
積分:28
註冊:2002-03-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-08 14:20:55 IP:211.74.xxx.xxx 未訂閱
大大, 真高興你還在, 我用同一台PC(700MHz)分別在Windows 98/XP下測量QueryPerformanceFrequency()的值, 如下:    Windows 98 : QueryPerformanceFrequency() = 1193180 Windows XP : QueryPerformanceFrequency() = 3579545    由上述測量值看來, 好像只與OS有關, 請問QueryPerformanceFrequency()的值代表的意義是什麼呢?    
引言: 據小弟所知-- QueryPerformanceFrequency 是依照cpu震盪頻率(tick)所取得的數值為基準, (真是滿詭異...竟然有API可探觸到cpu震盪頻率.....) 小弟也很好奇的請教大大-- 您也有在 550MHz, 700MHz, 1.8GHz, PC上裝win98? 跟266MHz, 400MHz, 數據一樣? or 反過來.. 在 266MHz, 400MHz, PC上裝winXP,2000? 跟550MHz, 700MHz, 1.8GHz, 數據一樣?
Cooky Kid
初階會員


發表:5
回覆:68
積分:44
註冊:2002-07-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-08 16:05:33 IP:211.76.xxx.xxx 未訂閱
引言: 大大, 真高興你還在, 我用同一台PC(700MHz)分別在Windows 98/XP下測量QueryPerformanceFrequency()的值, 如下: Windows 98 : QueryPerformanceFrequency() = 1193180 Windows XP : QueryPerformanceFrequency() = 3579545 由上述測量值看來, 好像只與OS有關, 請問QueryPerformanceFrequency()的值代表的意義是什麼呢?
小弟對精密計時與API函式 QueryPerformanceFrequency的前因後果,沒法比以下兩個網頁解說的更完整,so...推薦大大到下列兩個網頁,應該對您有些幫助... >>]。筆者在主頻為
Just4U
初階會員


發表:38
回覆:56
積分:28
註冊:2002-03-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-08 16:27:48 IP:211.74.xxx.xxx 未訂閱
謝謝大大的幫忙!!! 就先這樣吧! 我再多看一些資料.
Cooky Kid
初階會員


發表:5
回覆:68
積分:44
註冊:2002-07-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-08 18:13:09 IP:211.76.xxx.xxx 未訂閱
引言: 謝謝大大的幫忙!!! 就先這樣吧! 我再多看一些資料.
sorry...沒法解決您的疑問... 小弟的想法是: 就以程式實作的角度, CPU的震盪頻率在不同OS下,有著穩定、可靠的數值基礎,可供programmer測量程式運算執行的時間; 顯然在CPU的等級不會影響不同OS(9X/1193180 and XP/3579545)下,只要programmer在計時前,確認OS是9X or XP,計算出來的總時間,運用簡單的換算,就可以得到可信賴的數值。並不會因為OS不同而出現無法對照的窘境。 另外, 以此函式(QueryPerformanceFrequency)為何在不同OS下,取得的震盪頻率不同數值? 小弟以為--若大大可以從M$文件中取得此函式的soure code,或許會解開此迷團吧... ************************* 在我們編程的時候常常需要一個精確的
系統時間:2024-04-25 19:13:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!