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


2745

আমি 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("#");সময় নেয় 7.8871, যেখানে System.out.print("B");দেয় still printing...

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

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

  • নেটবিন 7.২ থেকে এই কনসোলে আউটপুট নিয়ে আমি এই পরীক্ষাটি চালিয়েছি
  • আমি System.nanoTime()পরিমাপ জন্য ব্যবহৃত

62
এলোমেলো জেনারেটরের কার্যকারিতা নির্মূল করতে র্যান্ড.নেস্টইন্ট (4) == 0 থেকে i <250 পরিবর্তন করার চেষ্টা করুন। আপনি
এন্টারোপির

3
উভয়ই আমার মেশিনে amount 4 সেকেন্ডে একই পরিমাণে চালিত হবে বলে মনে হয়।
সোটিরিওস ডেলিমনলিস

155
আপনি যদি পরামর্শ দিচ্ছেন যে মুদ্রণ বিতে প্রিন্টিংয়ের চেয়ে বেশি সময় লাগে # .... কেন আপনি র্যান্ডম ভেরিয়েবল আর এর উপর নির্ভর করে সমস্ত বি ও সমস্ত # মুদ্রণের চেষ্টা করবেন না
কাকারোট

18
গৃহীত উত্তরের ভিত্তিতে, আপনি দৃশ্যত এটিকে কোনও ফাইল বা / dev / নাল থেকে পুনঃনির্দেশিত দিয়ে চালানোর চেষ্টা করেন নি।
বার্মার

24
@ ফিজিজ, র্যান্ডম () কোনও ক্রিপ্টোগ্রাফিকাল আরএনজি নয় এবং তাই এনট্রপি পুল ব্যবহার করে না।
ভাগ করুন

উত্তর:


4070

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

তবে তা খাঁটি জল্পনা।


558
এটি আসলে সঠিক উত্তর! সমাধানের পরে কোনও স্থান যুক্ত Bকরা।
কুবা স্পাতনি

261
কিছু উত্তর রয়েছে যা হার্ড শিখার অভিজ্ঞতা থেকে আসে। টিজে এবং আমি (যেহেতু আমরা বন্ধু) অ্যাপলের দিনগুলিতে বড় হয়েছি] [এবং জেডএক্স ৮০ / ৮১। শব্দ মোড়কের পিছনে তখন কোনও বিল্ট ছিল না। সুতরাং আমরা দুজনেই নিজের লেখা শেষ করেছি - একাধিকবার। এবং সেই পাঠগুলি আপনার সাথে লেগে আছে, তারা আপনার টিকটিকি মস্তিষ্কে জ্বলে উঠবে। তবে যদি আপনি তার পরে কোডের দিকে ঝুঁকেন, যখন আপনার পরিবেশের শব্দটি সমস্ত কিছু গুটিয়ে রাখে বা রানটাইমের আগে আপনি নিজেই এটি করেন, শব্দ মোড়ানো নিয়ে সমস্যাগুলি চালানো আরও শক্ত।
জকএম

315
উজ্জ্বল ছাড় তবে আমাদের এই পাঠটি থেকে সাধারণীকরণ করা উচিত এবং সর্বদা কর্মক্ষমতা পরিমাপ করা হয় হয় ফলস্বরূপ নির্ধারিত হয় / dev / নাল (উইন্ডোজে নুল) বা কমপক্ষে কোনও ফাইলের উদ্দেশ্যে। যেকোন ধরণের কনসোলে প্রদর্শিত হওয়া খুব ব্যয়বহুল আইও, এবং সর্বদা সময়কে বিকৃত করে - এমনকি নাটকীয়ভাবে এটি বিভ্রান্তিকরভাবে না হলেও।
বব কার্নস

37
@ মিঃলিস্টার: ওয়ার্ড র‌্যাপিং System.out.printlnকরে না; শব্দটি মোড়ানো (এবং অবরুদ্ধকরণ, তাই System.out.printlnঅপেক্ষা করতে হয়েছিল) করাকে যা আউটপুট করছিল তা হ'ল ।
টিজে ক্রাউডার

35
@ ক্রিস - আসলে, আমি যুক্তি করব যে এ্যালগোরিদমের সঠিক সময় পাওয়ার সমস্যার জন্য এগুলি মুদ্রণ না করা সমাধান IS প্রতিবার আপনি যখন কোনও কনসোলে (যেকোন ধরণের) মুদ্রণ করবেন, আপনি সমস্ত ধরণের বাহ্যিক প্রক্রিয়াজাতকরণের জন্য অনুরোধ করছেন যা আপনি যা করছেন তার পারফরম্যান্স পরীক্ষা করছেন। এটি আপনার পরিমাপ পদ্ধতিতে একটি বাগ, খাঁটি এবং সহজ। অন্যদিকে, আপনি যদি সমস্যাটিকে পরিমাপ হিসাবে না দেখেন, তবে তারতম্যটি বোঝেন তবে হ্যাঁ, মুদ্রণ না করা একটি ডিবাগিং ট্রিক। এটি নেমে আসে, আপনি কোন সমস্যার সমাধানের চেষ্টা করছেন?
বব কার্নস

209

আমি জাভা সংস্করণ 1.8 সহ, Eclipse বনাম নেটবিয়ান 8.0.2 এ পরীক্ষা করেছি; আমি System.nanoTime()পরিমাপ জন্য ব্যবহৃত ।

Eclipse:

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

NetBeans:

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

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

আরও গবেষণার পরে আমি বুঝতে পারি যে সমস্যাটি নেটবিনের সর্বোচ্চ বাফারের লাইন মোড়ানো (এটি কেবল 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("");
}

সময় ফলাফল 225 মিলিসেকেন্ডের কাছাকাছি হলে, প্রতিটি পঞ্চম পুনরাবৃত্তিকে বাদে প্রতিটি পুনরাবৃত্তির পরে 1 মিলিসেকেন্ড কম হয় । এর মতো কিছু (ন্যানোসেকেন্ডে):

BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
.
.
.

এবং তাই ..

সারসংক্ষেপ:

  1. গ্রহণ "বি" দিয়ে পুরোপুরি কাজ করে
  2. নেটবিনের একটি লাইন-মোড়কের সমস্যা রয়েছে যা সমাধান করা যেতে পারে (কারণ সমস্যাটি গ্রহনে দেখা দেয় না) (বি ("বি") এর পরে স্থান যুক্ত না করে)।

32
আপনি কীভাবে আপনার গবেষণা কৌশলগুলি বিশদভাবে বর্ণনা করতে পারেন এবং তারপরে অবশেষে আপনাকে কী সন্ধান করেছিল যে লাইন মোড়ানো অপরাধী ছিল? (আমি আপনার গোয়েন্দা দক্ষতা সম্পর্কে কৌতূহল, এটি!)
সিল্ফ

12

হ্যাঁ অপরাধী অবশ্যই শব্দ-মোড়ানো। আমি যখন আপনার দুটি প্রোগ্রাম পরীক্ষা করেছি, নেটবিয়ান আইডিই 8.2 আমাকে নিম্নলিখিত ফলাফল দিয়েছে।

  1. প্রথম ম্যাট্রিক্স: ও এবং # = 6.03 সেকেন্ড
  2. দ্বিতীয় ম্যাট্রিক্স: ও এবং বি = 50.97 সেকেন্ড

আপনার কোডটি ঘনিষ্ঠভাবে দেখে আপনি প্রথম লুপের শেষে লাইন ব্রেক ব্যবহার করেছেন। তবে আপনি দ্বিতীয় লুপটিতে কোনও লাইন ব্রেক ব্যবহার করেন নি। সুতরাং আপনি দ্বিতীয় লুপে 1000 অক্ষর সহ একটি শব্দ মুদ্রণ করতে যাচ্ছেন। এটি একটি শব্দ-মোড়ক সমস্যা সৃষ্টি করে। যদি আমরা বি এর পরে একটি শব্দবিহীন অক্ষর ব্যবহার করি তবে প্রোগ্রামটি সংকলন করতে এটি কেবল 5.35 সেকেন্ড সময় নেয় । এবং যদি আমরা 100 মান বা 50 মান পাস করার পরে দ্বিতীয় লুপটিতে একটি লাইন ব্রেক ব্যবহার করি তবে এটি যথাক্রমে 8.56 সেকেন্ড এবং 7.05 সেকেন্ড সময় নেয় ।

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");
        }
        if(j%100==0){               //Adding a line break in second loop      
            System.out.println();
        }                    
    }
    System.out.println("");                
}

আর একটি পরামর্শ হ'ল নেটবিয়ান আইডিই'র সেটিংস পরিবর্তন করা। প্রথমত, নেটবিয়ান সরঞ্জামগুলিতে যান এবং বিকল্পগুলি ক্লিক করুন । এর পরে সম্পাদক ক্লিক করুন এবং বিন্যাস ট্যাবে যান। তারপর নির্বাচন কোথাও মধ্যে লাইন মোড়ানো বিকল্প। প্রোগ্রামটি সংকলন করতে প্রায় 6.24% কম সময় লাগবে।

নেটবিন্স সম্পাদক সেটিংস

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.