Στην Java υπάρχει διαφορά απόδοσης μεταξύ της χρήσης του χειριστή "+" και του StringBuilder;


Απάντηση 1:

Στην Java υπάρχει διαφορά απόδοσης μεταξύ της χρήσης του χειριστή "+" και του StringBuilder;

Σε μια μόνο γραμμή όπως αυτές:

Σειρά συμβολοσειρών1 = "ένα" + "δύο".
String string2 = νέο StringBuilder ("one") append ("δύο") toString ();

Δεν πρέπει να υπάρχει διαφορά στην απόδοση. Στην πραγματικότητα, στα σύγχρονα οικοσυστήματα της Ιάβας, η πρώτη βελτιστοποιείται στο δεύτερο κατά την κατάρτιση του χρόνου. Για να δείτε αυτό σε δράση, δοκιμάστε να μπείτε στο πρώτο χρησιμοποιώντας το αγαπημένο σας πρόγραμμα εντοπισμού σφαλμάτων.

Ωστόσο, εάν οι συστοιχίες σας σε ξεχωριστές γραμμές ή, για παράδειγμα, σε ένα βρόχο για:

Σειρά συμβολοσειρών1 = "";
StringBuilder sb = Νέο StringBuilder ();

για (ακέραιο i = 0, i <5, i ++) {
  string1 = string1 + i.toString ();
  sb.append (i.toString ());
}}

String string2 = sb.toString ();

Στη συνέχεια, χρησιμοποιώντας ένα StringBuilder είναι πιο "αποδοτικό" και είναι μερικές φορές ο προτιμώμενος τρόπος για να οικοδομήσουμε μια πιο περίπλοκη σειρά. Από όσο γνωρίζω, προς το παρόν δεν υπάρχει Java compiler που θα βελτιστοποιήσει την επανάληψη του + στο StringBuilder.


Απάντηση 2:

Σύντομη απάντηση: μπορεί να υπάρχει, αλλά τις περισσότερες φορές δεν αξίζει να ανησυχείτε. Προτιμήστε τον σαφή κωδικό για την πρόωρη βελτιστοποίηση.

Τα σύγχρονα JVM μπορούν να βελτιστοποιήσουν τη συσχέτιση των συμβολοσειρών με το "+" και να τα μετατρέψουν σε StringBuilder και αφού μπορούν να δουν πόσο καιρό θα προκύψει η προκύπτουσα συμβολοσειρά, μπορούν να διαθέσουν το σωστό μέγεθος στο StringBuilder στην αρχή. Εάν δημιουργήσετε τον εαυτό σας χρησιμοποιώντας το προεπιλεγμένο μέγεθος πίνακα, ίσως η συστοιχία χαρακτήρων θα πρέπει να διευρυνθεί αργότερα, πράγμα που σημαίνει ένα αντίγραφο του πίνακα, πράγμα που θα μπορούσε να είναι πιο αργό.

Από την Java 9, η συμβολοσειρά String είναι πολύ πιο βελτιστοποιημένη, με μια στρατηγική που αποφασίζεται κατά το χρόνο εκτέλεσης.

Αν προσθέτετε επανειλημμένα σε ένα String σε ένα βρόχο, τότε πιθανότατα δεν μπορείτε να πάτε στραβά χρησιμοποιώντας ένα StringBuilder, αλλά εκχωρείτε το σωστό μέγεθος εκ των προτέρων εάν είναι γνωστό. Έξω από τους βρόχους, κολλήστε με "+" όποτε θα ήταν πιο ευανάγνωστο. και εμπιστευτείτε ότι η JVM είναι, ή σύντομα θα είναι καλύτερη, στη βελτιστοποίηση από εσάς.