最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在C++中測量代碼執(zhí)行時間的兩種方法

 更新時間:2026年01月07日 09:54:06   作者:weixin_pk138132  
在C++中,編寫代碼只是第一步,衡量代碼的效率同樣重要,你如何知道你的 sort 算法比同事寫的快?或者你的新功能導致了多少性能下降?你需要一個秒表來精確測量代碼的執(zhí)行時間,本文給大家介紹了在C++中測量代碼執(zhí)行時間的兩種方法,需要的朋友可以參考下

在C++中,編寫代碼只是第一步,衡量代碼的“效率”同樣重要。你如何知道你的 sort 算法比同事寫的快?或者你的新功能導致了多少性能下降?你需要一個“秒表”來精確測量代碼的執(zhí)行時間。

在C++(及C語言)中,你有兩種主要的“秒表”:

C 風格 “CPU 秒表” (<ctime>/clock())

  • 比喻: 這是一個老式的“機械秒表”,它只在你的 CPU **真正在為你的程序“工作”(執(zhí)行指令)**時才會“嘀嗒”。
  • 特點: 它測量的是 CPU 時間 (CPU Time)。如果你的程序在“等待”(比如 sleep、等待用戶輸入或等待網絡響應),這個秒表會暫停
  • 精度: 較低,受限于 CLOCKS_PER_SEC 宏。

現代 C++ 風格 “高精度電子秒表” (<chrono>)

  • 比喻: 這是一個高精度的“電子秒表”,它測量的是墻上時鐘 (Wall Clock) 走過的時間。
  • 特點: 它測量的是真實世界流逝的時間。從你按下“開始”到按下“停止”,無論你的程序是在“工作”還是“等待”,它都在計時。
  • 精度: 極高(通??梢赃_到納秒 ns 級別)。
  • 這是現代C++中(C++11及以后)強烈推薦的方式。

在本教程中,你將學會:

  • C 風格 clock():如何使用“CPU 秒表”。
  • C++ std::chrono:如何使用“高精度電子秒表”(推薦!)。
  • 新手的“頭號噩夢”CPU 時間 vs 掛鐘時間 (Wall Time) 的致命區(qū)別。
  • 實戰(zhàn)演練:通過代碼對比兩種計時器的不同結果。
  • “X光透 視”:用調試器“親眼目睹”時間點(time_point)對象。

前置知識說明 (100% 自洽):

  • 變量 (Variable):理解存儲數據的“盒子”,如 double time_taken;。
  • 函數 (Function):理解可重復使用的“代碼積木”。
  • #include:如何包含C++標準庫(如 <iostream>, <ctime>, <chrono>)。
  • cout:C++ 中用于在屏幕上打印信息的“揚聲器”。
  • 類型轉換 (Casting):如 double(value),將 value 轉換為 double 類型。
  • 編譯 (Compile):C++代碼(“食譜”)必須被“編譯”(“烘焙”),才能變成電腦可執(zhí)行的程序(“蛋糕”)。

第一部分:C 風格clock()(“CPU 秒表”)

clock() 函數在 <ctime> 庫中。它返回程序啟動到當前時刻為止,CPU 花在你程序上的“嘀嗒數”(Clock Ticks)。

核心步驟:

  1. 包含 <ctime>
  2. 在代碼開始前,調用 clock_t start = clock(); 記錄“開始嘀嗒數”。
  3. 在代碼結束后,調用 clock_t end = clock(); 記錄“結束嘀嗒數”。
  4. 計算差值 double(end - start),然后除以 CLOCKS_PER_SEC (一個系統(tǒng)常量,表示“每秒多少嘀嗒數”),得到秒數。

clock_example.cpp

#include <iostream>
#include <ctime> // 1. 包含 C 時間庫
using namespace std;

// 一個耗時的函數 (模擬 CPU 密集型工作)
void heavy_work() {
    // 執(zhí)行一個(通常會被編譯器優(yōu)化的)空循環(huán)來消耗 CPU 時間
    // 在實際測試時,應使用 -O0 (關閉優(yōu)化) 來觀察
    for(long i = 0; i < 3000000000L; ++i) {}
}

int main() {
    cout << "--- 測試 C 風格 <ctime> (clock_t) ---" << endl;
    cout << "每秒“嘀嗒”數 (CLOCKS_PER_SEC): " << CLOCKS_PER_SEC << endl;

    // 1. 獲取開始時的“CPU嘀嗒數”
    clock_t start = clock();

    // 2. 執(zhí)行你的代碼
    heavy_work();

    // 3. 獲取結束時的“CPU嘀嗒數”
    clock_t end = clock();

    // 4. 計算時間差 (秒)
    double cpu_time_taken = double(end - start) / double(CLOCKS_PER_SEC);

    cout << "CPU 耗時: " << cpu_time_taken << " 秒" << endl;
    
    return 0;
}

“手把手”終端模擬 (結果因機器和編譯優(yōu)化而異):

PS C:\MyCode> g++ clock_example.cpp -o clock_example.exe -O0 # -O0 關閉優(yōu)化
PS C:\MyCode> .\clock_example.exe
--- 測試 C 風格 <ctime> (clock_t) ---
每秒“嘀嗒”數 (CLOCKS_PER_SEC): 1000
CPU 耗時: 1.156 秒

缺點: 精度不高,且無法測量“等待”時間。

第二部分:現代 C++std::chrono(“高精度電子秒表”)

std::chrono 庫 (C++11) 是現代C++的黃金標準。它提供了高精度時鐘和時間單位(納秒、微秒、毫秒等)。

核心步驟:

  1. 包含 <chrono>
  2. 使用 auto start = std::chrono::high_resolution_clock::now(); 獲取當前掛鐘時間點。
  3. 使用 auto end = std::chrono::high_resolution_clock::now(); 獲取結束時間點
  4. 計算差值:end - start,得到一個 duration (時間段) 對象。
  5. 使用 std::chrono::duration_cast 將這個 duration 對象轉換為你想要的單位(如毫秒)。

chrono_example.cpp (推薦用法)

#include <iostream>
#include <chrono> // 1. 包含 C++11 時間庫
#include <thread> // 2. 包含線程庫 (用來演示“等待”)
using namespace std;

// 使用 using 來簡化類型名 (可選,但推薦)
using std::chrono::high_resolution_clock;
using std::chrono::duration_cast;
using std::chrono::duration;
using std::chrono::milliseconds;
using std::chrono::microseconds;

// 耗時函數 (包含工作和等待)
void work_and_sleep() {
    // 模擬 CPU 工作
    for(long i = 0; i < 3000000000L; ++i) {} 

    // 模擬 I/O 等待或休眠 (500毫秒)
    cout << "  (正在休眠 500 毫秒...)" << endl;
    std::this_thread::sleep_for(milliseconds(500));
}

int main() {
    cout << "--- 測試 現代 C++ <chrono> ---" << endl;
    
    // 1. 獲取開始時間點
    auto start_time = high_resolution_clock::now();

    // 2. 執(zhí)行你的代碼
    work_and_sleep();

    // 3. 獲取結束時間點
    auto end_time = high_resolution_clock::now();

    // 4. 計算時間差
    // 結果是一個 duration 對象
    auto duration_total = duration_cast<milliseconds>(end_time - start_time);
    
    // 5. 打印結果
    cout << "總耗時 (掛鐘時間): " << duration_total.count() << " 毫秒" << endl;

    // 也可以轉換為其他單位
    auto duration_us = duration_cast<microseconds>(end_time - start_time);
    cout << "  (即 " << duration_us.count() << " 微秒)" << endl;

    return 0;
}

“手把手”終端模擬 (結果因機器而異):

PS C:\MyCode> g++ chrono_example.cpp -o chrono_example.exe -std=c++11 -O0 -pthread
PS C:\MyCode> .\chrono_example.exe
--- 測試 現代 C++ <chrono> ---
  (正在休眠 500 毫秒...)
總耗時 (掛鐘時間): 1658 毫秒
  (即 1658390 微秒)

頓悟時刻: 結果 1658 毫秒,約等于 1158 毫秒 (CPU工作) + 500 毫秒 (休眠)。<chrono> 正確地測量了所有流逝的時間!

第三部分:新手的“頭號噩夢”——clock()vs<chrono>

讓我們把兩個“秒表”放在同一個程序里,測量同一個函數,看看它們的區(qū)別。

comparison.cpp (關鍵對比)

#include <iostream>
#include <ctime>
#include <chrono>
#include <thread>
using namespace std;

// (函數 work_and_sleep 同上)
void work_and_sleep() {
    for(long i = 0; i < 3000000000L; ++i) {} 
    cout << "  (正在休眠 500 毫秒...)" << endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
}

int main() {
    // --- 1. <chrono> 計時 (掛鐘時間) ---
    auto start_chrono = std::chrono::high_resolution_clock::now();
    
    // --- 2. <ctime> 計時 (CPU 時間) ---
    clock_t start_clock = clock();

    // --- 3. 執(zhí)行同一個函數 ---
    cout << "--- 正在執(zhí)行 work_and_sleep... ---" << endl;
    work_and_sleep();
    cout << "--- 執(zhí)行完畢 ---" << endl;

    // --- 4. 獲取 <ctime> 結果 ---
    clock_t end_clock = clock();
    double cpu_time = double(end_clock - start_clock) / double(CLOCKS_PER_SEC);
    
    // --- 5. 獲取 <chrono> 結果 ---
    auto end_chrono = std::chrono::high_resolution_clock::now();
    auto wall_time_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end_chrono - start_chrono);

    // --- 6. 打印對比 ---
    cout << "\n--- 結果對比 ---" << endl;
    cout << "CPU 秒表 (clock()): " << cpu_time * 1000 << " 毫秒" << endl;
    cout << "電子秒表 (chrono): " << wall_time_ms.count() << " 毫秒" << endl;

    return 0;
}

“手把手”終端模擬 (結果因機器而異):

PS C:\MyCode> g++ comparison.cpp -o comparison.exe -std=c++11 -O0 -pthread
PS C:\MyCode> .\comparison.exe
--- 正在執(zhí)行 work_and_sleep... ---
  (正在休眠 500 毫秒...)
--- 執(zhí)行完畢 ---

--- 結果對比 ---
CPU 秒表 (clock()): 1162 毫秒 # <-- 只有 CPU 工作的時間!
電子秒表 (chrono): 1663 毫秒 # <-- CPU 工作 (1162) + 休眠 (500)

“黃金法則”:

  • 當你想知道“我的代碼占用了多少 CPU 資源?”(用于算法分析),clock() 可以用(但 <chrono> 也有 CPU 時鐘)。
  • 當你想知道“用戶等了多久?”(從按下按鈕到看到結果),永遠使用 std::chrono::high_resolution_clock!這幾乎是你 99% 情況下想要的答案。

第四部分:“X光透 視”——觀察時間點

auto start_time = high_resolution_clock::now(); 返回的對象是一個 time_point(時間點)。它通常只是一個(非常大的)數字,代表從某個“紀 元”(比如1970年1月1日,或計算機啟動時)到現在的納秒數。

“X光”實戰(zhàn)(基于chrono_example.cpp)

  1. 設置斷點:
    • main 函數的第31行auto start_time = ...之后。
    • main 函數的第36行auto end_time = ...之后。
  2. 啟動調試 (F5)。
  3. 第一次“凍結” (第31行后):
    • 觀察“變量”(VARIABLES)窗口: 找到 start_time
    • 展開 start_time:你會看到它內部可能有一個成員,比如 _M_time_since_epoch_Rep (內部表示)。
    • 你會看到: 一個巨大的數字,例如 1678886400123456789 (納秒)。
  4. 繼續(xù)執(zhí)行 (F5)。
  5. 第二次“凍結” (第36行后):
    • 觀察“變量”窗口: 找到 end_time。
    • 展開 end_time
    • 你會看到: 另一個巨大的數字,例如 1678886401783456789。
  6. (關鍵?。?ldquo;監(jiān)視” (WATCH) 窗口:
    • 動作: 在“監(jiān)視”窗口中,添加這個表達式:
      std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count()
    • 你會看到: 1660 (或者你的實際測量值)!
    • 頓悟時刻: 調試器向你展示了 chrono 庫是如何通過兩個“時間點”相減,得到一個“時間段”,并最終轉換為你需要的單位的。

動手試試!(終極挑戰(zhàn):你的“排序分析器”)

現在,你來當一次“算法分析師”。

任務:

  1. “激活” iostream, vector, algorithm (為了 std::sort), chronorandom (為了生成隨機數)。
  2. 創(chuàng)建一個非常大vector<int> (例如,1,000,000 個元素),并用隨機數字填充它。
  3. 使用 std::chrono(高精度電子秒表):
    • 在調用 std::sort 之前,獲取“開始時間”。
    • 調用 std::sort(myVector.begin(), myVector.end());。
    • std::sort 之后,獲取“結束時間”。
  4. 計算時間差,并以毫秒 (milliseconds) 為單位,打印出排序一百萬個隨機整數所花費的時間。

sort_timer.cpp (你的 TODO):

#include <iostream>
#include <vector>
#include <algorithm> // 需要 std::sort
#include <chrono>    // 需要計時
#include <random>    // 需要隨機數
using namespace std;

// (使用 using std::chrono::... 來簡化)
using std::chrono::high_resolution_clock;
using std::chrono::duration_cast;
using std::chrono::milliseconds;

int main() {
    // --- 1 & 2: 創(chuàng)建并填充 100 萬個隨機數 ---
    const int N = 1000000;
    vector<int> numbers;
    numbers.reserve(N); // 預分配內存,提高效率
    
    std::random_device rd;  // 隨機數種子源
    std::mt19937 gen(rd()); // 隨機數引擎
    std::uniform_int_distribution<> distrib(1, N); // 分布范圍
    
    cout << "正在生成 " << N << " 個隨機數..." << endl;
    for (int i = 0; i < N; ++i) {
        numbers.push_back(distrib(gen));
    }
    cout << "生成完畢。" << endl;

    // --- TODO 3: 計時 ---
    cout << "\n--- 開始排序... ---" << endl;
    
    // auto startTime = ...;
    
    // std::sort(... , ...); // 執(zhí)行排序
    
    // auto endTime = ...;
    
    // --- TODO 4: 計算并打印 ---
    // auto timeTaken_ms = ...;
    
    // cout << "排序 " << N << " 個元素耗時: " 
    //      << timeTaken_ms.count() << " 毫秒" << endl;

    return 0;
}

這個挑戰(zhàn)讓你實踐了如何使用 std::chrono 來測量一個真實、有意義的計算任務(std::sort)的性能。完成它,你就掌握了C++中最重要、最準確的計時工具!

以上就是在C++中測量代碼執(zhí)行時間的兩種方法的詳細內容,更多關于C++測量代碼執(zhí)行時間的資料請關注腳本之家其它相關文章!

相關文章

  • C語言遞歸實現字符串逆序的方式詳解

    C語言遞歸實現字符串逆序的方式詳解

    這篇文章主要介紹了C語言遞歸實現字符串逆序的方式詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • C語言中bool變量的深入理解

    C語言中bool變量的深入理解

    C語言中沒有BOOL類型變量,它是C++獨有的,由于使用BOOL類型可以使代碼更具有可讀性,下面這篇文章主要給大家介紹了關于C語言中bool變量的相關資料,需要的朋友可以參考下
    2021-08-08
  • C語言實現自動售貨機

    C語言實現自動售貨機

    這篇文章主要為大家詳細介紹了C語言實現自動售貨機,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 解析shell排序的實現代碼

    解析shell排序的實現代碼

    本篇文章是對shell排序的實現代碼進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 初學C++之自定義類型名簡化詳解

    初學C++之自定義類型名簡化詳解

    下面小編就為就大家?guī)硪黄鯇WC++之自定義類型名簡化詳解。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • C++調用matlab引擎實現三維圖的繪制

    C++調用matlab引擎實現三維圖的繪制

    這篇文章主要為大家詳細介紹了C++如何調用matlab引擎實現三維圖的繪制,文中的示例代碼講解詳細,對我們學習C++和Matlab有一定的幫助,需要的可以參考一下
    2022-12-12
  • 一文詳解Qt中線程的實際應用

    一文詳解Qt中線程的實際應用

    為了讓程序盡快響應用戶操作,在開發(fā)應用程序時經常會使用到線程。這篇文章就來和大家介紹一下Qt中線程的實際應用,感興趣的小伙伴可以了解一下
    2023-03-03
  • C++ 實現稀疏矩陣的壓縮存儲的實例

    C++ 實現稀疏矩陣的壓縮存儲的實例

    這篇文章主要介紹了C++ 實現稀疏矩陣的壓縮存儲的實例的相關資料,M*N的矩陣,矩陣中有效值的個數遠小于無效值的個數,且這些數據的分布沒有規(guī)律,需要的朋友可以參考下
    2017-07-07
  • C++實現大整數乘法(字符串乘法)

    C++實現大整數乘法(字符串乘法)

    這篇文章主要為大家詳細介紹了C++實現大整數乘法、字符串乘法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C++概念重載、覆蓋、隱藏的使用說明

    C++概念重載、覆蓋、隱藏的使用說明

    本篇文章介紹了,在C++中概念重載、覆蓋、隱藏的使用分析說明。需要的朋友參考下
    2013-05-05

最新評論

昌都县| 积石山| 深圳市| 黄冈市| 武陟县| 清原| 城市| 遵化市| 二连浩特市| 阳信县| 洛川县| 隆化县| 汉阴县| 华阴市| 新平| 修武县| 安福县| 商都县| 阿坝| 沅陵县| 潞西市| 即墨市| 琼中| 皮山县| 宜州市| 武穴市| 观塘区| 洛隆县| 长汀县| 永平县| 专栏| 大邑县| 车险| 威海市| 达拉特旗| 石屏县| 揭阳市| 天峻县| 阳江市| 离岛区| 游戏|