در این مقاله، من می خواهم در نظر بگیرم، تجزیه و تحلیل کنم، بگویم و نشان دهم که تفاوت متد append از کلاس
بله، شخصی که بدون شک عمیقاً به این سؤال نرفته است، می گوید: "چرا باید عملگر += را با ایجاد یک شی جدید از یک کلاس کاملاً متفاوت جایگزین کنم و سپس متد را نیز فراخوانی کنم
StringBuilder
و عملگر +=
برای چیست String
. در اینجا این سوال نه در زمینه های کاربردی که در بهینه سازی کد مطرح می شود.
toString()
؟ ما از چه نوع بهینه ای هستیم؟ در مورد صحبت کردن؟ انتخاب واضح است، در مورد چه چیزی صحبت می کنید؟ و او کاملا در اشتباه خواهد بود. یکی از مشکلات این است که String
ابتدایی نیست. String
- یک شی مانند هر شی دیگری class
در جاوا، و همانطور که می دانید، در جاوا چیزی به نام بارگذاری بیش از حد اپراتور وجود ندارد (مثلاً در C++)، عملگرها فقط برای موارد اولیه تعریف می شوند و برای هر کلاسی نمی توانیم هیچ عملگر را لغو کنیم. به همین دلیل است که عملگرهای " +
" و " +
= " نوعی "عصا" کتابخانه جاوا هستند و یک عصا همیشه متحمل ضرر می شود. در واقع، بیایید کشیدن دم گربه را متوقف کنیم و به اندازه گیری ها بپردازیم. در اینجا یک برنامه ساده وجود دارد که زمان لازم برای "چسباندن" یک خط با یک متغیر حلقه را 100000 بار اندازه گیری می کند.
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");
}
}
در کامپیوتر من 6815ms در کنسول نمایش داده شد. یعنی کامپیوتر من تقریباً 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");
}
}
کامپیوتر من به من گفت 10ms. یعنی 0.01 ثانیه. من فکر می کنم تفاوت در عمل کاملاً آشکار است؛ به طور کلی، 700 برابر append
سریعتر کار کرد. این به این دلیل است که به احتمال زیاد " +
" و " +=
" خود می توانند یک ضمیمه را صدا بزنند ، اما در عین حال راه طولانی را از طریق عصاهای زبان طی کرده اند تا بفهمند که چنین عملگر حتی وجود دارد و چیست باید انجام دهید (بند آخر چیزی بیش از یک حدس نیست، من یک توسعه دهنده JVM نیستم و نمی دانم چه چیزی وجود دارد و چگونه). این یک مثال واضح از این واقعیت است که یک شی اضافی همیشه گران نیست. بله، کد چند خط طولانی تر می شود، اما صرفه جویی در زمان در پروژه های بزرگ می تواند بسیار زیاد باشد. لطفاً توجه داشته باشید که اندازهگیریها روی رایانههای شخصی اداری با پردازنده ماقبل تاریخ انجام نشده است، اما اکنون تصور کنید که چه تفاوتی در این رایانه اداری ایجاد میکند که به سختی میتواند روسری را بکشد.
GO TO FULL VERSION