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() للقياسات

والتكهنات النقية هي أنك تستخدم طرفًا يحاول القيام word-wrapping بدلاً من التفاف الأحرف ، ويعامل B كحرف كلمة ، ولكن # كحرف غير الكلمة. لذلك عندما يصل إلى نهاية السطر ويبحث عن مكان لكسر الخط ، فإنه يرى فواصل على الفور تقريبا وبسعادة هناك ؛ في حين أنه مع B ، فإنه يجب أن يستمر في البحث لفترة أطول ، وقد يحتوي على المزيد من النص للالتفاف (والذي قد يكون مكلفًا في بعض المطاريف ، على سبيل المثال ، إخراج مساحات خلفية ، ثم إخراج مسافات للكتابة فوق الحروف التي تم لفها).

لكن هذا مجرد تكهنات


أجريت اختبارات على 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
.
.
.

وما إلى ذلك وهلم جرا..

ملخص:

  1. يعمل Eclipse بشكل مثالي مع "B"
  2. لدى Netbeans مشكلة التفاف خط يمكن حلها (لأن المشكلة لا تحدث في الكسوف) (بدون إضافة مسافة بعد B ("B")).






system.out