java - কেন মুদ্রণ "বি" মুদ্রণ নাটকীয়ভাবে মুদ্রণ চেয়ে "#"?




performance loops for-loop system.out (3)

আমি 1000 x 1000 এর দুটি ম্যাট্রিক্স তৈরি করেছি:

প্রথম ম্যাট্রিক্স: O#
দ্বিতীয় ম্যাট্রিক্স: ও B

নিম্নলিখিত কোডটি ব্যবহার করে, প্রথম ম্যাট্রিক্সটি সম্পন্ন করতে 8.5২ সেকেন্ড সময় নেয়:

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("");
 }

এই কোড দিয়ে, দ্বিতীয় ম্যাট্রিক্সটি সম্পন্ন করতে ২5.11২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("B"); //only line changed
        }
    }

    System.out.println("");
}

নাটকীয়ভাবে বিভিন্ন রান বার পিছনে কারণ কি?

মন্তব্য হিসাবে প্রস্তাবিত, শুধুমাত্র System.out.print("#"); মুদ্রণ System.out.print("#"); 7.8871 সেকেন্ড সময় নেয়, যখন System.out.print("B"); still printing... দেয় still printing...

অন্যরা যারা ইঙ্গিত করে যে এটি তাদের জন্য সাধারণত কাজ করে, আমি উদাহরণস্বরূপ Ideone.com চেষ্টা করেছি , এবং কোডের উভয় টুকরা একই গতিতে চালানো হয়।

পরীক্ষা শর্ত:

  • আমি Netbans 7.2 থেকে এই পরীক্ষা চালানো, তার কনসোল আউটপুট সঙ্গে
  • আমি পরিমাপ জন্য System.nanoTime() ব্যবহার

Answers

আমি জ্যাকেট সংস্করণ 1.8 সঙ্গে উভয় Netbeans 8.0.2 বনাম Eclipse উপর পরীক্ষা সঞ্চালিত; আমি পরিমাপ জন্য System.nanoTime() ব্যবহার।

Eclipse:

আমি উভয় ক্ষেত্রে একই সময় পেয়েছিলাম - প্রায় 1.564 সেকেন্ড

NetBeans:

  • "#" ব্যবহার: 1.536 সেকেন্ড
  • "বি" ব্যবহার করে: 44.164 সেকেন্ড

সুতরাং, এটি দেখে মনে হচ্ছে নেটবিন্সগুলিতে মুদ্রণের কনসোলের খারাপ কার্যক্ষমতা রয়েছে।

আরও গবেষণার পরে আমি বুঝলাম যে সমস্যা Netbeans এর সর্বাধিক বাফারের line-wrapping (এটি 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 পুরোপুরি কাজ করে "বি"
  2. Netbeans একটি লাইন-মোড়ানো সমস্যা আছে যা সমাধান করা যেতে পারে (কারণ সমস্যাটি গ্রহনযোগ্য হয় না) (বি ("B") পরে স্থান যুক্ত না করে)।

বিশুদ্ধ ধারণা হল যে আপনি এমন একটি টার্মিনাল ব্যবহার করছেন যা চরিত্র-মোড়কে বদলে word-wrapping করার প্রচেষ্টা করে এবং একটি শব্দ চরিত্র হিসাবে কিন্তু # একটি অ-শব্দ চরিত্র হিসাবে আচরণ করে। তাই যখন এটি একটি লাইনের শেষে পৌঁছায় এবং লাইন ভাঙ্গার জন্য একটি জায়গা অনুসন্ধান করে, তখন এটি প্রায় # অবিলম্বে এবং আনন্দের সাথে সেখানে ভাঙ্গে; যখন B দিয়ে এটি দীর্ঘতর অনুসন্ধান রাখতে থাকে এবং তার কাছে মোড়ানো আরও পাঠ্য থাকতে পারে (যা কিছু টার্মিনালগুলিতে ব্যয়বহুল হতে পারে, উদাহরণস্বরূপ, ব্যাকস্পেসগুলিকে আউটপুট করা, তারপরে স্পেসগুলি আউটপুট করা যাতে আবৃত হওয়া অক্ষরগুলি ওভাররাইট করতে পারে)।

কিন্তু যে বিশুদ্ধ ফটকা।


অন্যদের দ্বারা ব্যাখ্যা করা হয়েছে, সেখানে একটি সময় বিচ্ছিন্নতা আছে। 1927-12-31 23:54:08 Asia/Shanghai দুটি সম্ভাব্য টাইমজোন অফসেট রয়েছে, তবে 1927-12-31 23:54:07 জন্য 1927-12-31 23:54:07 । সুতরাং, কোন অফসেট ব্যবহার করা হয় তার উপর নির্ভর করে, একটি দ্বিতীয় পার্থক্য রয়েছে অথবা 5 মিনিট এবং 53 সেকেন্ডের পার্থক্য রয়েছে।

অফসেটগুলির এই সামান্য স্থান পরিবর্তনের পরিবর্তে স্বাভাবিক এক-ঘন্টা ডেলাইট সঞ্চয় (গ্রীষ্মকালীন সময়) ব্যবহার করা হয়, এটি সমস্যাটিকে কিছুটা অস্পষ্ট করে।

উল্লেখ্য, টাইমজোন ডাটাবেসের ২013 এর আপডেটটি কয়েক সেকেন্ড আগে এই অসঙ্গতিটিকে সরানো হয়েছে, তবে প্রভাবটি এখনও পর্যবেক্ষণযোগ্য হবে।

জাভা 8 এ নতুন java.time প্যাকেজটিকে আরও পরিষ্কারভাবে দেখতে দিন এবং এটি পরিচালনা করার জন্য সরঞ্জাম সরবরাহ করুন। প্রদত্ত:

DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
dtfb.append(DateTimeFormatter.ISO_LOCAL_DATE);
dtfb.appendLiteral(' ');
dtfb.append(DateTimeFormatter.ISO_LOCAL_TIME);
DateTimeFormatter dtf = dtfb.toFormatter();
ZoneId shanghai = ZoneId.of("Asia/Shanghai");

String str3 = "1927-12-31 23:54:07";  
String str4 = "1927-12-31 23:54:08";  

ZonedDateTime zdt3 = LocalDateTime.parse(str3, dtf).atZone(shanghai);
ZonedDateTime zdt4 = LocalDateTime.parse(str4, dtf).atZone(shanghai);

Duration durationAtEarlierOffset = Duration.between(zdt3.withEarlierOffsetAtOverlap(), zdt4.withEarlierOffsetAtOverlap());

Duration durationAtLaterOffset = Duration.between(zdt3.withLaterOffsetAtOverlap(), zdt4.withLaterOffsetAtOverlap());

তারপরে durationAtEarlierOffset পূর্ববর্তী durationAtEarlierOffset এক সেকেন্ড হবে, durationAtLaterOffset পাঁচ মিনিট এবং 53 সেকেন্ড হবে।

এছাড়াও, এই দুই অফসেট একই:

// Both have offsets +08:05:52
ZoneOffset zo3Earlier = zdt3.withEarlierOffsetAtOverlap().getOffset();
ZoneOffset zo3Later = zdt3.withLaterOffsetAtOverlap().getOffset();

কিন্তু এই দুটি ভিন্ন:

// +08:05:52
ZoneOffset zo4Earlier = zdt4.withEarlierOffsetAtOverlap().getOffset();

// +08:00
ZoneOffset zo4Later = zdt4.withLaterOffsetAtOverlap().getOffset();

1928-01-01 00:00:00 সাথে আপনি 1928-01-01 00:00:00 1927-12-31 23:59:59 তুলনায় একই সমস্যাটি দেখতে পারেন তবে, এই ক্ষেত্রে, এটি পূর্বের অফসেট যা দীর্ঘ বিচ্ছিন্নতা সৃষ্টি করে এবং এটি দুই সম্ভাব্য অফসেট আছে যে আগের তারিখ।

এই পদ্ধতিতে যাওয়ার আরেকটি উপায় একটি ট্রানজিট চালু আছে কিনা তা যাচাই করা। আমরা এই মত এই কাজ করতে পারেন:

// Null
ZoneOffsetTransition zot3 = shanghai.getRules().getTransition(ld3.toLocalDateTime);

// An overlap transition
ZoneOffsetTransition zot4 = shanghai.getRules().getTransition(ld3.toLocalDateTime);

ট্রানজিউশনটি একটি ওভারল্যাপ কিনা তা যাচাই করতে পারেন - কোন ক্ষেত্রে সেই তারিখ / সময় - অথবা কোনও ফাঁকের জন্য একাধিক বৈধ অফসেট আছে - কোনও ক্ষেত্রে যে তারিখ / সময়টি সেই জোনের আইডি জন্য বৈধ নয় - isOverlap() ব্যবহার করে এবং isGap() উপর isGap() পদ্ধতি।

আমি আশা করি এটি জাভা 8 ব্যাপকভাবে উপলব্ধ হয়ে গেলে জাভা 7 ব্যবহার করে যারা JSR 310 ব্যাকপোর্টটি গ্রহণ করবে একবার এই সমস্যার সমাধান করতে সহায়তা করবে।





java performance loops for-loop system.out