我刚刚花了一些时间调试一些特别慢的代码,并且完全被 MATLAB 分析器抛弃了。在我看来,这就像一个巨大的错误,所以我想知道是否有人可以对这里发生的事情有所了解。
这是一些会导致问题的代码:
function profiler_test
%%% Create 20 files with random data
count = 20;
for i = 1 : count
x = rand(3);
save(sprintf('temp_file_%06d', i), 'x');
end
%%% Load them in a for loop
xs = cell(1, count);
tic;
for i = 1 : count
x = load(sprintf('temp_file_%06d', i), 'x');
xs{i} = x.x;
end
toc
%%% Load them in a for loop, but writing a small log file on the way
tic;
for i = 1 : count
x = load(sprintf('temp_file_%06d', i), 'x');
xs{i} = x.x;
file = fopen(sprintf('temp_logfile_%d', i), 'w');
fprintf(file, 'Success\n');
fclose(file);
end
toc
end
第一个for
循环需要 0.239739 秒,第二个循环需要 4.411179。
现在,我应该明确表示我知道我的草率想法,如第二个for
循环示例所示,为每个结果创建一个日志文件 - 这是因为我在一个看不到的集群上运行输出,我想要一个函数进度的廉价指示,结果证明这是瓶颈。我很好。
然而,我的问题是我花了一天时间试图优化错误的行,因为 MATLAB 分析器这样说:
1 24 tic;
1 25 for i = 1 : count
4.41 20 26 x = load(sprintf('temp_file_%06d', i), 'x');
20 27 xs{i} = x.x;
28
20 29 file = fopen(sprintf('temp_logfile_%d', i), 'w');
20 30 fprintf(file, 'Success\n');
20 31 fclose(file);
20 32 end
1 33 toc
它将执行最后三行所花费的全部load
时间放在 for 行上。在我的实际程序中,load
它与另一位不太接近,所以直到我决定不信任分析器时才想到它。我的问题是:这里发生了什么?为什么会发生这种情况,我应该提防任何更奇怪的行为吗?
我正在使用 MATLAB 2011a。非常感谢。
编辑:我似乎造成了一些混乱,道歉。情况如下:
- 上面显示的两个
for
循环是相同的,除了第二个循环在底部有三行,每次迭代都会写入一个临时文件。 - 第二个循环需要更长的时间来运行:结论是最后三行是速度增加的罪魁祸首。当它们被删除时,代码又很快了。
- 但是,分析器不会将第二个循环的任何时间归因于最后三个语句。相反,它告诉我我的
load
函数调用 -与第一个循环完全相同的调用,它更快- 现在需要 4 秒而不是 0.2 秒。因此,要么最后三行的存在导致速度load
变慢(我忽略了这一点;这甚至有可能吗?),或者 MATLAB 分析器错误地报告load
需要 4 秒,而显然不是。
无论哪种方式,在我看来,正在发生一些非常奇怪的事情。
编辑:似乎自己回答了,见下文。更改标题,因为它具有误导性