مصطلحات لغة جافا
1. دورة
في الحلقات المهمة، قم بإزالة استدعاءات الطريقة عند تحديد إنهاء الحلقة.
على سبيل المثال: سوف
for(int i=0; i<collection.size();i++){ ... }
استبدل ب…
for(int i=0; n=collection.size();i<n;i++){...}
عادةً، قم بنقل العناصر غير المرتبطة بفهرس الحلقة خارج الحلقة.
for(int i=0; Terminal=x.length;i<terminal;i++){x[i] = x[i]/scaleA *scaleB;}
ينبغي أن يكون:
مقياس مزدوج =scaleB*scaleA;for(int i=0; Terminal=x.length;i<terminal;i++){x[i] = x[i]/scale;}
2. خيط
القضاء على تسلسل السلسلة
عند إنشاء سلاسل طويلة، استخدم دائمًا StringBuffter بدلاً من String
التخصيص المسبق لمساحة StringBuffer StringBuffer sb = new StringBuffer(5000);
3. أنواع البيانات الأساسية
استخدم أنواع البيانات الأساسية في الحلقات المهمة (عادةً ما تكون بيانات int أسرع من البيانات الطويلة/المزدوجة)
تُستخدم فئات الالتفاف لأنواع البيانات الأساسية (المنطقية، والعددية، وما إلى ذلك) بشكل أساسي عندما يجب أن تكون معلمة الطريقة التي تم تمريرها مرجعًا لكائن (بدلاً من نوع بيانات أساسي)
استخدم المعدل النهائي الثابت في جميع التعبيرات الجبرية الثابتة لتسهيل الرجوع إلى الثوابت (يقوم المترجم بحساب التعبيرات الثابتة مسبقًا)
4. غير طبيعي
تُستخدم الاستثناءات فقط لحالة خطأ حقيقية واحدة، بحيث يكون طرح استثناء وتنفيذ كتلة التقاط باهظ الثمن (ويرجع ذلك أساسًا إلى الحصول على لقطة من مكدس مؤشر الترابط عند إنشاء استثناء)
يتم طرح الاستثناء فقط عندما يكون الشرط استثنائيًا حقًا. لطرح استثناء، عليك أولاً إنشاء كائن جديد.
يقوم منشئ الواجهة Throwable باستدعاء الطريقة الأصلية المسماة fillInStackTrace(). تقوم طريقة fillInStackTrace() بفحص المكدس وجمع معلومات تتبع المكالمات.
عندما يتم طرح استثناء، يتعين على الجهاز الظاهري ضبط مكدس الاستدعاءات لأنه يتم إنشاء كائن جديد أثناء المعالجة.
يجب استخدام الاستثناءات فقط لمعالجة الأخطاء ولا يجب استخدامها للتحكم في تدفق البرنامج.
قم بإجراء تحسينات على برنامج التحويل البرمجي ووقت التشغيل عن طريق وضع عدة استدعاءات للأسلوب في كتلة محاولة/التقاط بدلاً من تنفيذ عدة كتل محاولة/التقاط لكل استدعاء أسلوب
حاول { Some.method1(); // صعوبة في java1.4 }catch(method1Exception e){ التعامل مع الاستثناء
1 // لتحسين هذا الكود } حاول { Some.method2(); // صعب لـ java1.4 }catch(method2Exception e){ التعامل مع الاستثناء
2 // لتحسين هذا الكود } حاول { Some.method3(); // صعب لـ java1.4 }catch(method3Exception e){ التعامل مع الاستثناء
3 // لتحسين هذا الكود
}
ينبغي أن تكون مكتوبة على النحو التالي:
Try{ Some.method1(); Some.method2(); // صعب لـ java1.4 }catch(method1Exception e){ التعامل مع الاستثناء 1 }catch(method2Exception e){ التعامل مع الاستثناء 2 }catch( Method3Exception e){ التعامل مع الاستثناء 3 }
5. المعيار
لاحظ أن كل هذه النصائح ستختلف بين الأنظمة الأساسية والأجهزة الافتراضية
على سبيل المثال: في بعض حاويات servlet، يكون إخراج البايتات من خلال OutputStream أسرع
2. في الحاويات الأخرى، سيكون إخراج الأحرف من خلال PrintWriter أسرع
تصف هذه النصائح التوصيات الأكثر قابلية للنقل
قد تحتاج إلى تشغيل بعض المعايير لتحديد ما هو الأسرع على النظام الأساسي الخاص بك
6. قم بإنشاء مثيل لفئة دون استخدام الكلمة الأساسية الجديدة
عند إنشاء مثيل لفئة باستخدام الكلمة الأساسية الجديدة، يتم استدعاء جميع المنشئين في سلسلة المنشئ تلقائيًا.
ولكن إذا كان الكائن ينفذ واجهة قابلة للاستنساخ، فيمكننا استدعاء طريقة clone() الخاصة به. لا تستدعي طريقة clone () أي منشئي الفئة.
عند استخدام Design Pattern، إذا كنت تستخدم وضع المصنع لإنشاء كائن، فمن السهل جدًا استخدام طريقة clone() لإنشاء مثيل كائن جديد.
على سبيل المثال، ما يلي هو تطبيق نموذجي لنمط المصنع:
رصيد ثابت عام getNewCredit() { return new Credit() };
بعد التحسين:
Credit BaseCredit الخاص الثابت = new Credit(); public static Credit getNewCredit() { return (Credit) BaseCredit.clone();}
الأفكار المذكورة أعلاه مفيدة أيضًا لمعالجة المصفوفات.
7. استخدم الإدخال/الإخراج غير المحظور
لا تدعم JDKs ذات إصدارات Java الأقل واجهات برمجة تطبيقات الإدخال/الإخراج غير المحظورة. لتجنب حظر الإدخال/الإخراج، تقوم بعض التطبيقات بإنشاء عدد كبير من سلاسل العمليات (في الحالات الأفضل، يتم استخدام تجمع المخزن المؤقت). يمكن رؤية هذه التقنية في العديد من التطبيقات التي يجب أن تدعم تدفقات الإدخال/الإخراج المتزامنة، مثل خوادم الويب وتطبيقات عروض الأسعار والمزادات وما إلى ذلك. ومع ذلك، فإن إنشاء سلاسل رسائل Java يتطلب قدرًا كبيرًا من النفقات.
قدم JDK 1.4 مكتبة إدخال/إخراج غير محظورة (java.nio). إذا كان تطبيقك يتطلب إصدارًا أقدم من JDK، فهناك حزمة تدعم الإدخال/الإخراج غير المحظور.
8. لا تقم بتهيئة المتغيرات بشكل متكرر
بشكل افتراضي، عند استدعاء منشئ فئة ما، ستقوم Java بتهيئة المتغيرات إلى قيم معينة: يتم تعيين جميع الكائنات على قيمة خالية، ويتم تعيين المتغيرات الصحيحة (بايت، قصيرة، int، طويلة) على 0، ويتم تعيين المتغيرات العائمة والمزدوجة على 0.0، يتم تعيين القيمة المنطقية إلى خطأ.
يجب ملاحظة ذلك بشكل خاص عندما يتم اشتقاق فئة من فئة أخرى، لأنه عندما يتم إنشاء كائن باستخدام الكلمة الأساسية الجديدة، سيتم استدعاء جميع المُنشئين في سلسلة المُنشئ تلقائيًا.
9. حاول تحديد المعدل النهائي للفئة
لا يتم اشتقاق الفئات ذات المعدل النهائي. في Java Core API، هناك العديد من الأمثلة للتطبيق النهائي، مثل java.lang.String. تحديد نهائي لفئة السلسلة يمنع الأشخاص من تجاوز طريقة length().
بالإضافة إلى ذلك، إذا تم تعيين فصل دراسي على أنه نهائي، فستكون جميع أساليب الفصل نهائية. سيبحث مترجم Java عن فرص لتضمين جميع الطرق النهائية (يعتمد هذا على تنفيذ المترجم المحدد). وهذا يمكن أن يحسن الأداء بمعدل 50٪.
10. استخدم المتغيرات المحلية كلما أمكن ذلك
يتم حفظ المعلمات التي تم تمريرها عند استدعاء الطريقة والمتغيرات المؤقتة التي تم إنشاؤها أثناء المكالمة في المكدس (المكدس)، وهو أسرع. يتم إنشاء المتغيرات الأخرى، مثل المتغيرات الثابتة ومتغيرات المثيل وما إلى ذلك، في الكومة وهي أبطأ. بالإضافة إلى ذلك، اعتمادًا على المترجم/JVM المحدد، قد يتم تحسين المتغيرات المحلية بشكل أكبر. راجع استخدام متغيرات المكدس حيثما أمكن ذلك.
11. الضرب والقسمة
خذ بعين الاعتبار الكود التالي:
for (val = 0; val < 100000; val +=5) { alterX = val * 8;
بعد التحسين:
for (val = 0; val < 100000; val += 5) { alterX = val << 3;
لم يعد الكود المعدل ينفذ عملية الضرب في 8، ولكنه بدلاً من ذلك يستخدم العملية المكافئة المتمثلة في تحويل 3 بتات إلى اليسار، كل تحول يسار بمقدار 1 بت يعادل الضرب في 2. في المقابل، فإن عملية التحول إلى اليمين بمقدار 1 بت تعادل القسمة على 2. ومن الجدير بالذكر أنه على الرغم من أن عملية النقل سريعة، إلا أنها قد تزيد من صعوبة فهم الكود، لذا من الأفضل إضافة بعض التعليقات.
Credit BaseCredit الخاص الثابت = new Credit(); public static Credit getNewCredit() {return (Credit) BaseCredit.clone();}