2016-10-19 2 views
1

Wie der Titel sagt, möchte ich wissen, was Matlab zwischen den beiden Optionen unterscheidet. Aus Gründen der Argumentation, sagen wir mal, dass Matrix a und idx ausreichend groß sind, mit Speicherproblemen zu tun haben, und definieren:Performance/Low level Bedeutung von "a (idx) = []" vs "a = a (~ idx)"

  • Fall A:a(idx) = []
  • Fall B:a = a(~idx)

Meine Intuition sagt, dass in Fall A eine Wert-Neuzuordnung durchgeführt wird, die dann die CPU mit indizierten Kopien von ursprünglichen Positionen zu den neuen geordneten, während Keepi behandelt ng verfolgen, was der aktuelle "Kopf" der gleichen Matrix ist, und später den überschüssigen Speicher abschneidet.

Auf der anderen Seite würde Fall B eine indizierte Massenkopie auf einen neu zugewiesenen Speicherplatz ausführen.

Also wahrscheinlich Fall A ist langsamer, aber weniger Speicher als Case B. Ich nehme an, richtig? Ich weiß es nicht, sofort nachdem ich dies geschrieben habe, habe ich das Gefühl, dass Case B zuerst Case A ausführen muss ... Irgendwelche Ideen?

Vielen Dank im Voraus

+2

Die Antwort hängt wahrscheinlich von den Größen von 'a' und' idx' ab, und vielleicht von der Matlab-Version. Warum nicht einfach [Zeit] (https://es.mathworks.com/help/matlab/ref/timeit.html) die beiden Optionen selbst? –

Antwort

0

Es ist interessant, so habe ich beschlossen, eine Maßnahme zu ergreifen:

Ich verwende Windows (64 Bit) Version von Matlab R2016a.
CPU: Core i5-3550 bei 3,3 GHz. Speicher: 8 GB DDR3 1333 (Zweikanal).

len = 100000000; %Number of elements in array (make it large enouth to be outsize of cache memory). 
idx = zeros(len, 1, 'logical'); %Fill idx with ones. 
idx(1:10:end) = 1; %Put 1 in every 10'th element of idx. 

a = ones(len, 1); %Fill arrary a with ones. 

disp('Measure: a(idx) = [];') 
tic 
a(idx) = []; 
toc 

a = ones(len, 1); 
disp(' ');disp('Measure: a = a(~idx);') 
tic 
a = a(~idx); 
toc 

disp(' ');disp('Measure: not_idx = ~idx;') 
tic 
not_idx = ~idx; 
toc 

a = ones(len, 1); 
disp(' ');disp('Measure: a = a(not_idx);') 
tic 
a = a(not_idx); 
toc 

Ergebnis:

Measure: a(idx) = []; 
Elapsed time is 1.647617 seconds. 

Measure: a = a(~idx); 
Elapsed time is 0.732233 seconds. 

Measure: not_idx = ~idx; 
Elapsed time is 0.032649 seconds. 

Measure: a = a(not_idx); 
Elapsed time is 0.686351 seconds. 

Schlussfolgerungen:

  1. a = a(~idx) ist etwa zweimal schneller als a(idx) = [].
  2. Gesamtzeit von a = a(~idx) gleich Summe von not_idx = ~idx Plus a = a(not_idx)
    Matlab wahrscheinlich ~idx separat berechnet wird, so verbraucht er mehr Speicher.
    Speicherverbrauchszähler nur, wenn der physische Arbeitsspeicher voll ausgelastet ist.
    Ich denke, es ist vernachlässigbar (~idx Speicherverbrauch ist temporär).
  3. Beide Lösungen sind nicht optimiert.
    Ich schätze, voll optimierte Implementierung (in C) um 10 mal schneller sein.