测量程序运行时间
time 命令用于测量程序的执行时间,是NOI竞赛中分析程序性能的重要工具。
# 基本语法
time <命令>
# 测量程序运行时间
time ./main
# 测量编译时间
time g++ main.cpp -O3 -o main
# 测量带参数的程序
time ./main input.txt
# 保存输出到文件
time ./main > output.txt 2>&1
| 指标 | 含义 | 说明 |
|---|---|---|
| real | 实际时间 | 程序从开始到结束的总时间 |
| user | 用户CPU时间 | 程序在用户态执行的时间 |
| sys | 系统CPU时间 | 程序在内核态执行的时间 |
$$ \text{real} \geq \text{user} + \text{sys} $$
选择不同的算法,观察运行时间差异:
| 数据规模 | O(n) - 线性 | O(n log n) - 对数线性 | O(n²) - 平方 |
|---|---|---|---|
| 10³ | 1,000 | 9,966 | 1,000,000 |
| 10⁴ | 10,000 | 132,877 | 100,000,000 |
| 10⁵ | 100,000 | 1,609,438 | 10,000,000,000 |
| 10⁶ | 1,000,000 | 19,931,569 | 1,000,000,000,000 |
操作次数对比(单位:次)
| 题目类型 | 数据规模 | 时间限制 | 建议复杂度 |
|---|---|---|---|
| 简单题 | n ≤ 10³ | 1秒 | O(n²) |
| 中等题 | n ≤ 10⁵ | 1-2秒 | O(n log n) |
| 难题 | n ≤ 10⁶ | 2-3秒 | O(n) 或 O(n log n) |
现代计算机每秒可执行约 10⁸ 次简单操作。
#include <cstdio>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main() {
auto start = high_resolution_clock::now();
// 你的代码
for (int i = 0; i < 1000000; i++);
auto end = high_resolution_clock::now();
auto duration = duration_cast<microseconds>(end - start);
printf("运行时间: %.3f 秒\n", duration.count() / 1000000.0);
return 0;
}
// 或者使用 clock() 函数
#include <ctime>
int main() {
clock_t start = clock();
// 你的代码
for (int i = 0; i < 1000000; i++);
clock_t end = clock();
double time_used = (double)(end - start) / CLOCKS_PER_SEC;
printf("运行时间: %.3f 秒\n", time_used);
return 0;
}
# 测试多个输入文件
for i in {1..10}; do
echo "测试 test$i.in"
time ./main < test$i.in > test$i.out
done
# 运行5次,取平均值
for i in {1..5}; do
time ./main < test.in
done