Бул макалада мен класстагы тиркеме ыкмасы
Ооба, бул суроонун тереңине кирбеген адам мындай дейт: “Эмне үчүн мен += операторун такыр башка класстын жаңы an objectин түзүү менен алмаштырып, анан методду да чакырышым керек?
StringBuilder
менен оператордун +=
ортосунда кандай айырма бар экенин карап, талдап, айтып жана көрсөткүм келет String
. Бул жерде суроо колдонуу чөйрөсүндө эмес, codeду оптималдаштырууда болот.
toString()
Биз кандай оптималдуубуз? Тандоо ачык көрүнүп турат, эмнени айтып жатасың?» жана ал таптакыр туура эмес болмок. Көйгөйлөрдүн бири – String
бул примитивдүү эмес. String
- Java тorндеги башка an object сыяктуу an object class
жана сиз билгендей, Javaда операторду ашыкча жүктөө деген нерсе жок (мисалы, C++ тorндегидей), операторлор примитивдер үчүн гана аныкталат жана кайсы бир класс үчүн биз эч кандай операторду жокко чыгара албайбыз. Ошондуктан " +
" жана " +
= " операторлору Java китепканасынын кандайдыр бир "балдак" болуп саналат жана балдак ар дайым жоготууга учурайт. Негизи мышыктын куйругун тартууну токтотуп, өлчөөлөргө өтөлү. Бул жерде цикл өзгөрмөлүү сызыкты 100 000 жолу “жабыштырып” коюуга кеткен убакытты өлчөгөн жөнөкөй программа.
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
String s = "Hello";
for(int i = 0; i < 100000; ++i)
{
s+=i;
}
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
Менин компьютеримде консолдо 6815 мс көрсөтүлдү. Башкача айтканда, бул сызыкты бириктирүү үчүн менин компьютерим дээрлик 7 секунд талап кылынды. Эми аны StringBuilder менен алмаштырып, ал тургай методду toString()
өлчөөлөргө киргизели.
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
StringBuilder sb = new StringBuilder("Hello");
for(int i = 0; i < 100000; ++i)
{
sb.append(i);
}
String s = sb.toString();
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
Менин PC мага 10ms айтты. Башкача айтканда, 0,01 секунд. Менин оюмча, иш жүзүндө айырма айкын көрүнүп турат; болжол менен айтканда, ал 700 эсе append
тезирээк иштеген. +
Бул, кыязы, " " жана " +=
" бир эле тиркемени атай алат, бирок ошол эле учурда мындай оператордун дегеле бар экенин жана эмне экенин түшүнүү үчүн тилдин балдактары аркылуу бир топ жолду басып өтүү менен шартталган. ал кылышы керек (акыркы абзац болжолдоодон башка эч нерсе эмес, мен JVM иштеп чыгуучусу эмесмин жана ал жерде эмне жана кантип бар экенин билбейм). Бул ашыкча an object дайыма эле кымбат эмес экендигинин ачык мисалы. Ооба, code бир нече сапка созулат, бирок ири долбоорлордо убакытты үнөмдөө өтө чоң болушу мүмкүн. Көңүл буруңуз, өлчөөлөр тарыхка чейинки процессору бар кеңсе компьютеринде жасалган эмес, бирок азыр элестетип көрүңүз, ал жоолукту араң тарта турган дал ушул кеңсе компьютеринде кандай айырмачылыктарды жаратат.
GO TO FULL VERSION