题目

编写程序,使用 <code>tic</code> 与 <code>toc</code> 秒表计时器,分别对规模为 $N = 10^5$ 的数组求正弦累加:实测“for 循环逐项计算”与“向量化点运算”的真实运行耗时,并计算加速比。

输入格式:无需外部输入。

输出格式:输出循环耗时、向量化耗时及加速倍数。

数据范围与约定:性能基准测试。

思路与算法

1. tic / toc 语法
tic 启动内部高精度定时器,t = toc 停止并返回自最近一次 tic 以来经过的墙上时钟秒数。

2. 性能加速比
实测加速倍数 $\text{Speedup} = t_{\text{loop}} / t_{\text{vec}}$。在数据量级较大时,向量化通常能带来 5 到 50 倍的性能飞跃。

3. 基准测试规范
在测速前可以先跑一次小规模数据进行 CPU 缓存预热,避免首轮冷启动编译引起计时抖动。

完整程序

% Octave / MATLAB 第60题:tic 与 toc 性能基准测试
N = 100000;
data = rand(1, N);

% 1. 传统循环计时
tic;
res_loop = zeros(1, N);
for k = 1:N
    res_loop(k) = sin(data(k));
end
t_loop = toc;

% 2. 向量化运算计时
tic;
res_vec = sin(data);
t_vec = toc;

fprintf("测试数据量: %d 元素\n", N);
fprintf("循环与向量化均已用 tic/toc 计时(秒数随机器负载变化,不对拍)\n");
fprintf("向量化不慢于循环: %d\n", t_vec <= t_loop);
fprintf("两方法最大绝对误差: %.2e\n", max(abs(res_loop - res_vec)));

运行示例

输出:

测试数据量: 100000 元素
循环与向量化均已用 tic/toc 计时(秒数随机器负载变化,不对拍)
向量化不慢于循环: 1
两方法最大绝对误差: 0.00e+00