1. 程式人生 > >C/C++中演算法執行時間的三種計算方式(By 虛懷若谷)

C/C++中演算法執行時間的三種計算方式(By 虛懷若谷)

演算法執行時間需通過依據該演算法編制的程式在計算機上執行時所消耗的時間來度量。而度量一個程式的執行時間通常有兩種方法。

  • 事後統計的方法:該方法利用計算機內部的計時功能,可以精確到毫秒級別,這種方法有兩個缺點:一是必須依據演算法先編寫好程式;二是執行程式的軟硬體環境易喧賓奪主,掩蓋演算法本身的優劣。但是有時候在同一臺機器上,想對不同演算法進行比較或是想知道一個程式究竟需要執行多長時間,該方法就有了用武之地了。本文主要介紹三種事後計算演算法執行時間的方式,具體的可以參見原始碼,即time_t/time、timeb/ftime、clock/CLOCKS_PER_SEC。
  • 事前分析的方法:該方法考慮如下因素(a)演算法選用策略;(b)問題規模;(c)書寫程式的語言級別;(d)編譯程式產生機器程式碼質量;(e)機器執行指令的速度。然後對演算法進行大O分析。此方法不在本文討論範圍之內。
    Code highlighting produced by Actipro CodeHighlighter (freeware)
    http://www.CodeHighlighter.com/
    
    -->#include <stdio.h>
    
    #include <tchar.h>
    
    #include <cstdlib>
    
    #include <iostream>
    
    #include <sys/timeb.h>
    
    #include <ctime>
    
    #include <climits>
    
    
    
    using namespace std;
    
    
    
    int _tmain(int argc, _TCHAR* argv[])
    
    {
    
        //計時方式一
    
        time_t start = 0,end = 0;
    
        time(&start);
    
        for(int i=0; i < numeric_limits<int>::max(); i++)
    
        {
    
            double circle = 3.1415962*i;  //浮點運算比較耗時,迴圈最大整數次數
    
        }
    
        time(&end);
    
        cout << "採用計時方式一(精確到秒):迴圈語句運行了:" << (end-start) << "秒" << endl;
    
        
    
        //計時方式二
    
        struct timeb startTime , endTime;
    
        ftime(&startTime);
    
        for(int i=0; i < numeric_limits<int>::max(); i++)
    
        {
    
            double circle = 3.1415962*i;  //浮點運算比較耗時,迴圈最大整數次數
    
        }
    
        ftime(&endTime);
    
        cout << "採用計時方式二(精確到毫秒):迴圈語句運行了:" << (endTime.time-startTime.time)*1000 + (endTime.millitm - startTime.millitm) << "毫秒" << endl;
    
    
    
        //計時方式三
    
        clock_t startCTime , endCTime;  
    
        startCTime = clock();   //clock函式返回CPU時鐘計時單元(clock tick)數,還有一個常量表示一秒鐘有多少個時鐘計時單元,可以用clock()/CLOCKS_PER_SEC來求取時間
    
        for(int i=0; i < numeric_limits<int>::max(); i++)
    
        {
    
            double circle = 3.1415962*i;  //浮點運算比較耗時,迴圈最大整數次數
    
        }
    
        endCTime = clock();
    
        cout << "採用計時方式三(好像有些延遲,精確到秒):迴圈語句運行了:" << double((endCTime-startCTime)/CLOCKS_PER_SEC) << "秒" << endl;
    
    
    
        cout << "綜合比較上述三種種計時方式,方式二能夠精確到毫秒級別,比方式一和三都較好。此外在Windows API中還有其他的計時函式,用法都大同小異,在此就不做介紹了。" << endl;
    
        
    
        system("pause");
    
        return 0;
    
    }


相關推薦

C/C++演算法執行時間計算方式(By 虛懷若谷)

演算法執行時間需通過依據該演算法編制的程式在計算機上執行時所消耗的時間來度量。而度量一個程式的執行時間通常有兩種方法。 事後統計的方法:該方法利用計算機內部的計時功能,可以精確到毫秒級別,這種方法有兩個缺點:一是必須依據演算法先編寫好程式;二是執行程式的軟硬體環境易喧賓奪主

c++ STLsort函式的使用方法

複習一下~ STL,C++中的標準模板庫, 使用起來方便並且效率較高; sort函式有三種用法: 一:對基本型別陣列從小到大排序 sort( 陣列名+n1,陣列名+n2); 將陣列中下標從n1到n2的元素進行從小到大排序,不包括n2,通過n1,n2 可以對整

C++: 繼承和多型(一)繼承方式與許可權

繼承 在C++中,我們常要對某個函式進行多次複用,例如: 資訊管理系統中,對於教師、學生、教務人員等"類"而言,有部分資訊是通用的:姓名,性別,年齡,聯絡方式等。如果為每一種角色都編寫一個"類",會有不少重複的程式碼,造成效率上的浪費。       &nbs

servlet的介紹 & xml配置 以及 & 實現方式(補充設定瀏覽器不快取的方法)

開始時間:2018年10月13日20:53:30 | 2018年10月14日16:10:56 結束時間:2018年10月13日21:53:30 | 2018年10月14日17:02:23 累計時間:2小時 備註:幾乎每一句話都很有收穫,複習的時候務必要仔細一點 Servlet

執行緒---建立方式例項;以及執行緒池的使用

1、繼承Thread類 繼承Thread類,重寫run方法(即要讓執行緒進行的操作), 建立執行緒例項,呼叫start()方法啟動執行緒。 import java.util.Date; /** * @author: ycz * @date: 2018/11/25 0025

Android夜間模式的實現方式

參考:https://www.jianshu.com/p/f3aaed57fa15 在本篇文章中給出了三種實現日間/夜間模式切換的方案: 使用 setTheme 的方法讓 Activity 重新設定主題; 設定 Android Support Library 中的 UiMode

vue-resource get / post / jsonp 請求方式的異同

let url = 'http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=2';let params ={    params: {        username: 'zha

oracleNormal,sysdba,sysoper連線方式和使用者sys,system,sysdba,scott

sys和system使用者的區別 【system】使用者只能用normal身份登陸em。 【sys】使用者具有“SYSDBA”或者“SYSOPER”許可權,登陸em也只能用這兩個身份,不能用normal。 “SYSOPER”許可權,即資料庫操作員許可權,許可權包括:   開啟資料庫伺服器   關閉資料庫伺服

c# 計算程序運行時間的方法

thread lis start color 計算 程序 enc 三種 c++ 三種計算c#程序運行時間的方法第一種:利用 System.DateTime.Now // example1: System.DateTime.Now method DateTime dt1 =

C++類的繼承方式public(公有繼承)、protected(保護繼承)、private(私有繼承)之間的差別(附思維導圖)【轉】

(轉自:https://blog.csdn.net/coco56/article/details/80467975) 注:若不指明繼承方式,則預設是私有繼承。 一:對於公有繼承(public)方式: 基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的p

常量的定義方式和static在c語言修飾

c語言的常量在執行期間為固定值,在定義後無法被修改常量可以是任何的資料基本型別,可以為整形,浮點常量,字元和字串常量1,使用const關鍵字2, 使用巨集定義3,使用列舉常量   列舉: 1 #include<stdio.h> 2 int main(){ 3 e

C# 使用using的方法

1.using指令using+名稱空間,這種方法基本學習過C#的都用過,好處在於,寫程式碼的時候不需要指定詳細的名稱空間using System.Windows.Media; using System.Windows.Media.Imaging;2.using語句是用來簡化資源釋放的,在一定的範圍內有效,除了

C語言如何計算演算法執行時間

C/C++中的計時函式是clock(),而與其相關的資料型別是clock_t。在MSDN中,查得對clock函式定義如下: clock_t clock( void ); 這個函式返回從“開啟這個程式程序”到“程式中

c/c++測試函式的執行時間(八方法)(轉)

目前,存在著各種計時函式,一般的處理都是先呼叫計時函式,記下當前時間tstart,然後處理一段程式,再呼叫計時函式,記下處理後的時間tend,再tend和tstart做差,就可以得到程式的執行時間,但是各種計時函式的精度不一樣.下面對各種計時函式,做些簡單記錄.

C++ 繼承方式和建構函式執行的順序

C++中的繼承方式有:   public、private、protected三種(它們直接影響到派生類的成員、及其物件對基類成員訪問的規則)。  (1)public(公有繼承):繼承時保持基類中各成員屬性不變,並且基類中private成員被隱藏。派生類的成員只能訪問基類中的

C#New關鍵字的用法

三種用法如下:   在 C# 中,new 關鍵字可用作運算子、修飾符或約束。   1)new 運算子:用於建立物件和呼叫建構函式。這種大家都比較熟悉,沒什麼好說的了。   2)new 修飾符:在用作修飾符時,new 關鍵字可以顯式隱藏從基類繼承的成員。   3)n

C#操作Word(8)—— 向Word插入圖表的方法(一)

一、 前言         本文主要介紹向word中插入圖表的方法。方法共有三種,每一種都有自己的適用範圍和利弊。介紹之前,我們準備實驗用的文件,做一個如下圖所示的word模板,我們要做的的是在這個名叫chart的書籤中插入一個圖表,下面然後我將逐一進行介紹這三種方法:

C++函數的傳遞方式為:值傳遞、指針傳遞和引用傳遞

否則 方式 指針 指向 out 數據結構 logs 形參 使用 C++函數的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞 值傳遞: void fun(int x){ x += 5; //修改的只是y在棧中copy x,x只是y的一個副本,在內存中重新開辟的一塊臨時空間把y

C#學習筆記(12)——方法操作XML

結點 記得 ext 應用程序 eval 資源 特性 pla cells 說明(2017-7-11 16:56:13): 原文地址: C#中常用的幾種讀取XML文件的方法 XML文件是一種常用的文件格式,例如WinForm裏面的app.config以及Web程序中的web.c

C#學習筆記】using 使用方式

ride over 啟動 類型 thread catch key log 調用 1.using指令。using + 命名空間名字,這樣可以在程序中直接用命令空間中的類型,而不必指定類型的詳細命名空間,類似於Java的import,這個功能也是最常用的,幾乎每個cs的程序都會