1

String-Kompilierzeitkonstanten (Internized-Strings) und Literale können mit dem == verglichen werden, da ihnen zur Kompilierzeit die gleiche Referenz zugewiesen wird, wenn sie irgendwie gleich sind.Verzögern String-Konstanten/Literale im Code das Kompilieren erheblich?

Bedeutet das, dass das Kompilieren von Code, der aus n String-Literalen besteht, n log (n) Zeit zum Kompilieren benötigt?

Ich stelle diese Frage hier, weil jemand die Antwort bereits kennt und ich bin mir nicht sicher, ob ich einen Test schreiben kann, der den Effekt zuverlässig, reproduzierbar oder signifikant misst. Oder dass dieser Test reelle Welteinschränkungen etc. widerspiegelt.

Ich werde alle Testfälle veröffentlichen, die ich mir zwar vorstellen kann, aber ich kann sie vorschlagen, ich werde sie implementieren, sobald ich die Zeit finde .

+1

Ich erinnere mich, dass das letzte Mal, als ich versuchte, etwa hundert kB Text in einen String zu legen, es nicht zu gut endete. Ich glaube, dass die Kompilierzeit auch von der String-Länge abhängt, aber nicht sicher über den Trend auf dem –

+1

Warum würde Kompilierungszeit hier der Unterschied sein? Der Vergleich findet noch zur Laufzeit statt. –

+0

Es ist nur eine gute Schätzung nichts mehr, aber ich denke, String-Literale wie "this" 'nehmen nur Platz und verbrauchen die Lese- und Schreibzeit der Festplatte, aber String-Konstanten wie' final String s = "Something"; Kompilierzeit auch und wenn zu viel mit viel Use Cases, wird es Auswirkungen auf die Kompilierzeit. –

Antwort

1

Tun String-Konstanten/Literale im Code langsamer kompilieren erheblich?

Nr

String kompilieren Zeitkonstanten (internalisiert-Strings) und Literale mit dem == verglichen werden, da sie die gleiche Referenz zur Compile-Zeit zugewiesen werden, wenn sie irgendwie gleich sind.

Nein sind sie nicht. Sie sind gepoolt zum Zeitpunkt der Kompilierung in den Konstantenbereich der .class-Datei, und sie sind Interniert zum Zeitpunkt des Ladens der Klasse, wenn die Referenz zugewiesen ist.

Bedeutet das, dass das Kompilieren von Code, bestehend aus n String-Literalen, n log (n) -Zeit zum Kompilieren benötigt?

Nein, es gibt keine von Natur aus ist O (N log (N)) Prozess hier. Pooling ist O (1) über eine Hash-Tabelle in jeder sinnvollen Implementierung und Internierung dito.

[Es wäre natürlich möglich, einen Compiler oder intern() Methode zu konstruieren, die O (N log (N)) wurde oder O (N^3) oder schlimmer noch, aber es ist nicht mit irgendetwas in Ihrer Frage verbunden.]

+0

@HopefullyHelpful Jeder String * wird * zur Kompilierungszeit in der Hash-Tabelle gespeichert. Oder fragst du nach Laufzeit? – EJP

+1

Sie fragen sich also nach Laufzeit? Es hilft, Fragen zu beantworten, die Sie gestellt werden. Sie müssen Raumkosten und Zeitkosten berücksichtigen. Der Laufzeit-String-Pool wurde nicht bis zu einem Punkt in der Nähe von Java 1.3 gesammelt, so dass es bis dahin eine immense Raumverschwendung gewesen wäre, daher das 'intern()' -Design. Die Hälfte der Objekte in den meisten ausführenden Java-Programmen sind char-Arrays und Strings, die sie enthalten. – EJP

+0

Ja, in jeder vernünftigen Implementierung, wie ich bereits in meiner Antwort angegeben habe. – EJP