【发布时间】:2013-03-01 11:34:45
【问题描述】:
我刚刚花了一段时间调试一些特别慢的代码,并完全被 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 的行上。在我的实际程序中,load 并没有那么接近另一个位,所以直到我决定不信任分析器时我才想到它。我的问题是:这里发生了什么?为什么会发生这种情况,我是否应该注意这种更奇怪的行为?
我正在使用 MATLAB 2011a。非常感谢。
编辑:我似乎造成了一些混乱,抱歉。情况如下:
- 上面显示的两个
for循环是相同的,只是第二个循环在底部有三行,每次迭代都会写入一个临时文件。 - 第二个循环的运行时间要长得多:结论是最后三行是速度增加的原因。当它们被移除后,代码又很快了。
- 但是,分析器确实不将第二个循环的任何时间归因于最后三个语句。相反,它告诉我我的
load函数调用 - 与第一个循环完全相同的调用,它更快 - 现在需要 4 秒而不是 0.2 秒。因此,要么最后三行的存在 导致load变慢(我忽略了这一点;这甚至有可能吗?),或者 MATLAB 分析器错误地报告load是明显不是时需要 4 秒。
无论如何,在我看来,正在发生一些非常奇怪的事情。
编辑:似乎自己回答了,见下文。因误导而更改标题
【问题讨论】:
-
你是说
load不接受4.41 s并且Matlab 显示错误?您写道,第一个代码 sn-p 中的第二个for循环也采用4.41 s;循环只是加载数据。 -
是的,这正是我要说的。抱歉,如果我说得不够清楚:除了第二个循环中的日志记录之外,这两个循环是相同的,但是大量时间增加错误地归因于
load调用。 -
我想我对代码中三个循环中的第二个感到困惑。我猜你不算第一个循环
-
也是真的,又是我的错!无论如何,我似乎已经解决了 - 见下文。
标签: matlab matlab-load