C++如何计算冒泡/插入/选择排序函数的毫秒级运行时间及可用内置函数
C++ 排序算法毫秒级计时实现方案
C++11及更高版本的标准库已经提供了内置的高精度计时能力,完全可以满足毫秒级运行时长的统计需求,无需依赖任何第三方库。
推荐使用的内置组件
优先使用标准库的 <chrono> 头文件提供的计时接口,这是跨平台的官方标准方案,精度和安全性都远高于传统C语言的计时接口。
具体实现步骤
- 第一步:引入计时头文件
#include <chrono> - 第二步:在排序函数执行前,记录当前时间点:
auto start = std::chrono::high_resolution_clock::now(); - 第三步:执行目标排序函数(冒泡/插入/选择排序均可)
- 第四步:排序函数执行完成后,记录结束时间点:
auto end = std::chrono::high_resolution_clock::now(); - 第五步:将时间差转换为毫秒单位:
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); - 第六步:调用
duration.count()即可获取整数类型的毫秒级运行时长。
完整可运行示例代码
#include <iostream> #include <chrono> #include <vector> #include <algorithm> // 冒泡排序实现 void bubbleSort(std::vector<int>& arr) { int n = arr.size(); for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-i-1; j++) { if (arr[j] > arr[j+1]) { std::swap(arr[j], arr[j+1]); } } } } // 插入排序实现 void insertionSort(std::vector<int>& arr) { int n = arr.size(); for (int i = 1; i < n; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j+1] = arr[j]; j--; } arr[j+1] = key; } } // 选择排序实现 void selectionSort(std::vector<int>& arr) { int n = arr.size(); for (int i = 0; i < n-1; i++) { int min_idx = i; for (int j = i+1; j < n; j++) { if (arr[j] < arr[min_idx]) { min_idx = j; } } std::swap(arr[i], arr[min_idx]); } } int main() { // 生成10000个随机数作为测试数据 std::vector<int> testArr(10000); std::generate(testArr.begin(), testArr.end(), [](){ return rand() % 10000; }); // 统计冒泡排序耗时 auto bubbleArr = testArr; auto start = std::chrono::high_resolution_clock::now(); bubbleSort(bubbleArr); auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); std::cout << "冒泡排序运行时长:" << duration.count() << " ms\n"; // 统计插入排序耗时 auto insertionArr = testArr; start = std::chrono::high_resolution_clock::now(); insertionSort(insertionArr); end = std::chrono::high_resolution_clock::now(); duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); std::cout << "插入排序运行时长:" << duration.count() << " ms\n"; // 统计选择排序耗时 auto selectionArr = testArr; start = std::chrono::high_resolution_clock::now(); selectionSort(selectionArr); end = std::chrono::high_resolution_clock::now(); duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); std::cout << "选择排序运行时长:" << duration.count() << " ms\n"; return 0; }
注意事项
- 如果测试数据量过小导致排序执行太快,毫秒级返回结果为0,可以把单位替换为微秒
std::chrono::microseconds获取更高精度的结果,也可以让排序函数循环执行多次后取平均值,统计结果会更准确。 - 不推荐使用C标准库的
clock()函数,该函数统计的是CPU占用时间而非实际墙钟时间,多线程场景下统计结果偏差极大,精度也低于<chrono>库接口。 <chrono>是纯头文件的标准库组件,编译时不需要链接额外库,所有主流编译器(GCC、Clang、MSVC)都完全支持。
内容的提问来源于stack exchange,提问作者Asadullah Shaukat
相关产品推荐
相关产品推荐

