2013-07-31 76 views
2

有人可以解釋爲什麼有顯着的時間差異?MATLAB通過值vs對象

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 

類時(我知道有人會說,沒有理由使用類此,而是整個代碼是一個更爲複雜和長期的簡化代碼,和類是必要的):

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傳遞參數給函數的方式沒有多大關係(順便提一下,很棒的發現!),但我認爲它仍然與它有關。我做了另一個代碼,這一次所有三種方法需要訪問該類多次:

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將參數傳遞給函數的方式 - 通過值或對象 - 確實會影響性能?

+1

Matlab中的OOP很慢。與本地變量相比,屬性訪問可能花費更多時間。添加方法get/set時更糟糕。您可以查看此網頁:http://stackoverflow.com/questions/1693429/is-matlab-oop-slow-or-am-i-doing-something-wrong – Yuan

+0

是啊,我同意,這是最好的,如果能避免OOP 。但我現在的任務是弄清楚爲什麼需要更多時間。 – saiful

回答

4

我認爲它與通過值或引用將對象傳遞給函數沒有多大關係。其原因很簡單,因爲在你的循環中,matlab需要多次訪問對象及其字段。而已。

例如,如果你讓叫myfun3()第三功能如下:

function [out] = myfun3 (ak) 
n = 500000; 
i = 0; j = 0; k = 0; l = 0; 

% FOLLOWING LINE IS NEW <----- 
% REMOVE object refencese from within the loop and create local variables 
% to use in the loop, instead of referencing object properties all the time. 
aa = ak.aa; b = ak.b; c=ak.c; d=ak.d; e=ak.e; f=ak.f; g=ak.g; h=ak.h; 

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; 

這個函數的執行甚至略快於myfun1()。在我的電腦上的數據是:

to1end = 

    0.0533 


to2end = 

    23.9410 


to3end = 

    0.0526 % RESULT for myfun3() function 
+0

很棒的發現,Marcin!我爲這個問題添加了新的細節,我希望你也可以看看。 – saiful