2013-07-31 3 views
2

큰 시간 차이가있는 이유를 설명 할 수 있습니까? MATLAB이 값을 객체와 비교하여 전달합니다.

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의 복사 (copy-on-write)에 대해 설명 어딘가 사람을 읽고,하지만 클래스의 구성원으로 만든 변경이 없기 때문에 그건 정말 여기에 적용되지 않습니다.

============================================== ===

마르신는 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 
을 ....................

to1end = 
    0.002419525505078 
to2end = 
    0.001517134538850 
to3end = 
    0.002353777529397 
: 0

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

하고 결과를 ................................................

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

나는 그것이 함수에 값 또는 참조로 객체를 전달과 함께 할 일이 많이없는이있다 생각합니다. 단순히 루프에 있기 때문에 myfun2() matlab에서 객체와 필드에 여러 번 액세스해야하기 때문입니다. 그게 전부 야. u는 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().내 PC에서 resutls는 다음과 같습니다 :

to1end = 

    0.0533 


to2end = 

    23.9410 


to3end = 

    0.0526 % RESULT for myfun3() function 
+0

위대한 발견, Marcin! 나는이 질문에 새로운 세부 사항을 추가했다. 나는 그것에 대해서도 살펴볼 수 있기를 바란다. – saiful

관련 문제