2

以下は、2 つのプロパティを持つ単純なクラスです。PStruct は、構造体を含むプロパティです。

classdef anobj < handle
    properties
        PStruct
        PNum=1;
    end
    methods
        function obj = anobj()
        end
    end
end

オブジェクトの構造を 1 で埋めるスクリプトを次に示します (非常に高速です)。

clear all
a = anobj(); % an object
b = anobj(); % another object for future use
ntrials=10; niterations=1000;
a.PStruct(ntrials,niterations).field1=0; % 'initialize' the struct array
for t=1:ntrials
    tic;
    for i=1:niterations
        a.PStruct(t,i).field1=1; % store data
    end
    toc;
end

降伏:

Elapsed time is 0.001008 seconds.
Elapsed time is 0.000967 seconds.
Elapsed time is 0.000972 seconds.
Elapsed time is 0.001206 seconds.
Elapsed time is 0.000992 seconds.
Elapsed time is 0.000981 seconds.
Elapsed time is 0.000975 seconds.
Elapsed time is 0.001072 seconds.
Elapsed time is 0.000951 seconds.
Elapsed time is 0.000994 seconds.

代わりに別のオブジェクト (=1 も) のプロパティを使用する場合は、ループ内の行を次のように変更します。

a.PStruct(t,i).field1=b.PNum; % store data

私は得る:

Elapsed time is 0.112418 seconds.
Elapsed time is 0.107359 seconds.
Elapsed time is 0.118347 seconds.
Elapsed time is 0.127111 seconds.
Elapsed time is 0.138606 seconds.
Elapsed time is 0.152675 seconds.
Elapsed time is 0.162610 seconds.
Elapsed time is 0.172921 seconds.
Elapsed time is 0.184254 seconds.
Elapsed time is 0.190802 seconds.

パフォーマンスが桁違いに遅くなるだけでなく、試行ごとに遅くなるという非常に明確な傾向 (より一般的に検証されています) もあります。理解できません。さらに、代わりにオブジェクト プロパティではないスタンドアロンの初期化されていない構造体配列を使用する場合 (この行はループ内の行を置き換えます):

PStruct(t,i).field1=b.PNum; % store data

トレンドなしで良好なパフォーマンスが得られます。

Elapsed time is 0.007143 seconds.
Elapsed time is 0.004208 seconds.
Elapsed time is 0.004312 seconds.
Elapsed time is 0.004382 seconds.
Elapsed time is 0.004302 seconds.
Elapsed time is 0.004545 seconds.
Elapsed time is 0.004499 seconds.
Elapsed time is 0.005840 seconds.
Elapsed time is 0.004210 seconds.
Elapsed time is 0.004177 seconds.

構造体配列とオブジェクトの間には奇妙な相互作用があります。何が起こっているのか、これを修正する方法を知っている人はいますか? ありがとう。

4

1 に答える 1