java - لماذا يتم طباعة "B" بشكل أبطأ بشكل كبير من طباعة "#"؟
performance loops (2)
لقد أنشأت مصفوفتين 1000
× 1000
:
المصفوفة الأولى: O
و #
.
المصفوفة الثانية: O
و B
باستخدام التوليف التالي ، استغرقت المصفوفة الأولى 8.52 ثانية لإكمالها:
Random r = new Random();
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if(r.nextInt(4) == 0) {
System.out.print("O");
} else {
System.out.print("#");
}
}
System.out.println("");
}
باستخدام هذا الرمز ، استغرقت المصفوفة الثانية 259.152 ثانية لإكمالها:
Random r = new Random();
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if(r.nextInt(4) == 0) {
System.out.print("O");
} else {
System.out.print("B"); //only line changed
}
}
System.out.println("");
}
ما السبب وراء أوقات التشغيل المختلفة بشكل مثير؟
كما هو مقترح في التعليقات ، System.out.print("#");
فقط System.out.print("#");
يستغرق 7.8871
ثانية ، بينما System.out.print("B");
يعطي still printing...
مثل الآخرين الذين أشاروا إلى أنه يعمل لهم بشكل طبيعي ، حاولت Ideone.com على سبيل المثال ، وكلا من أجزاء التعليمات البرمجية تنفيذ في نفس السرعة.
شروط الاختبار:
- أجريت هذا الاختبار من Netbeans 7.2 ، مع الإخراج في وحدة التحكم الخاصة به
- اعتدت
System.nanoTime()
للقياسات
أجريت اختبارات على Eclipse vs Netbeans 8.0.2 ، كلاهما مع الإصدار 1.8 من Java ؛ اعتدت System.nanoTime()
للقياسات.
كسوف:
حصلت على نفس الوقت في الحالتين - حوالي 1.564 ثانية .
نتبيانس:
- باستخدام "#": 1.536 ثانية
- باستخدام "ب": 44.164 ثانية
لذا ، يبدو أن Netbeans لديه أداء سيئ في الطباعة إلى وحدة التحكم.
بعد المزيد من البحث ، أدركت أن المشكلة هي line-wrapping الحد الأقصى لمخزون Netbeans (لا يقتصر الأمر على System.out.println
) ، كما هو موضح في هذا الكود:
for (int i = 0; i < 1000; i++) {
long t1 = System.nanoTime();
System.out.print("BBB......BBB"); \\<-contain 1000 "B"
long t2 = System.nanoTime();
System.out.println(t2-t1);
System.out.println("");
}
تكون نتائج الوقت أقل من 1 ميلي ثانية كل تكرار باستثناء كل خمس مرات ، عندما تكون النتيجة الزمنية حوالي 225 مللي ثانية. شيء من هذا القبيل (في النانوسيكند):
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
.
.
.
وما إلى ذلك وهلم جرا..
ملخص:
- يعمل Eclipse بشكل مثالي مع "B"
- لدى Netbeans مشكلة التفاف خط يمكن حلها (لأن المشكلة لا تحدث في الكسوف) (بدون إضافة مسافة بعد B ("B")).
والتكهنات النقية هي أنك تستخدم طرفًا يحاول القيام word-wrapping بدلاً من التفاف الأحرف ، ويعامل B
كحرف كلمة ، ولكن #
كحرف غير الكلمة. لذلك عندما يصل إلى نهاية السطر ويبحث عن مكان لكسر الخط ، فإنه يرى فواصل على الفور تقريبا وبسعادة هناك ؛ في حين أنه مع B
، فإنه يجب أن يستمر في البحث لفترة أطول ، وقد يحتوي على المزيد من النص للالتفاف (والذي قد يكون مكلفًا في بعض المطاريف ، على سبيل المثال ، إخراج مساحات خلفية ، ثم إخراج مسافات للكتابة فوق الحروف التي تم لفها).
لكن هذا مجرد تكهنات