2

我正在用三种不同的方式读取一个 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 秒。

4

1 回答 1

2

这是我的两分钱:

是否启用了 JIT 加速器?

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

我现在不在 MATLAB 附近,所以我自己无法重现这种情况,但是您可以通过在命令窗口中键入以下内容来检查自己是否打开了 JIT 加速:

feature accel

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

系统调用太多?

我不熟悉 的内部结构fread,但我只能假设一次fread读取整个文件的调用调用的系统调用少于多次fread调用。系统调用通常很昂贵,因此这在某种程度上可以解释速度放缓。

于 2013-01-27T12:32:26.847 回答