[Java] أي حلقة لديها أداء أفضل؟ لماذا ا؟


Answers

من الناحية النظرية ، انها مضيعة للموارد لإعلان سلسلة داخل حلقة. ومع ذلك، في الممارسة العملية ، فإن كل من المقتطفات التي تقدمها سيتم تجميعها إلى نفس الرمز (إعلان خارج الحلقة).

لذلك، إذا المترجم الخاص بك يفعل أي قدر من التحسين، ليس هناك فرق.

Question
String s = "";
for(i=0;i<....){
    s = some Assignment;
}

أو

for(i=0;i<..){
    String s = some Assignment;
}

أنا لست بحاجة إلى استخدام 'ق' خارج حلقة من أي وقت مضى مرة أخرى. الخيار الأول ربما يكون أفضل لأنه لم يتم تهيئة سلسلة جديدة في كل مرة. والثانية مع ذلك سوف يؤدي إلى نطاق المتغير يقتصر على حلقة نفسها.

إديت: ردا على إجابة ميلهوس. سيكون من غير المجدي تعيين سلسلة إلى ثابت داخل حلقة لن ذلك؟ لا، هنا "بعض التعيين" يعني قيمة متغيرة تم الحصول عليها من القائمة التي يتم تكرارها من خلال.

أيضا، والسؤال ليس لأنني قلق بشأن إدارة الذاكرة. نريد فقط أن نعرف ما هو أفضل.




وأنا أعلم أن هذا هو السؤال القديم، ولكن اعتقدت أن أضيف قليلا التي ترتبط قليلا .

لقد لاحظت أثناء تصفح التعليمات البرمجية المصدر جافا أن بعض الطرق، مثل String.contentEquals (مكررة أدناه) يجعل المتغيرات المحلية الزائدة التي هي مجرد نسخ من المتغيرات فئة. وأعتقد أن هناك تعليق في مكان ما، وهذا يعني أن الوصول إلى المتغيرات المحلية أسرع من الوصول إلى المتغيرات الصف.

في هذه الحالة "v1" و "v2" على ما يبدو لا لزوم لها ويمكن القضاء عليها لتبسيط التعليمات البرمجية، ولكن أضيفت لتحسين الأداء.

public boolean contentEquals(StringBuffer sb) {
    synchronized(sb) {
        if (count != sb.length())
            return false;
        char v1[] = value;
        char v2[] = sb.getValue();
        int i = offset;
        int j = 0;
        int n = count;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
                return false;
        }
    }
    return true;
}



إذا كنت ترغب في تسريع الحلقات، وأنا أفضل إعلان متغير كحد أقصى بجانب العداد بحيث لا توجد عمليات بحث المتكررة ل كونديدتيون هناك حاجة:

بدلا من

for (int i = 0; i < array.length; i++) {
  Object next = array[i];
}

أنا أفضل

for (int i = 0, max = array.lenth; i < max; i++) {
  Object next = array[i];
}

أي أمور أخرى ينبغي أن تؤخذ بعين الاعتبار سبق ذكرها، لذلك فقط بلدي سنتان (انظر إريكسونس آخر)

غريتز، غاد




عندما أستخدم مؤشرات الترابط متعددة (50+) ثم وجدت هذا أن يكون وسيلة فعالة جدا لمعالجة القضايا موضوع شبح مع عدم القدرة على إغلاق عملية بشكل صحيح .... إذا كنت مخطئا، واسمحوا لي أن أعرف لماذا انا مخطئ:

Process one;
BufferedInputStream two;
try{
one = Runtime.getRuntime().exec(command);
two = new BufferedInputStream(one.getInputStream());
}
}catch(e){
e.printstacktrace
}
finally{
//null to ensure they are erased
one = null;
two = null;
//nudge the gc
System.gc();
}