1. 程式人生 > >C++程式耗時測試方法

C++程式耗時測試方法

一、QueryPerformanceCounter()

1、簡介

     函式QueryPerformanceCounter()統計的是系統的滴答數,在要統計的程式執行前和執行後各呼叫一次該函式相減即可得到程式執行所耗的滴答數;轉換後的時間計數可達到微妙級,但具體的實現與系統有關。因此需要先用QueryPerformanceFrequency()得到當前系統的頻率值;QueryPerformanceFrequency()得到的也是系統每秒鐘的滴答數,1除以滴答數即可得到頻率值。

2、函式原型

 (1) 標頭檔案:windows.h

BOOL QueryPerformanceCounter(

LARGE_INTEGER *ipPerformanceCount); //引數指向計數器的值

BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);

如果安裝的硬體不支援高精度計時器,該引數將返回0;如果安裝的硬體支援高精度計時器,函式將返回非0值。

(2) LARGE_INTEGER結構實際上是一個聯合。如果你的編譯器具有內建支援64位整數,使用QuadPart成員中儲存的64位整數。否則,使用LowPart和HighPart成員的儲存的64位整數。該型別的定義如下:

typedef union _ LARGE_INTEGER
  {

     struct

     {

       DWORD LowPart;

       LONG HighPart;

    };

        struct

   {

      DWORD LowPart;

      LONG HighPart;

    }u;

     LONGLONG QuadPart;

  } LARGE_INTEGER ,*PLARGE_INTEGER;

3、使用示例

#include <iostream>
#include <windows.h>
#define NUM 100000
using namespace std;
int main()
{
	int arry[NUM]={0};
	double timeSpent=0;
	LARGE_INTEGER nFreq;  
	LARGE_INTEGER nBeginTime;  
	LARGE_INTEGER nEndTime;  
	QueryPerformanceFrequency(&nFreq); //統計頻率 
	QueryPerformanceCounter(&nBeginTime);//開始計時 

	for(int i=0;i<NUM;i++)
		arry[i]=i;

	QueryPerformanceCounter(&nEndTime); //結束計時
	timeSpent=(double)(nEndTime.QuadPart-nBeginTime.QuadPart )/(nFreq.QuadPart );//得到的是耗時的秒數
	timeSpent*=1000;//得到的是耗時的毫秒數
	cout<<"陣列迴圈賦值耗時:"<<timeSpent<<"ms"<<endl;
	return 0;
}
結果:



二、GetTickCount()

1、簡介

GetTickCount()函式返回從作業系統啟動到現在所經過(elapsed)的毫秒數,它的返回值是DWORD。在Release版本中,該函式從0開始計時,返回自裝置啟動後的毫秒數(不含系統暫停時間)。在Debug版本中,裝置啟動後便從計時器中減去180秒。這樣方便測試使用該函式的程式碼的正確溢位處理。可以在要測試的程式開始處和結束處分別呼叫一次該函式,再相減,即可得到程式耗時。GetTickCount()精確度有限,跟CPU有關,一般是16ms,不會低於10ms。

2、函式原型

標頭檔案:windows.h

        DWORD GetTickCount(void); 

3、使用示例

#include <iostream>
#include <windows.h>
#define NUM 100000
using namespace std;
int main()
{
	int arry[NUM]={0};
	DWORD timeSpent=0;
	DWORD beginTime=GetTickCount();
	for(int i=0;i<NUM;i++)
	     arry[i]=i;
        DWORD endTime=GetTickCount();
	timeSpent=endTime-beginTime;
	cout<<"陣列迴圈賦值耗時:"<<timeSpent<<"ms"<<endl;
	return 0;
}
執行結果:(精確度不夠

  
  

 注意:以上方法得到的並非是精確的測試程式的真實執行時間,因為在函式和演算法執行緒不可能一直佔用CPU,不過已經可以定向的說明耗時情況。

三、GetLocalTime()

1、簡介

   GetLocalTime是一個Windows API 函式,用來獲取當地的當前系統日期和時間。與系統的時間設定有關。

2、函式原型

(1)

void GetLocalTime(  LPSYSTEMTIME lpSystemTime);
(2)
typedef struct _SYSTEMTIME { 
  WORD wYear; 
  WORD wMonth; 
  WORD wDayOfWeek; 
  WORD wDay; 
  WORD wHour; 
  WORD wMinute; 
  WORD wSecond; 
  WORD wMilliseconds; 
} SYSTEMTIME;

3、使用示例

#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
	int timeSpent=0;
	SYSTEMTIME beginTime,endTime;
	GetLocalTime(&beginTime);
	Sleep(10);
        GetLocalTime(&endTime);
	timeSpent=endTime.wMilliseconds -beginTime.wMilliseconds ;
	cout<<"程式耗時:"<<timeSpent<<"ms"<<endl;
	return 0;
}

結果:

   

分析:精度不夠





相關推薦

C++程式耗時測試方法

一、QueryPerformanceCounter() 1、簡介      函式QueryPerformanceCounter()統計的是系統的滴答數,在要統計的程式執行前和執行後各呼叫一次該函式相減即可得到程式執行所耗的滴答數;轉換後的時間計數可達到微妙級,但具體的實現

基於WebService的C#程式C#程式之間的方法呼叫

一、WebService 二、建立兩個Web專案 1、建立web空專案 檔案——新建——專案:Visual C#——Web——ASP.NET Web應用程式——空  2、新增web服務 右鍵專案名稱——新增——新建項:web服務 看到的介面為:

避免 C/C++ 程式一閃而過的方法

不知大家是否有注意過,C/C++生成的可執行檔案點開後一般會一閃而過,一眨眼的功夫我們會看不到結果的返回。我們可以在程式碼的最後加上system(“pause”)、getchar()、cin.get()

VisualVM(8) 查詢JAVA應用程式耗時方法函式

Java虛擬機器效能管理神器 - VisualVM(8) 查詢JAVA應用程式耗時的方法函式 1.為什麼要監控?         JAVA程式在開發前,根據設計文件的效能需求,是要對程式的效能指標進行

C#程式集載入方法

     要從程式集的元資料中獲取程式集的資訊,首先需要載入程式集。.Net中載入程式集方法有幾種,本人結合自己的實踐和認識簡單介紹一下。描述不一定很準確,請提出來一起進步。 一、隱式載入         沒有被顯式載入但被引用的程式集,CLR會按照全域性程式集快取(GAC

C#的單元測試方法

一、         單元測試 是軟體測試方法的其中一種,其中還有比如動態黑盒測試、資料測試、破壞性測試等等。 單元測試也稱之為“模組測試”,是對程式設計中的最小單元——函式進行測試的一種方法,所謂測

linux 下C/C++程式常用除錯方法(gdb)

當然,我們可以把這些東西整合起來,比如在專案最終上線後,我們希望這個操作更加簡單,因為到了運營階段,操作者可能不是開發者,而是運維人員,我們希望用更簡單,直接的方式,把這些資訊提取出來,那就需要更進一步的工作了。我們之前採用的方法是:把dump的堆疊資訊寫的檔案中,然後使用shell讀取這些堆疊資訊,病使用a

opencv計算程式耗時方法

計時函式opencv中提供兩個簡便的計時函式getTickCount()和getTickFrequency(),這兩個函式配合使用即可計算出程式耗時,這兩個函式有點類似於C++中的clock()函式和CLK_TCK(C\C++中計時、延時函式) getTickCount():

linux c性能測試的時間間隔獲取方法

時間間隔 lock 測試的 double urn 需要 方法 ++ timezone 一、clock_t clock(void)函數   說明:clock_t其實就是long,即長整形。該函數返回值是硬件滴答數,要換算成毫秒或者秒。換算為毫秒需要除以1000,若換算為秒則除

Linux C 程式執行 shell 命令並獲取返回結果的方法

據說有統計資料表明,程式碼的缺陷率是一定的,與所使用的語言無關。Linux提供了很多的實用工具和指令碼,在程式中呼叫工具和指令碼,無疑可以簡化程式,從而降低程式碼的缺陷數目。Linux shell 指令碼也是一個強大的工具,我們可以根據需要編制指

C# TSC列印二維碼和條形碼(轉) C#呼叫dll提示"試圖載入格式不正確的程式"解決方法

效果圖   開發、使用環境說明 安裝TSC_7.3.8_M-3.exe印表機驅動,安裝時選擇對應的ttp 244 pro 將TSCLIB.dll複製到C:\Windows\system 驅動安裝說明     選擇下一步   &nbs

應用程式測試方法與技巧

今天解決專案問題時,忽然發現做了很多年測試,經常清理快取臨時檔案,刪除修改配置檔案,有時確忽略了這些對測試的影響和作用。 最近困擾較多的是office外掛測試,外掛安裝挑環境,相容性不夠好,導致我們通過頻繁重灌作業系統和重灌office軟體來驗證外掛是否可以正常啟動和載入。 起初自己通過事件管理器來獲取錯

改善C#程式的50種方法

摘要:為什麼程式已經可以正常工作了,我們還要改變它們呢?答案就是我們可以讓它們變得更好。我們常常會改變所使用的工具或者語言,因為新的工具或者語言更富生產力。如果固守舊有的習慣,我們將得不到期望的結果。對於C#這種和我們已經熟悉的語言(如C++或Java)有諸多共通之處的新語言,情況更是如此。人

微信小程式測試方法總結

最近的新專案是小程式加web端後臺管理   主要找了些文章方便自己使用也分享給大家: 微信小程式測試方法 https://blog.csdn.net/qq_30261301/article/details/70154535   微信小程式自動化測試流程 https://mp.

VS C#程式打包覆蓋安裝不能更新的解決方法

最近寫個小程式,打包覆蓋安裝更新時老是不起作用,還是原來的程式。 在網上四處查詢,productcode和ersion都已經更改,removepreviousversions也設定成true了,可就是不能更新。 最後對比了下程式,發現每次覆蓋安裝後安裝路徑下別的檔

測試C++程式執行的時間

參加一個公司的筆試,給了兩個題目,時間要求是越快越好,這時候就要求我們在編寫程式之後測試程式所需的時間,儘量做到最小。 在C++中計算執行的時間是呼叫clock函式,使用clock函式獲得程式開始和結束所需的時間,相減就得到程式所花的時間。 clock()是C/C++中的計

C#程式(含多個Dll)合併成一個Exe的超簡單方法

開發程式的時候經常會引用一些第三方的DLL,然後編譯生成的exe檔案就不能脫離這些DLL獨立運行了。 但是,很多時候我們本想開發一款只需要一個exe就能完美執行的小工具。那該怎麼辦呢? 下文介紹一種超簡單的方法,不用寫一行程式碼就可輕鬆實現。 這裡我們需要用到一款名為Fody.Costura的工具。Fo

LeetCode Merge K Sorted Lists 問題和解答程式 C++ priority queue實現方法

Merge k Sorted Lists Mergeksorted linked lists and return it as one sorted list. Analyze and describe its complexity. 其實這個問題真沒有什麼“技巧”;

Ubuntu 16.04系統中GCC 7.3編譯器安裝方法C++17標準測試示例

2017年底,C++17標準正式頒佈,該標準的最大貢獻是,提供了STL庫演算法的並行運算版本,對於我這種喜歡追求演算法效能的程式設計師而言,無疑是一個極大的福音。幸運地是,Linux系統標準編譯器GCC能完美地支援C++ 17標準,但需升級到7.0以上版本;不幸

C# WinForm程式退出的方法

1.this.Close();   只是關閉當前視窗,若不是主窗體的話,是無法退出程式的,另外若有託管執行緒(非主執行緒),也無法乾淨地退出; 2.Application.Exit();  強制所有訊息中止,退出所有的窗體,但是若有託管執行緒(非主執行緒),也無法乾淨地