fread()优化matlab

时间:2013-01-26 21:39:32

标签: matlab optimization fread

我正在以三种不同的方式阅读40 MB的文件。但第一个比另外两个更快。你们有个想法为什么?我宁愿在循环或whiles中实现条件来分离数据,而不是使用第一个快速方法加载所有内容然后将它们分开 - 保存内存 -

LL=10000000;

fseek(fid,startbytes, 'bof');

%% Read all at once %%%%%%%%%%%%%%%%%%%%%%
tic
AA(:,1)=int32(fread(fid,LL,'int32'));
toc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fseek(fid,startbytes,'bof');

%% Read all using WHILE loop %%%%%%%%%%%%%
tic
i=0;
AA2=int32(zeros(LL,1));
while i<LL
    i=i+1;
    AA2(i,1)=fread(fid,1,'int32');      
end
toc 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fseek(fid,startbytes,'bof');

%% Read all using FOR loop %%%%%%%%%%%%%%%
tic
AA3=int32(zeros(LL,1));
for i=1:LL
    AA3(i,1)=fread(fid,1,'int32');      
end
toc 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

经过的时间是0.312916秒。

经过的时间是138.811520秒。

经过的时间是116.799286秒。

1 个答案:

答案 0 :(得分:2)

以下是我的两分钱:

是否启用了JIT加速器?

由于MATLAB是一种解释型语言,for循环可能非常慢。 while循环甚至可能更慢,因为在每次迭代中重新评估终止条件(与迭代预定次数的for循环不同)。然而,JIT acceleration并非如此,这可以显着提升他们的表现。

我目前不在MATLAB附近,因此我无法自行重现此方案,但您可以通过在命令窗口中键入以下内容来检查自己是否启用了JIT加速:

feature accel

如果结果为0,则意味着它已被禁用,这可能是性能大幅下降的原因。

系统调用太多了?

我不熟悉fread的内部,但我只能假设一个fread调用来读取整个文件的次数比fread少{{1}}次调用。系统调用通常很昂贵,因此在某种程度上可以解释减速。