تفاصيل تحسين الكود
1. حاول تحديد أن المعدل النهائي للفصل والطريقة. لا يمكن اشتقاق الفصول ذات المعدلات النهائية مع المعدلات النهائية. في Java Core API ، هناك العديد من الأمثلة على تطبيق النهائي ، مثل java.lang.string ، والفئة بأكملها نهائية. يمكن أن يؤدي تحديد المعدل النهائي للفئة إلى منع الفصل بين الفئة ، وتحديد المعدل النهائي للطريقة يمكن أن يمنع تجاوز الطريقة. إذا تم تحديد الفصل على أنه نهائي ، فإن جميع أساليب تلك الفئة نهائية. سيبحث برنامج التحويل البرمجي Java عن فرص لتضمين جميع الأساليب النهائية. المضمون له أهمية كبيرة لتحسين كفاءة تشغيل Java.
2. حاول إعادة استخدام استخدام الكائنات ، وخاصة كائنات السلسلة. عند حدوث تسلسل السلسلة ، يجب استخدام StringBuilder/StringBuffer بدلاً من ذلك. نظرًا لأن أجهزة Java Virtual لا تحتاج فقط إلى قضاء بعض الوقت في توليد الكائنات ، فقد تحتاج أيضًا إلى قضاء وقت في جمع هذه الكائنات ومعالجتها في المستقبل ، فإن توليد الكثير من الكائنات سيكون له تأثير كبير على أداء البرنامج.
3. استخدم المتغيرات المحلية لاستدعاء أساليب قدر الإمكان. يتم تمرير المعلمات عند استدعاء طرق الاتصال والمتغيرات المؤقتة التي تم إنشاؤها في المكالمة على المكدس بشكل أسرع. يتم إنشاء متغيرات أخرى ، مثل المتغيرات الثابتة ، ومتغيرات المثيل ، وما إلى ذلك ، في الكومة ، والسرعة أبطأ. بالإضافة إلى ذلك ، مع انتهاء المتغيرات التي تم إنشاؤها في المكدس ، يتم اختفاء هذه المحتويات ولا يلزم وجود مجموعة إضافية من القمامة.
4. أغلق التدفق في الوقت المناسب
أثناء برمجة Java ، كن حذرًا عند إجراء اتصال قاعدة البيانات وعمليات دفق الإدخال/الإخراج. بعد الاستخدام ، أغلقه في الوقت المناسب لإصدار الموارد. نظرًا لأن تشغيل هذه الكائنات الكبيرة سيؤدي إلى إدراج نظام كبير ، وإذا لم تكن حذراً ، فسيؤدي ذلك إلى عواقب وخيمة.
5. حاول تقليل الحساب المتكرر للمتغيرات ، وتوضيح المفهوم. حتى إذا كانت هناك جملة واحدة فقط في هذه الطريقة ، فلا يزال مستهلكًا ، بما في ذلك إنشاء إطارات المكدس ، وحماية الموقع عند استدعاء الطريقة ، واستعادة الموقع عند استدعاء الطريقة. على سبيل المثال ، العملية التالية:
لـ (inti = 0 ؛ i <list.size () ؛ i ++)
{...} يوصى باستبداله بـ:
لـ (inti = 0 ، length = list.size () ؛ i <length ؛ i ++)
{...}
وبهذه الطريقة ، عندما تكون list.size () كبيرة جدًا ، فإنها تقلل من الكثير من الاستهلاك
6. حاول تبني استراتيجية تحميل كسول ، أي أنشئها عند الحاجة
7. استخدام الشذوذ بحذر سيكون ضارًا بالأداء. لرمي استثناء ، يجب أولاً إنشاء كائن جديد. يستدعي مُنشئ الواجهة القابلة للتسمية طريقة التزامن المحلي المسماة FillInstackTrace (). تقوم طريقة FillInstackTrace () بالتحقق من المكدس وتجمع معلومات تتبع المكالمات. طالما تم طرح استثناء ، يجب على جهاز Java Virtual ضبط مكدس الاتصال لأنه يتم إنشاء كائن جديد أثناء المعالجة. لا يمكن استخدام الاستثناءات إلا لمعالجة الأخطاء ويجب عدم استخدامها للتحكم في تدفق البرنامج.
8. لا تستخدم المحاولة ... الصيد ... في الحلقة ، يجب وضعها على الطبقة الخارجية
وفقًا للآراء التي طرحها مستخدمي الإنترنت ، أعتقد أن هذا يستحق المناقشة
9. إذا كنت تستطيع تقدير طول المحتوى المراد إضافته ، حدد الطول الأولي لفئات التجميع والأدوات المنفذة في صفيف ، مثل ArrayList و LinkedLlist و StringBuilder و StringBuffer و HashMap و Hashset ، إلخ.
(1) StringBuilder () // الافتراضي لتخصيص 16 حرفًا (2) StringBuilder (حجم int) // الافتراضي لتخصيص 16 حرفًا (3) StringBuilder (String str) // الافتراضي لتخصيص 16 حرفًا + str.length () ، يمكنك تعيين قدرتها على التهيئة من خلال فئة الفئة (هنا لا تشير فقط إلى سلسلة BringBuilder أعلاه ، وهو أمر يمكن تحسينه بشكل كبير. على سبيل المثال ، StringBuilder ، يمثل الطول عدد الأحرف التي يمكن أن يحافظ عليها StringBuilder الحالية. لأنه عندما يصل StringBuilder إلى الحد الأقصى لسعةه ، فإنه سيزيد من قدرته إلى مرتين ويضيف 2. كلما وصلت StringBuilder إلى أقصى قدرتها ، فسيتعين عليها إنشاء صفيف أحرف جديد ونسخ محتوى صفيف الأحرف القديم إلى صفيف الأحرف الجديد - هذه عملية تستهلك الأداء للغاية. فقط تخيل ، إذا كان بإمكانك تقدير أن 5000 حرف يتم تخزينها في صفيف الأحرف دون تحديد الطول ، فإن قوة 2 الأقرب إلى 5000 هي 4096 ، والمضاف إلى كل توسع بغض النظر عن 2 ، ثم:
(1) استنادًا إلى 4096 ، تقدم بطلب للحصول على 8194 صفائف أحرف ، والتي تضيف ما يصل إلى 12290 صفائف أحرف بحجم 12290 مرة واحدة. إذا تمكنت من تحديد صفائف أحرف بحجم 5000 في البداية ، فسيوفر أكثر من ضعف المساحة (2) نسخ أحرف 4096 الأصلية في صفيف الأحرف الجديد بهذه الطريقة ، والتي لن تضيع مساحة الذاكرة فحسب ، بل تقلل أيضًا من كفاءة تشغيل الكود. لذلك ، ليس من الخطأ تحديد قدرة تهيئة معقولة لفئات التجميع والأدوات المنفذة في الصفيف الأساسي ، والتي ستحقق نتائج فورية. ومع ذلك ، لاحظ أن مجموعات مثل hashmap التي يتم تنفيذها في المصفوفات + القوائم المرتبطة يجب ألا تحدد الحجم الأولي بنفس الحجم المقدر الخاص بك ، لأن إمكانية كائن واحد فقط متصل بجدول ما هو ما يقرب من 0. يوصى بتعيين الحجم الأولي على طاقة n من 2.
10. عند نسخ كمية كبيرة من البيانات ، استخدم الأمر system.arraycopy ()
11. الضرب والقسمة استخدام عمليات التحول
12. لا تنشئ مراجع كائن باستمرار في الحلقة
على سبيل المثال:
لـ (inti = 1 ؛ i <= count ؛ i ++) {object obj = newObject () ؛ }سيؤدي هذا النهج إلى وجود مرجع كائن الكونت في الذاكرة. إذا كان العدد كبيرًا ، فسوف يستهلك الذاكرة. يوصى بتغييره إلى:
Object obj = null ؛ for (inti = 0 ؛ i <= count ؛ i ++) {obj = newObject () ؛} وبهذه الطريقة ، هناك مرجع كائن واحد فقط في الذاكرة. في كل مرة يتم فيها استخدام كائن جديد () ، يشير مرجع كائن الكائن إلى كائن مختلف ، ولكن لا يوجد سوى كائن واحد في الذاكرة ، والذي يحفظ مساحة الذاكرة بشكل كبير.
13. بناءً على النظر في الكفاءة والتحقق من النوع ، يجب استخدام الصفيف قدر الإمكان. يجب استخدام ArrayList فقط عندما لا يمكن تحديد حجم الصفيف.
14. حاول استخدام HashMap و ArrayList و StringBuilder. ما لم يتطلب الأمر آمنًا لرسائل الخيط ، فلا يوصى باستخدام علامة التجزئة ، المتجه ، و stringBuffer. الثلاثة الأخيرة لها النفقات العامة للأداء بسبب استخدام آليات التزامن.
15. لا تعلن المصفوفات كنهائي ثابت عام
نظرًا لأن هذا لا معنى له ، فإنه يعرّف فقط المرجع على أنه نهائي ثابت ، ولا يزال من الممكن تغيير محتوى الصفيف حسب الرغبة. إن إعلان الصفيف باعتباره عامًا هو ثغرة أمنية ، مما يعني أنه يمكن تغيير الصفيف بواسطة فئات خارجية
16. حاول استخدام المفردات في مناسبات مناسبة. يمكن أن يؤدي استخدام المفردات إلى تقليل عبء الحمل ، وتقصير وقت التحميل ، وتحسين كفاءة التحميل. ومع ذلك ، ليست جميع الأماكن مناسبة للفرد. ببساطة ، يتم تطبيق المفردات بشكل أساسي على الجوانب الثلاثة التالية:
(1) التحكم في استخدام الموارد ، والتحكم في الوصول المتزامن للموارد من خلال مزامنة الخيط (2) التحكم في توليد الحالات لتحقيق الغرض من توفير الموارد (3) التحكم في مشاركة البيانات ، وتمكين التواصل بين عمليات أو مؤشرات ترابط متعددة دون إنشاء ارتباطات مباشرة.
17. حاول تجنب استخدام المتغيرات الثابتة في الإرادة
الفئة العامة A {private static b b = newb () ؛ } في هذا الوقت ، فإن دورة حياة المتغير الثابت B هي نفس دورة الفئة A A. إذا لم يتم إلغاء تثبيت الفئة A ، فسيتم الإشارة إلى الكائن B بالمرجع B في الذاكرة حتى ينتهي البرنامج
18. واضح لم يعد هناك حاجة إلى جلسات في الوقت المناسب. من أجل مسح الجلسات التي لم تعد نشطة ، فإن العديد من خوادم التطبيقات لديها مهلة جلسة افتراضية ، عمومًا 30 دقيقة. عندما يحتاج خادم التطبيق إلى حفظ المزيد من الجلسات ، إذا لم تكن هناك ذاكرة كافية ، فسيقوم نظام التشغيل بنقل جزء من البيانات إلى القرص. قد يقوم خادم التطبيق أيضًا بتفريغ بعض الجلسات غير النشطة على القرص وفقًا لخوارزمية MRU (في أغلب الأحيان المستخدمة مؤخرًا) ، وقد يرمي استثناءات ذاكرة غير كافية. إذا تم إلقاء الجلسة على القرص ، فيجب أن يتم تسلسلها أولاً. في مجموعات واسعة النطاق ، فإن الأشياء التسلسلية غالية الثمن. لذلك ، عندما لم تعد الجلسة مطلوبة ، يجب استدعاء طريقة perilidate () من HTTPSESSINT في الوقت المناسب لمسح الجلسة.
19. بالنسبة للمجموعات التي تنفذ واجهات RandomAccess ، مثل ArrayList ، يجب عليك استخدام الحلقة الأكثر شيوعًا بدلاً من Foreach Loop لاجتياز ذلك من قبل JDK للمستخدمين. إن شرح JDK API لواجهة RandomAccess هو: تطبيق واجهة RandomAccess يستخدم للإشارة إلى أنه يدعم الوصول العشوائي السريع. الغرض الرئيسي من هذه الواجهة هو السماح للخوارزميات العامة بتغيير سلوكها ، بحيث يمكن أن توفر أداءً جيدًا عند تطبيقه على قوائم الوصول العشوائية أو المستمرة. توضح التجربة العملية أنه إذا تم الوصول إلى مثيلات الفصل التي تنفذ واجهة RandomAccess بشكل عشوائي ، فستكون كفاءة استخدام الحلقات العادية أعلى من استخدام حلقات Foreach ؛ على العكس ، إذا تم الوصول إليها بالتتابع ، فسيكون من أكثر كفاءة استخدام Iterator. يمكنك استخدام رموز مشابهة لما يلي لإصدار الأحكام:
if (list easuleofrandomaccess) {for (inti = 0 ؛ i <list.size () ؛ i ++) {}} else {iterator <؟> iterator = list.iterable () ؛ بينما (iterator.hasnext ()) {iterator.next ()}} مبدأ التنفيذ الأساسي لحلقة Foreach هو التكرار ، وبالتالي فإن النصف الثاني من الجملة "بدوره ، إذا تم الوصول إليه بالتتابع ، فإن استخدام ITerator سيكون أكثر كفاءة" يعني أن مثيلات الفئة التي يتم الوصول إليها بشكل متتابع ، واستخدام حلقة Foreach للتجارة.
20. تم شرح استخدام كتل التعليمات البرمجية المتزامنة بدلاً من طرق المزامنة بوضوح شديد في مقالة كتلة طريقة القفل المتزامنة في وحدة النمط متعدد الخيوط. ما لم يكن من الممكن تحديد أن الطريقة بأكملها تحتاج إلى مزامنة ، فحاول استخدام كتل التعليمات البرمجية المتزامنة لتجنب مزامنة تلك الرموز التي لا تحتاج إلى مزامنة ، مما يؤثر على كفاءة تنفيذ الكود.
21. أعلن أن الثوابت كنهائي ثابت وتسميةها في رأس المال بحيث يمكن وضع هذه المحتويات في التجمع الثابت أثناء التجميع ، وتجنب حساب القيم الثابتة التي تم إنشاؤها أثناء وقت التشغيل. بالإضافة إلى ذلك ، فإن تسمية اسم ثابت في رأس المال يمكن أن يسهل التمييز بين الثوابت والمتغيرات
22. لا تنشئ بعض الكائنات غير المستخدمة ، لا تستورد بعض الفصول غير المستخدمة
هذا لا معنى له. إذا لم يتم استخدام "قيمة المتغير المحلي أنا غير مستخدم" و "الاستيراد java.util لا يتم استخدامه أبدًا"
23. تجنب استخدام التفكير أثناء تشغيل البرنامج. لمزيد من المعلومات ، يرجى الاطلاع على التفكير. الانعكاس هو وظيفة قوية للغاية توفرها Java للمستخدمين. وظائف قوية غالبا ما تعني كفاءة منخفضة. لا ينصح باستخدام آلية الانعكاس في عملية تشغيل البرنامج ، وخاصة طريقة استدعاء الطريقة. إذا كان ذلك ضروريًا بالفعل ، فإن النهج الموحي هو إنشاء مثيل لكائن من خلال التفكير ووضعه في الذاكرة عند بدء تشغيل المشروع - يهتم المستخدم فقط بأسرع سرعة استجابة عند التفاعل مع الأقران ، ولا يهتم بالمدة التي يستغرقها مشروع الأقران.
24. استخدم تجمع اتصالات قاعدة البيانات ومسبح مؤشرات الترابط ، يتم استخدام كلا التجمعين ، لإعادة استخدام الكائنات. يمكن أن يتجنب السابق فتح وإغلاق الاتصالات المتكررة ، ويمكن أن يتجنب الأخير خلق وتدمير الخيوط المتكررة.
25. استخدم تدفقات الإدخال والإخراج المخزنة لعمليات IO
تدفقات الإدخال والإخراج المخزنة ، وهي BufferredReader ، و CupheredWriter ، و BufferedInputStream ، و BufferedOutputStream ، والتي يمكن أن تحسن بشكل كبير من كفاءة IO
26. استخدم ArrayList للمشاهد مع المزيد من الإدراج المتسلسل والوصول العشوائي ، واستخدم LinkedList للمشاهد مع المزيد من حذف العناصر والإدراج الوسيط.
هذا معروف من خلال فهم مبادئ arraylist و LinkedList
27. لا تدع الكثير من المعلمات الرسمية في الطريقة العامة
الطريقة العامة هي طريقة مقدمة للعالم الخارجي. إذا أعطيت هذه الطرق الكثير من المعلمات الرسمية ، فهناك عيوبان رئيسيتان:
1) انتهاك فكرة البرمجة الموجهة نحو الكائن. تؤكد جافا على أن كل شيء هو كائن. لا تتماشى الكثير من المعلمات الرسمية مع فكرة البرمجة الموجهة للكائنات.
2) سيؤدي الكثير من المعلمات حتما إلى زيادة في احتمال الخطأ في استدعاء الطريقة. أما بالنسبة لعدد "عدد كبير جدًا" يشير إلى ، 3 أو 4. على سبيل المثال ، نستخدم JDBC لكتابة طريقة insertStudentInfo. هناك 10 حقول معلومات للطلاب يتم إدراجها في طاولة الطلاب. يمكن تغليف هذه المعلمات العشرة في فئة الكيان كمعلمات رسمية لطريقة إدراج.
28. عند كتابة متغيرات السلسلة وثوابت السلسلة متساوية ، فهي خدعة شائعة نسبيًا لكتابة ثوابت السلسلة في المقدمة. إذا كان هناك الرمز التالي:
String str = "123" ؛ if (str.equals ("123")) {...} يوصى بتعديله إلى:
String str = "123" ؛ if ("123" .equals (str)) {...} هذا يمكن أن يتجنب بشكل أساسي استثناءات المؤشر الفارغ
32. لا تجبر التحول الهبوطي لأنواع البيانات الأساسية خارج النطاق
33. تحويل نوع البيانات الأساسية إلى سلسلة. نوع البيانات الأساسي. toString () هو أسرع طريقة ، تليها سلسلة.
publicstatic void main (string [] args) {IntloOptime = 50000 ؛ عدد صحيح i = 0 ؛ LongStartTime = System.CurrentTimeMillis () ؛ لـ (intj = 0 ؛ j <looptime ؛ j ++) {string str = string.valueof (i) ؛ } system.out.println ("string.valueof ():" + (System.CurrentTimeMillis () - StartTime) + "MS") ؛ startTime = system.currentTimeMillis () ؛ لـ (INTJ = 0 ؛ j <looptime ؛ j ++) {String str = i.toString () ؛ } system.out.println ("Integer.ToString ():" + (System.CurrentTimeMillis () - StartTime) + "MS") ؛ startTime = system.currentTimeMillis () ؛ لـ (INTJ = 0 ؛ j <looptime ؛ j ++) {string str = i+"" ؛ } system.out.println ("i + /" /":النتيجة الجارية هي:
string.valueof (): 11msinteger.toString (): 5ms + "": 25ms
لذلك ، عندما تقوم بتحويل نوع بيانات أساسي إلى سلسلة في المستقبل ، يجب أن تعطي الأولوية لاستخدام طريقة ToString (). أما السبب ، الأمر بسيط للغاية:
1. تسمى طريقة string.valueof () طريقة integer.toString () في الأسفل ، لكنها ستصدر حكمًا قصيرًا قبل الاتصال.
2. لن أتحدث عن طريقة integer.tostring () ، سأسميها مباشرة.
3. تستخدم الطبقة السفلية لـ I + "" StringBuilder لتنفيذها. استخدم أولاً طريقة إلحاق الصقور ، ثم استخدم طريقة ToString () للحصول على السلسلة. من الواضح أنه أسرع 2 ، أسرع 1 ، وأبطأ 3.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.