WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

"Script ausführen" schneller als "Evaluate C

 

ActionAndi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2009, 14:47     Titel: "Script ausführen" schneller als "Evaluate C
  Antworten mit Zitat      
Hallo zusammen,

ich habe gerade festgestellt, dass das Ausführen eines Scripts F5 schneller ist, als wenn ich auf "Evaluate Current Cell Strg+Enter" klicke.

Muss das so? Was mich wundert ist, dass die for Schleife im Script durchs ausführen schneller als die Vektoroperation ist. Nun wollte ich doch gerade einem Kollegen erklären, dass for Schleifen unter Matlab aus Performancegründen weitestgehend vermieden werden sollten...

Code:

%% Einfacher Vergleich Vektorisierung
% Vektorlaenge
n = 1e6;

% Beliebige Werte
y1 = rand(n,1);
y2 = rand(n,1);
% Memory allocation
r2 = zeros(n,1);

% Schnell
tic
r = (exp(y1)-y2)./(y1+y2);
s=toc;

% Langsam
tic
for i = 1:n
    r2(i) = (exp(y1(i))-y2(i))/(y1(i)+y2(i));
end
t=toc;
norm(r-r2)
fprintf('Schnell: %fs, langsam = %fs\n',s,t);
 


Also über "F5" kommt raus:
Code:
Schnell: 0.114334s, langsam = 0.099399s

und über "Strg+Eingabe":
Code:
Schnell: 0.133423s, langsam = 2.632230s


Habt Ihr einen Tipp?

Beste Grüße
ActionAndi


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 02.12.2009, 15:05     Titel:
  Antworten mit Zitat      
Warum das Ausführen im Cell Mode generell langsamer ist kann ich verstehen. Es geht halt um das Experimentieren und Entwickeln von Code. Überall laufen Syntax und M-Lint Optionen mit.

Warum die Schleife schneller ist schaue ich mir gleich mal an.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
ActionAndi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2009, 15:07     Titel:
  Antworten mit Zitat      
Hallo Andreas,

wenns hilft: Ich habe hier Matlab 7.4.0 (R2007a) am laufen.

Viele Grüße
Andi
 
ActionAndi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2009, 15:07     Titel:
  Antworten mit Zitat      
Hallo Andreas,

wenns hilft: Ich habe hier Matlab 7.4.0 (R2007a) am laufen.

Viele Grüße
Andi
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 02.12.2009, 15:21     Titel:
  Antworten mit Zitat      
Wichtig ist es den nicht den ersten Vergleich zu nehmen, sondern den Zweiten. MATLAB specichert ja zischen und nutzt wieder, wenn möglich.

Erstausführung bei mir (alles F5)

Code:

Schnell: 0.059104s, langsam = 0.068210s
 


Zweite un Dritte Ausführung:

Code:

Schnell: 0.047849s, langsam = 0.071355s
Schnell: 0.048305s, langsam = 0.073158s
 


D.h. in der schnellen Matrixschreibweise kann MATLAB noch etwas rausholen, bei der Schleife nicht.

Und generell: Seit R13 gibt es den JIT Accelerator, der u.a. Schleifen vektorisiert, wenn möglich. Wenn man den ausstellt wird es eindrucksvoll

Code:

feature('accel','off')
feature('jit','off')
Schnell: 0.100027s, langsam = 3.252470s
 


Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
ActionAndi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2009, 15:33     Titel:
  Antworten mit Zitat      
Ok. Interessanterweise ist bei mir die vermeintlich langsame for schleife auch beim mehrmaligen Wiederholen immer schneller
Code:

Schnell: 0.115033s, langsam = 0.099610s
Schnell: 0.115134s, langsam = 0.099354s
Schnell: 0.115252s, langsam = 0.099624s
Schnell: 0.115096s, langsam = 0.099404s
Schnell: 0.114983s, langsam = 0.100901s
Schnell: 0.115281s, langsam = 0.099512s
Schnell: 0.115350s, langsam = 0.099476s
Schnell: 0.115240s, langsam = 0.099375s
Schnell: 0.115610s, langsam = 0.099577s
Schnell: 0.115521s, langsam = 0.099487s
Schnell: 0.115222s, langsam = 0.099345s
Schnell: 0.115287s, langsam = 0.099370s
Schnell: 0.115170s, langsam = 0.099495s
Schnell: 0.116869s, langsam = 0.099548s
 


Liegt vielleicht am Rechner (4 CPUs). Wenn ich JIT ausschalte, kommt auch das richtige raus.
Dumm ist nur, dass mein einfacher Beweis für die Vorteile der Vektorisierung nicht funktioniert. Hast Du evtl ein einfaches Script bzw. einen Tipp?

Beste Grüße
Andreas
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 02.12.2009, 17:29     Titel:
  Antworten mit Zitat      
Also in Loren's blog gibt es viel Hilfreiches:

http://blogs.mathworks.com/loren/category/vectorization/

Auch wenn ich nach "matrix loop performance best practice" Suche kommen fast nur Hits auf ihren Blog.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.