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

Speed up Code- Beispiele

 

Romaxx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2015, 14:30     Titel: Speed up Code- Beispiele
  Antworten mit Zitat      
Hallo zusammen,

ich habe eine Frage zu zwei Code-Beispielen, welche unterschiedlich schnell laufen. Es handelt sich dabei um eine while-Schleife in der eine if Bedingung und eine Funktion sind. Der Geschwindigkeitsunterschied liegt so bei Faktor 10, mehr oder weniger.
Erste Variante ist langsamer.
Woran könnte das liegen?
Das ist natürlich nur rudimentär abgebildet.
Eventuell folgt der richtige Code, dann aber per PM. (ist auch etwas länger)


Ersteres:
Code:
k = 1;
maxiter = 1000000;
alpha = zeros(300,100000)
while true
    f = ...;
    margin = ...;
    if f > margin
         %
    else
        k = k + 1;
        alpha = NORMA_MTHD(alpha,k,others);
    end

    if k  > maxiter
        break;
    end
end


function [alpha] = NORMA_MTHD(alpha,k,others)

% NORMA algorithm
alpha(:,k) = NORMA(alpha(:,k - 1),others);

end


Zweites
Code:
k = 1;
maxiter = 1000000;
alpha = zeros(300,100000)
while true
    f = ...;
    margin = ...;
    if f > margin
         %
    else
        k = k + 1;
        % NORMA algorithm
         alpha(:,k) = NORMA(alpha(:,k - 1),others);
    end

    if k  > maxiter
        break;
    end
end
 


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 21.05.2015, 15:47     Titel:
  Antworten mit Zitat      
könnte mir vorstellen das das übergeben der 240mb großen variablen länger dauert als das übergeben eines teils. um zu gucken wo etwas wie lange dauert bietet sich der profiler an.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Romaxx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2015, 16:10     Titel:
  Antworten mit Zitat      
Hallo Winkow,

ich überlege es mir noch einmal und führe noch ein paar Tests durch.
Ich hatte zu Beginn dieselbe Vermutung, hab daher noch etwas am Script gemacht, um zu schauen, ob das wirklich daran liegt. Hab es aber irgendwie ausschließen können.

Vielleicht habe ich auch etwas vergessen, ich teste noch einmal und freue mich trotzdem noch auf den ein oder anderen Ratgeber und melde mich dann zurück Smile.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.05.2015, 16:33     Titel: Re: Speed up Code- Beispiele
  Antworten mit Zitat      
Hallo Romaxx,

Matlab benutzt ein Konzept, bei dem die kopierte Variablen zunächst nur als "SharedDataCopy" erzeugt werden und eine "DeepCopy" erst beim Ändern der Daten stattfindet: "CopyOnWrite".

In der Zeile "alpha = NORMA_MTHD(alpha,k,others);" wird also zunächst für die Unterfunktion das Array "alpha" so kopiert, dass nur ein neuer Header erzeugt wird, das große Array mit den Werten aber bei behalten wird. Es zeigent dann praktisch zwei Variablen auf den selben Speicherblock im RAM.
Wenn nun in der Unterfunktion Werte dieses Array erzeugt werden, wird das gesamte Array dupliziert und die Änderungen eingefügt. Das ist sehr zeitaufwändig, gerade wenn der Speicher größer ist als der Prozessor- oder 1st-Level-Cache und ins langsame RAM geschrieben werden muss.

Anders ist das bei "alpha(:,k) = NORMA(alpha(:,k - 1),others)". Hier bekommt die Unterfunktion nur einen kleinen Teil des großen "alpha"-Arrays als Kopie und die dort erzeugten Änderungen werden in die Original-Matrix hineinkopiert.

Während man also im ersten Falle in jeder Iteration das gesamte alpha-Array dupliziert, werden im zweiten Fall nur jeweils eine Spalte kopiert und die Änderungen wieder zurückgeschrieben. Einzelne Spalten passen aber eher in den Prozessor-Cache, so dass der Speicher "alpha(:,k)" wahrscheinlich noch dort verfügbar ist, wenn in der nächsten Iteration auf "alpha(:,k-1)" zugegriffen wird.

Du hast also eine ausgesprochen gute Frage gestellt, bei der man eine Menge über effizientes Programmieren lernen kann. Schnelle Programme lassen sich nur schreiben, wenn man die gesamte Architektur des Rechners berücksichtig.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
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.