2013-02-06 8 views
12

Ich benutze eine veränderbare Buffer und muss herausfinden, wie viele Elemente es hat.Scala Buffer: Größe oder Länge?

Beide size und length Methoden sind definiert, von verschiedenen Merkmalen geerbt.

Gibt es irgendwelche tatsächlichen Leistungsunterschiede, oder können sie als exakte Synonyme betrachtet werden?

+2

Ich persönlich bin ein semantischer Nitpicker, also verwende ich 'length' nur für Dinge, die linear oder sequentiell sind und' size' sonst. –

Antwort

15

Sie sind Synonyme, meist eine Folge von Java Entscheidung von size für Sammlungen und length für Array und String haben. Man wird immer in Bezug auf den anderen definiert, und Sie können leicht sehen, was ist, wenn Sie den Quellcode betrachten, dessen Link auf scaladoc bereitgestellt wird. Suchen Sie einfach das definierende Merkmal, öffnen Sie den Quellcode und suchen Sie nach def size oder def length.

+0

Danke! Ich wusste nicht, dass der Quellcode online über das Scaladoc zugänglich war. Das ist ganz nett! – Eduardo

2

Sie sind Synonyme, als scaladoc für Buffer.size Zustände:

Die Größe dieses Puffers entspricht der Länge.

Die scaladoc für Buffer.length ist ausdrücklich zu:

Die Länge des Puffers. Hinweis: xs.length und xs.size liefern das gleiche Ergebnis.

Einfacher Rat: beziehen Sie sich auf das scaladoc, bevor Sie eine Frage stellen.

AKTUALISIEREN: Sehen Sie einfach Ihre Bearbeitung hinzufügen Erwähnung der Leistung. Wie Daniel C. Sobral Hilfe, ist man normalerweise immer in Bezug auf die andere implementiert, so dass sie die gleiche Leistung haben.

+0

Ich habe mich gefragt, ob es irgendwelche Leistungsunterschiede gibt? Zum Beispiel wird einer als tatsächliches Attribut in der Datenstruktur gespeichert, während der andere alle Werte (wie bei einer Liste) durchläuft, um den gleichen Wert zurückzugeben. – Eduardo

+0

Ich habe meine Frage bearbeitet, um expliziter zu sein – Eduardo

5

In diesem Fall können sie als Synonyme betrachtet werden. Sie können mit einigen anderen Fällen wie Array aufpassen - während Länge und Größe immer das gleiche Ergebnis zurückgeben, in Versionen vor Scala 2.10 gibt es möglicherweise einen Boxen Overhead für den Aufruf size (die von einem Scala Wrapper rund um die Array), während length vom zugrunde liegenden Java Array bereitgestellt wird.

In Scala 2.10 wurde dieser Overhead durch Verwendung einer Wertklasse entfernt, die die size-Methode bereitstellt. Sie sollten also frei entscheiden, welche Methode Sie verwenden möchten.

+0

Ich habe gerade den Scala 2.11-Code beschrieben, und der Aufruf von 'size' auf einem Array erzeugt ein Objekt. Sie sollten es dennoch in performancekritischem Code vermeiden. – mattg

2

Ab Scala-2.11 können diese Methoden unterschiedliche Leistung haben. Betrachten wir zum Beispiel diesen Code:

val bigArray = Array.fill(1000000)(0) 
val beginTime = System.nanoTime() 
var i = 0 
while (i < 2000000000) { 
    i += 1 
    bigArray.length 
} 
val endTime = System.nanoTime() 
println(endTime - beginTime) 
sys.exit(-1) 

Rennen auf meinem amd64 Computer gibt über 2.423.834 nanos Zeit (variiert von Zeit zu Zeit).

Nun, wenn ich die length Methode zu size ändern, wird es etwa 70764719 Nanos Zeit werden.

Dies ist mehr als 20x langsamer.

Warum passiert das? Ich habe es nicht durchgegraben, ich weiß es nicht.Aber gibt es Szenarien, in denen length und size drastisch anders durchführen.