2

なぜ大きな時間差があるのか​​ 誰かが説明できますか?

function [] = maincalc ()

ak=am();

t1=tic;
[out] = myfun (ak.aa, ak.b, ak.c, ak.d, ak.e, ak.f, ak.g, ak.h);
to1end=toc(t1)

t2=tic;
[out2] = myfun2 (ak);
to2end=toc(t2)

結果:

to1end =
   0.047520231560659
to2end =  
  12.490895284055467

class am (これに class を使用する理由はないと誰かが言うかもしれませんが、コード全体ははるかに複雑で長いコードを単純化したものであり、class が必要です):

classdef am 
    properties
        aa = 1;
        b = 2;
        c = 3;
        d = 4;
        e = 2.3;
        f = 4.2;
        g = 5.09;
        h = 12.3;
    end
end

関数 myfun:

function [out] = myfun (aa, b, c, d, e, f, g, h)
n = 500000;
i = 0; j = 0; k = 0; l = 0;
for s = 1:n
    i = aa/b + j*k - i;
    j = c/d ^ 0.5 - j / i;
    k = e*f + aa/3 - k/8;
    l = g + exp (h) + l ^ -1;
end
out.i = i;
out.j = j;
out.k = k;
out.l = l;

関数 myfun2:

function [out] = myfun2 ( ak )
n = 500000;
i = 0; j = 0; k = 0; l = 0;
for s = 1:n
    i = ak.aa/ak.b + j*k - i;
    j = ak.c/ak.d ^ 0.5 - j / i;
    k = ak.e*ak.f + ak.aa/3 - k/8;
    l = ak.g + exp (ak.h) + l ^ -1;
end
out.i = i;
out.j = j;
out.k = k;
out.l = l;

MATLAB のコピー オン ライトについて説明している人をどこかで読んだことがありますが、クラスのどのメンバーにも変更が加えられていないため、ここでは実際には当てはまりません。

================================================== ================================ この行の下の詳細は、2013 年 8 月 2 日に最近追加されました

Marcin は、MATLAB がパラメーターを関数に渡す方法とはあまり関係がないと答えました (ちなみに素晴らしい発見です!) が、それでも何か関係があると思います。別のコードを作成しましたが、今回は 3 つの方法すべてでクラスに複数回アクセスする必要があります。

function [] = maincalc3 ()

inputvar=inputclass();

to1end = 0;
to2end = 0;
to3end = 0;
j = 100;

for i = 1:j;
    t1=tic;
    [out] = func1 (inputvar);
    to1end=toc(t1) + to1end;

    t2=tic;
    [out2] = func2 (inputvar.s);
    to2end=toc(t2) + to2end;

    t3=tic;
    [out3] = func3 (inputvar);
    to3end=toc(t3) + to3end;
end

...................................

classdef inputclass
    properties
        s  = 1;
    end
end

................................................

function f = func1 (inputvar)
    f = inputvar.s;
end

................................................

function f = func2 (s)
    f = s;
end

................................................

function [f] = func3 (inputvar)
    s=inputvar.s;
    f = s;
end

そして結果:

to1end =
   0.002419525505078
to2end =
   0.001517134538850
to3end =
   0.002353777529397

func1()func3()ほぼ同じ時間がfunc2かかりますが、所要時間は約 60% 短縮されます。それは、MATLAB がパラメーターを関数に渡す方法 (値またはオブジェクト) がパフォーマンスに影響するということではないでしょうか?

4

1 に答える 1