time命令

测量程序运行时间

命令概述

time 命令用于测量程序的执行时间,是NOI竞赛中分析程序性能的重要工具。

为什么需要测量时间?

  • 评估算法效率:验证时间复杂度是否符合预期
  • 性能优化:找出程序中的性能瓶颈
  • 提交前检查:确保程序在时间限制内完成
  • 比较不同算法:选择最优解法

基本用法


# 基本语法
time <命令>

# 测量程序运行时间
time ./main

# 测量编译时间
time g++ main.cpp -O3 -o main

# 测量带参数的程序
time ./main input.txt

# 保存输出到文件
time ./main > output.txt 2>&1
                

输出示例

real 0m1.234s
user 0m1.100s
sys 0m0.134s

时间指标说明

指标 含义 说明
real 实际时间 程序从开始到结束的总时间
user 用户CPU时间 程序在用户态执行的时间
sys 系统CPU时间 程序在内核态执行的时间

重要关系

$$ \text{real} \geq \text{user} + \text{sys} $$

  • 多核CPU:程序可以并行执行,real可能小于user+sys
  • I/O等待:real可能远大于user+sys
  • NOI评估:主要关注 real 时间

交互式演示

选择不同的算法,观察运行时间差异:

冒泡排序 (O(n²))

运行时间:
0.000s

快速排序 (O(n log n))

运行时间:
0.000s

标准排序 (O(n log n))

运行时间:
0.000s

复杂度对比

数据规模 O(n) - 线性 O(n log n) - 对数线性 O(n²) - 平方
10³1,0009,9661,000,000
10⁴10,000132,877100,000,000
10⁵100,0001,609,43810,000,000,000
10⁶1,000,00019,931,5691,000,000,000,000

操作次数对比(单位:次)

NOI时间限制

题目类型 数据规模 时间限制 建议复杂度
简单题 n ≤ 10³ 1秒 O(n²)
中等题 n ≤ 10⁵ 1-2秒 O(n log n)
难题 n ≤ 10⁶ 2-3秒 O(n) 或 O(n log n)

性能估算

现代计算机每秒可执行约 10⁸ 次简单操作。

  • O(n²):适合 n ≤ 10³
  • O(n log n):适合 n ≤ 10⁵ ~ 10⁶
  • O(n):适合 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