JavaRush /בלוג Java /Random-HE /String += String או StringBuilder.append(String)?
SemperAnte
רָמָה
Донецк

String += String או StringBuilder.append(String)?

פורסם בקבוצה
במאמר זה, ברצוני לשקול, לנתח, לספר ולהראות מה ההבדל בין שיטת append מהמחלקה StringBuilderלאופרטור +=עבור String. כאן השאלה תהיה לא כל כך בתחומי יישום כמו באופטימיזציה של קוד.
String += String או StringBuilder.append(String)?  - 1
כן, אדם שללא ספק לא העמיק בשאלה זו יגיד: "למה עלי להחליף את האופרטור += ביצירת אובייקט חדש של מחלקה אחרת לגמרי, ואז לקרוא גם למתודה toString()? איזו אופטימיות אנחנו מדברים על? הבחירה ברורה, על מה אתה מדבר?" והוא יטעה לחלוטין. אחת הבעיות היא שזה Stringלא פרימיטיבי. String- אובייקט כמו כל אובייקט classב-Java, וכידוע, ב-Java אין דבר כזה עומס אופרטור (כמו ב-C++, למשל), אופרטורים מוגדרים רק לפרימיטיבים, ולכל מחלקה אנחנו לא יכולים לעקוף שום אופרטור. זו הסיבה שהאופרטורים " +" ו" += " הם מעין "קב" של ספריית ג'אווה, וקב תמיד סופג הפסדים. למעשה, בואו נפסיק למשוך את זנבו של החתול ונעבור למדידות. הנה תוכנית פשוטה שמודדת את הזמן שלוקח "להדביק" קו עם משתנה לולאה 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");
    }
}
במחשב שלי, 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 ואני לא יודע מה יש ואיך). זוהי דוגמה ברורה לכך שחפץ נוסף אינו תמיד יקר. כן, הקוד יגדל בכמה שורות, אבל החיסכון בזמן בפרויקטים גדולים יכול להיות עצום. שימו לב שהמדידות לא נעשו על מחשב משרדי עם מעבד פרהיסטורי, אבל עכשיו תארו לעצמכם איזה הבדל זה יעשה במחשב המשרדי הזה, שבקושי יכול למשוך את הצעיף.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION