2016-02-03 8 views
5

Bei der Verwendung von Scala zum ersten Mal in einer IDE (Idee) habe ich festgestellt, dass Autovervollständigung ist deutlich langsamer, dann beim Java-Codierung. Obwohl ein Teil der Verlangsamung der relativen Unreife des Scala Tooling-Ökosystems zu diesem Zeitpunkt geschuldet sein könnte, vermute ich, dass ein Teil dieser Verlangsamung eine inhärente Eigenschaft der algorithmischen Komplexität des Parsing-Codes sein kann, die Typinferenz erfordert.Verursacht Inferenz verlangsamen Autovervollständigung in der IDE

java:

MyType type; type.doSomething() //Class of type already known 

scala:

val type = new MyType; type.doSomething() //Class of type must be inferred or cached 

Obwohl Sprachen, die Typinferenz haben viel mehr knappe (und daher leichter zu lesen) sind, diese auf Kosten der langsameren Werkzeug kommt ? Gibt es einen inhärenten Kompromiss?

Antwort

1

Ja.

Bis zu einem gewissen Grad ist Scala unvermeidlich langsamer. Eine der Kosten, um abgeleitete Typen, implicits und syntaktischen Zucker zu haben, sind Kompilierzeiten. Die genauen Zeiten können verbessert werden, aber Scala kompiliert immer langsamer als für ex.java.

Persönlich mache ich gerne diesen Kompromiss. Eine sauberere und lesbare Code-Basis ist für mich viel wichtiger als das Kompilieren von Zeiten (die oft unter 1 Sekunde liegen, wenn eine inkrementelle Kompilierung verwendet wird).

+0

Danke für Ihren Beitrag. Meine Frage richtet sich mehr auf das Tooling, von dem ich weiß, dass es mit der Kompilierzeit zusammenhängt, aber die automatische Vervollständigung kann auch durch halbfertige Kompilierung (Lexing ohne Bytecode-Generierung) und statische Analyse erleichtert werden. Ich denke also, ich frage, ob Typinferenz verhindert, dass solche Leistungsoptimierungen verwendet werden, was zu langsameren Werkzeugen führt. – murungu

+0

Ich denke, ich bin nicht Experte genug, um das zu beantworten. Ich weiß nicht, Scala (und Eclipse und Intellij) Interna zu sagen, ob ein expliziter Typ Autovervollständigung hilft. Beachten Sie, dass eine Scala-IDE normalerweise sowohl normale Methoden als auch _implizit verfügbare Methoden durchsucht. Siehe zum Beispiel "abcde" .take (3) (Methode 'take' wird bei' String' aufgerufen). – VasyaNovikov