Rumah  >  Artikel  >  Java  >  Cara menggunakan StringBuilder Java dengan betul dalam senario berprestasi tinggi

Cara menggunakan StringBuilder Java dengan betul dalam senario berprestasi tinggi

WBOY
WBOYke hadapan
2023-05-12 13:07:06698semak imbas

Penggunaan StringBuilder yang betul dalam senario berprestasi tinggi

Mengenai StringBuilder, kebanyakan pelajar hanya ingat bahawa anda harus menggunakan StringBuilder untuk penyambungan rentetan, jangan gunakan + dan jangan gunakan StringBuffer, maka prestasi akan menjadi yang terbaik Ya, betulkah?

Sesetengah pelajar juga pernah mendengar tiga pengalaman berbeza:

1 Selepas kompilasi dan pengoptimuman Java + mempunyai kesan yang sama seperti StringBuilder bukan thread-safe. Demi "keselamatan", lebih baik menggunakan StringBuffer;

3.

1. Panjang awal sangat penting sehingga patut disebut empat kali.

StringBuilder mempunyai char[] di dalam, dan constant append() ialah proses mengisi char[].

Panjang lalai char[] apabila menggunakan StringBuilder() baharu ialah 16. Kemudian, apakah yang perlu saya lakukan jika saya ingin menambahkan aksara ke-17?

Gunakan System.arraycopy untuk menggandakan salinan dan mengembangkan kapasiti! ! ! !

Dengan cara ini, terdapat kos salinan tatasusunan, dan kedua, aksara asal[] juga dibazirkan dan akan hilang oleh GC. Seperti yang anda boleh bayangkan, rentetan 129 aksara telah disalin dan dibuang empat kali, 16, 32, 64, dan 128, dan sejumlah 496 aksara telah diperuntukkan untuk tatasusunan Dalam senario prestasi tinggi, ini hampir tak tertanggung.

Jadi, adalah penting untuk menetapkan nilai awal dengan munasabah.

Tetapi bagaimana jika saya benar-benar tidak dapat menganggarkan dengan baik? Lebih baik menilai terlalu tinggi asalkan talinya lebih besar daripada 16 pada akhirnya, walaupun ia sedikit terbuang, ia lebih baik daripada menggandakan kapasiti.

2. Kelas StringBundler Liferay

Kelas StringBundler Liferay memberikan idea lain untuk tetapan panjang Ia tidak tergesa-gesa memasukkan sesuatu ke dalam char[] sebaliknya, ambil String[ dahulu. ] dan simpan semuanya, dan akhirnya menambah panjang semua Strings untuk membina StringBuilder dengan panjang yang munasabah.

3 Walau bagaimanapun, ia masih membazirkan dua kali ganda char[]

Baziran berlaku pada langkah terakhir, StringBuilder.toString()

// Cipta copy , jangan kongsi array
kembali String(value, 0, count) baharu;


Pembina String akan menggunakan System.arraycopy() untuk menyalin char masuk[] Untuk memastikan keselamatan dan tidak berubah, jika cerita berakhir seperti ini, char[] dalam StringBuilder masih akan dikorbankan dengan sia-sia.

Untuk tidak mensia-siakan char[] ini, satu cara ialah menggunakan pelbagai teknologi hitam seperti Tidak Selamat untuk memintas pembina dan secara langsung memberikan nilai kepada atribut char[] String, tetapi hanya sedikit orang yang melakukan ini. .

Kaedah lain yang lebih dipercayai ialah menggunakan semula StringBuilder. Penggunaan semula juga menyelesaikan masalah tetapan panjang sebelumnya, kerana walaupun anggaran tidak tepat pada mulanya, ia akan mencukupi selepas beberapa pengembangan lagi.

4. Gunakan Semula StringBuilder

Kaedah ini datang daripada kelas BigDecimal dalam JDK (tidak mengapa untuk melihat betapa pentingnya kod JDK mengekstrak kod ke dalam StringBuilderHolder, yang hanya mempunyai satu fungsi

awam StringBuilder getStringBuilder() {
sb.setLength(0);

kembali sb;
}

StringBuilder.setLength() fungsi hanya menetapkan semula Penunjuk kiraan dan char[] akan terus digunakan semula, dan toString() juga akan menghantar penunjuk kiraan semasa sebagai parameter kepada pembina String, jadi tidak perlu risau tentang menghantar kandungan lama yang melebihi saiz daripada kandungan baharu. Ia boleh dilihat bahawa StringBuilder boleh diguna semula sepenuhnya.

Untuk mengelakkan konflik serentak, Pemegang ini biasanya ditetapkan kepada ThreadLocal Untuk kaedah penulisan standard, lihat ulasan BigDecimal atau StringBuilderHolder.

5. + dan StringBuilder

String s = “hello ” + user.getName();

Kesan ayat ini selepas kompilasi javac , sememangnya sama dengan menggunakan StringBuilder, tetapi tanpa menetapkan panjang.

String s = new StringBuilder().append(“hello”).append(user.getName());

Walau bagaimanapun, jika ia seperti ini:

String s = "hello";
// dipisahkan oleh beberapa pernyataan lain

s = s + user.getName();

setiap pernyataan , akan menjana StringBuilder baharu Terdapat dua StringBuilder di sini, dan prestasinya berbeza sama sekali. Jika s+=i; berada dalam badan gelung, ia akan menjadi lebih tidak masuk akal.

Menurut R University, jurutera JVM yang bekerja keras menggabungkan StringBuilder bersebelahan (tanpa pernyataan kawalan) menjadi satu mengikut +XX:+OptimizeStringConcat (dibuka secara lalai selepas JDK7u40) semasa fasa pengoptimuman jalankan juga cuba sedaya upaya meneka panjangnya.

Jadi, untuk berada di pihak yang selamat, teruskan menggunakan StringBuilder dan tetapkan panjangnya sendiri.

6. StringBuffer dan StringBuilder

StringBuffer dan StringBuilder kedua-duanya mewarisi daripada AbstractStringBuilder Satu-satunya perbezaan ialah fungsi StringBuffer mempunyai kata kunci yang disegerakkan.

Bagi pelajar yang mengatakan StringBuffer adalah "selamat", bilakah anda benar-benar melihat beberapa utas secara bergilir-gilir menambahkan StringBuffer? ? ?

7. Sentiasa serahkan gabungan rentetan log kepada slf4j??

logger.info("Hello {}", user.getName());

Untuk log yang anda tidak tahu sama ada untuk dikeluarkan, menyerahkannya kepada slf4j untuk menyambungkannya apabila ia benar-benar perlu dikeluarkan sememangnya boleh menjimatkan kos.

Tetapi untuk log yang mesti dikeluarkan, lebih pantas menggunakan StringBuilder untuk menyambungkannya sendiri. Kerana melihat pelaksanaan slf4j, ia sebenarnya hanyalah indeks tetap ("{}"), subString(), dan kemudian sentiasa menggunakan StringBuilder untuk meletakkannya bersama-sama. Tiada peluru perak.

PS. StringBuilder dalam slf4j menyimpan 50 aksara di luar Mesej asal Jika parameter pembolehubah menambah sehingga lebih daripada 50 aksara, ia masih perlu disalin dan dikembangkan... dan StringBuilder tidak digunakan semula.

Atas ialah kandungan terperinci Cara menggunakan StringBuilder Java dengan betul dalam senario berprestasi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam