2

3 つの異なる方法で 40 MB のファイルを読み込んでいます。しかし、最初のものは他の 2 つよりもはるかに高速です。なぜだか分かりますか?最初のクイックメソッドですべてをロードしてからそれらを分離するよりも、ループまたは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

これについての私の2セントは次のとおりです。

JIT アクセラレーターは有効になっていますか?

MATLAB はインタープリター言語であるため、forループは非常に遅くなる可能性があります。ループは、(所定の回数反復するループwhileとは異なり) 反復ごとに終了条件が再評価されるため、さらに遅くなる可能性があります。forそれにもかかわらず、これはパフォーマンスを大幅に向上させることができるJIT アクセラレーションには当てはまりません。

現在、私は MATLAB の近くにいないため、このシナリオを自分で再現することはできませんが、コマンド ウィンドウに次のように入力して、JIT アクセラレーションがオンになっているかどうかを確認できます。

feature accel

結果が である場合は、0無効になっていることを意味し、これがおそらくパフォーマンスの大幅な低下の理由です。

システムコールが多すぎる?

私は の内部構造に詳しくありませんが、ファイル全体を読み取るための 1 回の呼び出しは、複数回の呼び出しよりも少ないシステム コールfreadを呼び出すとしか思えません。通常、システム コールはコストがかかるため、これが速度低下の原因となる場合があります。freadfread

于 2013-01-27T12:32:26.847 に答える