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



3 Answers

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

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

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

أو

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

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

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

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




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

لقد لاحظت أثناء استعراض شفرة مصدر Java أن بعض الطرق ، مثل 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;
}



عندما أستخدم مؤشرات ترابط متعددة (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();
}



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

بدلا من

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];
}

أي أشياء أخرى يجب أخذها في الإعتبار تم ذكرها بالفعل ، لذلك فقط سنتي (راجع مشاركة إيريكسون)

غريتز ، غاد




Related