In .NET Substring
ist O (n) anstelle des O (1) von Java. Der Grund dafür ist, dass in .NET das String-Objekt alle tatsächlichen Zeichendaten selbst enthält. - Um also einen Teilstring zu erhalten, müssen alle Daten innerhalb des neuen Teilstrings kopiert werden. In Java kann substring
einfach ein neues Objekt erstellen, das sich auf das ursprüngliche char-Array bezieht, mit einem anderen Anfangsindex und einer anderen Länge.
Es gibt Vor- und Nachteile der einzelnen Ansätze:
- .NET Ansatz besser Cache-Kohärenz hat, schafft weniger Objekte und vermeidet die Situation, in der eine kleine Teilkette verhindert, dass eine sehr große
char[]
wird Müll gesammelt . Ich glaube, dass es in manchen Fällen auch intern sehr einfach sein kann.
- Java Ansatz macht einen Teil sehr effizient, zu nehmen und wahrscheinlich einige andere Operationen zu
Es ist ein wenig mehr Detail in meinem strings article.
Wie für die allgemeine Frage der Vermeidung von Performance-Fallstricke, ich denke, ich sollte eine vorbereitete Antwort zum Ausschneiden und Einfügen bereit haben: Stellen Sie sicher, ist effizient, und implementieren Sie es auf die lesbarste Weise, die Sie können. Messen Sie die Leistung und optimieren Sie, wo Sie Engpässe finden.
Übrigen macht diese string
ganz besonderer - es ist das einzige nicht-Array-Typ, dessen Speicherbedarf variiert nach Instanz innerhalb desselben CLR.
Für kleine Saiten ist das ein großer Gewinn. Es ist schlimm genug, dass es den gesamten Overhead von ein Objekt gibt, aber wenn es auch ein zusätzliches Array gibt, könnte eine Zeichenfolge aus einem Zeichen etwa 36 Byte in Java benötigen. (Das ist eine "Finger-in-the-Air" -Nummer - ich kann mich nicht an die genauen Objektkosten erinnern. Es hängt auch von der verwendeten VM ab.)
Warum sollten Sie nicht Ihre eigenen Mikro-Benchmarks ausführen, um dies zu testen ? Können Sie zu Quellen verlinken, die sagen, dass sie "schlechte" Leistung haben? – Oded
@Oded: Quelle ist Danny Chens Kommentar hier http://StackOverflow.com/Questions/3474254/How-to-make-a-first-letter-capital-in-c/3474263#3474263; Ehrlich gesagt würde ich erstaunt sein, wenn "Substring" nicht "O (1)" Zeit-und-Raum-Operation (wie beispielsweise Java) ist, aber ich gebe ihm den Vorteil des Zweifels, da ich .NET nicht kenne. – polygenelubricants
Was bedeutet "schlechte Leistung"? Relativ zu was? .NET hat auch eine schlechte Leistung, wenn es beispielsweise mit C++ verglichen wird. Sollten wir deswegen .NET fallen lassen? –