2014-12-09 14 views
6

Angenommen, ich habe einige Klassen foo < handle und bar < foo, baz < foo und vielleicht qux < foo. Es gibt ein paar Möglichkeiten, wie ich eine Reihe dieser Objekte speichern können:Was ist besser für die Leistung, Zellen-Arrays von Objekten oder heterogenen Arrays?

  • Als Zellenfeld: A = {foo bar baz qux} % A(1) would be a cell, A{1} gives me a foo object

  • Beginnend mit R2011a, kann ich foo <matlab.mixin.Heterogeneous machen und dann ein Array directy bauen: A = [foo bar baz qux] % A(1) directly gives me a foo object

So wie ich es sehe, aus einer Wartungs Perspektive es besser wäre, eher die zweite Methode zu verwenden, als die ersten, auf diese Weise es Unklarheit über beseitigt, wiezugreifen. Nämlich, wenn wir Elemente des Zellenarrays dereferenzieren müssen (Zelle A(1) vs foo Objekt A{1}, die innerhalb A(1) lebt).

Aber gibt es irgendeine Art von Speicher oder Leistungseinbußen (oder Nutzen), eine Syntax gegen die andere zu verwenden?

+1

Ich wäre überrascht, wenn Sie den Unterschied in der Leistung sehen könnten. Erstellen Sie beide Objekte und machen Sie ein "whos", um ihre jeweiligen Größen zu sehen. – Floris

+1

@Floris Ich tat das oben und es sieht so aus, als ob die heterogene Array-Implementierung 104 Byte belegt und das Zellen-Array ganze 864 belegt! Das Definieren eines "foo" -Objekts scheint jedoch auch 104 Bytes zu belegen. Ich verstehe also nicht wirklich, was in der heterogenen Implementierung passiert ... –

+1

Der Fluch von Matlab.Niemand weiß wirklich, was hinter dem Vorhang vorgeht und Matlab war nie daran interessiert, den Menschen ihre Geheimnisse zu erzählen. – patrik

Antwort

1

Ich habe ein kleines Experiment (source) über den Speicher und die Laufzeit des Zell-Arrays, containers.Map und ein heterogenes Array. In meiner Methode habe ich jedes Array mit N = 65535 Elementen (die maximale Array-Größe für Map und Heterogeneous Array) vorallokiert, dann begann jedes Element ein Uint32 zuweisen, und die Zeit und Speicher gemessen. Meine heterogene Klasse war eine einfache Klasse mit einer einzigen öffentlichen Eigenschaft und einem Konstruktor, der diese Eigenschaft zugewiesen hat. Die containers.Map hatte Uint32-Schlüssel/Wert-Paare.

Maps took 9.17917e-01 seconds. 
Cells took 5.81220e-02 seconds. 
Heterogeneous array took 4.95336e+00 seconds. 

**Name**  **Size**   **Bytes**  **Class** 
map   65535x1   112   containers.Map    
cellArr  65535x1   7602060  cell    
hArr   1x65535   262244  SomeHeterogeneousClass 

Sofort beachten, dass die Größe des mapArray nicht genau ist. Es ist hinter den Containern verborgen. Die Implementierung der Map-Klasse, die meisten der 112 Bytes, die gemeldet werden, ist der Speicher, der der Map selbst zugewiesen ist, mit Ausnahme der Daten. Ich approximiere die wahre Größe um bei mindestens (112 + 65535 * (sizeof (uint32) * 2)) = 524392 Bytes. Dieser Wert ist fast genau das Doppelte der hArr-Größe, was mich zu der Annahme bringt, dass er ziemlich genau ist, da die Map doppelt so viele Daten (für den Schlüssel UND-Wert) wie hArr speichern muss.

Die Ergebnisse sind einfach:

  • Zeit: Zelle Array < Karte < Heterogene Array
  • Speicher: Heterogene Array < Map < Zelle Array

ich das Experiment mit N wiederholt 30 = Um auf kleine Arrays zu testen, waren die Ergebnisse ähnlich. Gott weiß nur, warum Zellen so viel Speicher aufnehmen und heterogene Arrays sind so langsam.