有人可以解釋爲什麼有顯着的時間差異?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將參數傳遞給函數的方式 - 通過值或對象 - 確實會影響性能?
Matlab中的OOP很慢。與本地變量相比,屬性訪問可能花費更多時間。添加方法get/set時更糟糕。您可以查看此網頁:http://stackoverflow.com/questions/1693429/is-matlab-oop-slow-or-am-i-doing-something-wrong – Yuan
是啊,我同意,這是最好的,如果能避免OOP 。但我現在的任務是弄清楚爲什麼需要更多時間。 – saiful