我正在以三种不同的方式阅读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秒。
答案 0 :(得分:2)
以下是我的两分钱:
由于MATLAB是一种解释型语言,for
循环可能非常慢。 while
循环甚至可能更慢,因为在每次迭代中重新评估终止条件(与迭代预定次数的for
循环不同)。然而,JIT acceleration并非如此,这可以显着提升他们的表现。
我目前不在MATLAB附近,因此我无法自行重现此方案,但您可以通过在命令窗口中键入以下内容来检查自己是否启用了JIT加速:
feature accel
如果结果为0
,则意味着它已被禁用,这可能是性能大幅下降的原因。
我不熟悉fread
的内部,但我只能假设一个fread
调用来读取整个文件的次数比fread
少{{1}}次调用。系统调用通常很昂贵,因此在某种程度上可以解释减速。