„Java“ teikia „StringBuffer“
ir Stygos
klasės ir Stygos
klasė naudojama manipuliuoti simbolių eilutėmis, kurių negalima pakeisti. Paprasčiau tariant, tipo objektai Stygos
yra tik skaitomi ir nekintami. „StringBuffer“
klasė naudojama simboliams, kuriuos galima keisti, žymėti.
Didelis šių dviejų klasių našumo skirtumas yra tas „StringBuffer“
yra greitesnis nei Stygos
atliekant paprastus sujungimus. Į Stygos
manipuliavimo kodas, simbolių eilutės yra įprastai sujungtos. Naudojant Stygos
klasėje, sujungimai paprastai atliekami taip:
String str = nauja styga („Stanford“); str + = "Prarasta !!";
Jei naudotumėtės „StringBuffer“
norint atlikti tą patį sujungimą, jums reikės tokio kodo:
StringBuffer str = naujas StringBuffer („Stanfordas“); str.append („Pamesta !!“);
Kūrėjai paprastai daro prielaidą, kad pirmasis aukščiau pateiktas pavyzdys yra efektyvesnis, nes mano, kad antrasis pavyzdys, kuriame naudojamas pridėti
sujungimo metodas yra brangesnis nei pirmasis pavyzdys, kuriame naudojamas +
operatorius susieti du Stygos
objektai.
+
operatorius atrodo nekaltas, tačiau sugeneruotas kodas sukelia staigmenų. Naudojant a „StringBuffer“
sujungimui iš tikrųjų galima sukurti kodą, kuris yra žymiai greitesnis nei naudojant a Stygos
. Norėdami sužinoti, kodėl taip yra, turime išnagrinėti sugeneruotą baito kodą iš savo dviejų pavyzdžių. Pavyzdžio bytecode naudojant Stygos
atrodo taip:
0 naujas # 7 3 dup 4 ldc # 2 6 invokespecial # 12 9 astore_1 10 new # 8 13 dup 14 aload_1 15 invokestatic # 23 18 invokespecial # 13 21 ldc # 1 23 invokevirtual # 15 26 invokevirtual # 22 29 astore_1
Baitų kodas 0–9 vietose vykdomas pirmoje kodo eilutėje, būtent:
String str = nauja styga („Stanford“);
Tada susiejimui vykdomas baitų kodas 10–29 vietose:
str + = "Prarasta !!";
Čia viskas įdomu. Susiejimui sukurtas baitkodas sukuria „StringBuffer“
objektas, tada iškviečia jo pridėti
metodas: laikinas „StringBuffer“
objektas yra sukurtas 10 vietoje, ir jo pridėti
metodas vadinamas 23 vietoje. Kadangi Stygos
klasė yra nekintama, a „StringBuffer“
turi būti naudojami sujungimui.
Atlikus sujungimą „StringBuffer“
objektas, jis turi būti paverstas atgal į a Stygos
. Tai daroma iškvietus toString
metodas vietoje 26. Šis metodas sukuria naują Stygos
objektas iš laikino „StringBuffer“
objektas. Šio laikino kūrimas „StringBuffer“
objektas ir tolesnis jo pavertimas atgal į a Stygos
objektas yra labai brangus.
Apibendrinant galima pasakyti, kad dvi pirmiau nurodytos kodo eilutės sukuria tris objektus:
- A
Stygos
objektas 0 vietoje - A
„StringBuffer“
objektas 10 vietoje - A
Stygos
objektas 26 vietoje
Dabar pažvelkime į pavyzdžio, sukurto, baitų kodą „StringBuffer“
:
0 naujų # 8 3 dup 4 ldc # 2 6 invokespecial # 13 9 astore_1 10 aload_1 11 ldc # 1 13 invokevirtual # 15 16 pop
Baitų kodas 0–9 vietose vykdomas pirmoje kodo eilutėje:
StringBuffer str = naujas StringBuffer („Stanfordas“);
Tada baitekodas 10–16 vietoje vykdomas sujungiant:
str.append („Pamesta !!“);
Atkreipkite dėmesį, kad, kaip ir pirmame pavyzdyje, šis kodas naudoja pridėti
metodas „StringBuffer“
objektas. Skirtingai nuo pirmojo pavyzdžio, laikino sukurti nereikia „StringBuffer“
ir tada paverskite jį a Stygos
objektas. Šis kodas sukuria tik vieną objektą „StringBuffer“
, 0 vietoje.
Apibendrinant, „StringBuffer“
sujungimas yra žymiai greitesnis nei Stygos
sujungimas. Akivaizdu, „StringBuffer“
s, jei įmanoma, turėtų būti naudojami atliekant tokio tipo operacijas. Jei funkcionalumas Stygos
klasės pageidaujama, apsvarstykite galimybę naudoti a „StringBuffer“
sujungimui ir po to atliekant vieną konversiją į Stygos
.
Sužinokite daugiau apie šią temą
- "„JavaWorld“ debiutuoja nauja savaitinė „Java“ skiltis „Reggie Hutcherson („JavaWorld“, 2000 m. Kovo mėn.)
//www.javaworld.com/jw-03-2000/jw-03-javaperf.html
- „Java atlikimo pagrindai“, Reggie Hutcherson („JavaWorld“, 2000 m. Kovo mėn.)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_2.html
- "Našumo ar dizaino problema?" Reggie Hutcherson („JavaWorld“, 2000 m. Kovo mėn.)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_3.html
- „Kompiliatoriaus optimizavimas“, Reggie Hutcherson („JavaWorld“, 2000 m. Kovo mėn.)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_4.html
Šią istoriją „StringBuffer versus String“ iš pradžių išleido „JavaWorld“.