2013-09-03 18 views
6

Napisałem prosty kod C++ i przetestowałem go w C++, a następnie zaadoptowałem ten sam kod dla MATLAB przez mex file_name.cpp i uruchomiłem ten sam kod w MATLAB, który używa tego samego kompilatora co C++. Oto kod:Porównanie programu Matlab kontra C++ w tym kodzie

int k; 
for(int j = 0; j < 100;j++){ 
    for(int i = 0; i < 10000000; i++){ 
     k++; 
    } 
    k/=10000000 
} 

tutaj jest kod MATLAB:

double a;int j;int i; 
double* k; 

for(j = 0; j < 100;j++){ 
    for(i = 0; i < 10000000; i++){ 
     a = a+1; 
    } 
    a = a/10000000; 
} 

plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); 
k = mxGetPr(plhs[0]); 
*k = (double)a; 

Mam edytować ten kod MATLAB, czyli zmianę do odpowiednich typów, dodając MEX-funkcyjny itp i wyniki są ok 900ms w MATLAB w przeciwieństwie do 3100 ms w C++.

Co ja nie rozumiem, jak działają ten sam kod i z tego samego kompilatora (w Matlab Piszę mex -setup w wierszu poleceń i wybrany jako kompilator Visual Studio MEX kompilatora), jednak MATLAB jest około 3,5 razy szybciej .

Co robi MATLAB, aby być szybszym, a czego nie robi C++? Czy ktoś mógłby mi wyjaśnić, dlaczego jest tak wielka różnica? Próbowałem kilka innych kodów, wszystkie są 3-6 razy szybciej w MATLAB.

Mój komputer to 64-bitowy system Windows 7, Visual Studio 2010 jest używany w C++, MATLAB to R2012b.

Czy to możliwe z powodu mojej wersji Visual Studio? Jeśli zmienię go na VS2012, czy będzie on szybszy?

mex -v wyjście jest tutaj.

Dzięki,

+0

Kompilatory są nadal tak s #### y nie można usunąć prostej pętli for, która zawsze zwraca te same wartości? Gdzie są moje latające samochody! :-) – xanatos

+0

użyj 'mex -v', aby skompilować mex i zobacz jakie flagi używa matlab. – Shai

+6

czy kompilujesz w trybie debugowania lub zwolnienia w VS? – Shai

Odpowiedz

3

Wydajność jest wysoce zależna od platformy, systemu operacyjnego, itp kompilatora Matlab Cokolwiek robi w tym przypadku, to jakoś udało się znaleźć optymalizację że kompilator VS2010 nie. Zaryzykowałbym przypuszczenie, że przejście na VS2012 nie spowodowałoby znaczącej różnicy, ale mógłbym się mylić. W końcu jest to inny kompilator.

Przyznam, że jest to nieco zaskakujące, ale sprawdź flagi kompilacji i wypróbuj profilowanie w różnych konfiguracjach. Jeśli twoja instalacja Matlab jest 32-bitowa, może to również zrobić różnicę.

W kodzie mogą występować niewielkie różnice, na tyle niewielkie, że być może nie zauważyłeś. Twój kod może łączyć się z innymi bibliotekami, które również mogą mieć duże różnice w wydajności.

Lekcja jest taka, że ​​bardzo trudno jest ustalić dokładnie, że jedna rzecz działa lepiej niż inna.

EDYCJA: Wspomniałeś, że kod został skompilowany do debugowania. To tylko dodatkowo zwiększa zmienność kompilatorów, ponieważ aktywowanie opcji debugowania może również wyłączyć inne optymalizacje, a każdy kompilator ma inny pomysł na to, jaki rodzaj informacji debugowania jest ważny i warty zachowania w kodzie.

Polecam wyłączyć wszystkie opcje debugowania, aby uzyskać bardziej spójne dane wyjściowe. Zaleciłbym również upewnienie się, że kompilujesz z podobnymi poziomami optymalizacji, prawdopodobnie z możliwie największymi lub wcale.

+0

Zmieniłem optymalizacje, ale niektóre z nich dają błąd, mówiąc, że "błędy wiersza poleceń D8016:"/ZI "i"/Ob1 "opcje linii poleceń są niekompatybilne". – smttsp

+0

Tak, dzieje się tak z powodu trybu wydania/debugowania. Kiedy zmieniam debugowanie, aby wypuścić to staje się '920 ms', które jest prawie takie samo jak czas działania matlab – smttsp

+0

Dla kodu, który jest prosty, myślę, że rozsądne jest, że dwa kompilatory miałyby wydajność z podobną wydajnością, chociaż wciąż jest dużo miejsca na zmienność wynikająca z innych parametrów. – patrickvacek

3

W kodzie C++, należy użyć int k w pętli wewnętrznej, natomiast w kodzie MATLAB, należy użyć double a (i dziwne, zmiana z a++ notacji do a=a+1 ...)

zostawić je zarówno unininialized ; patrz this question, dlaczego jest to złe.

Pliki MEX są domyślnie w ANSI C. Twój kod rzeczywiście wygląda tak. Dokładnie sprawdź swoją mex -setup; mógłbyś przypadkowo wybrać kompilator C, myśląc, że wybierasz C++.

Upewnij się również, że masz dokładnie taki sam zestaw opcji kompilatora dla obu kompilacji. Dokładnie to samo.

Ale myślę, że rdzeń jest taka, że ​​robisz liczbą całkowitą arytmetycznych w wersji C++ i podwójne arytmetyki o wersji MATLAB. Może to spowodować znaczną różnicę.

Poza tym i tym, co już zostało tutaj wspomniane, nie powinno być żadnych różnic. W rzeczywistości każdy przyzwoity kompilator z nawet podstawowymi optymalizacjami powinien być w stanie wykryć, że ta pętla jest dość trywialna i całkowicie ją usunąć.

+0

Nie jest powiązany z 'mex -setup'. Istnieje niewielka różnica między wersją C++ a matlab po zmianie jej na tryb zwolnienia, ale jest to dopuszczalne w porównaniu do 3,5-krotnie wolniej. – smttsp

+0

@smttsp: Co uważasz za "akceptowalne"? Tam * nie powinno być żadnej różnicy. –

+0

Być 1-10% wolniejszym niż Matlab jest dopuszczalne, ponieważ może to być spowodowane stanem maszyny, innymi programami itp. Ale bycie 3,5 razy wolniejszym jest całkowicie nie do przyjęcia. – smttsp