স্ক্রিপ্ট চালানোর দ্রুততম উপায় কী?


22

আমি ভাবছিলাম যে স্ক্রিপ্টটি চালানোর দ্রুততম উপায়টি কী, আমি পড়ছি যে টার্মিনালে স্ক্রিপ্টটির আউটপুট দেখানো, এটি কোনও ফাইলে বা সম্ভবত পুনর্নির্দেশের মধ্যে গতির মধ্যে পার্থক্য রয়েছে /dev/null

সুতরাং যদি আউটপুটটি গুরুত্বপূর্ণ না হয় তবে স্ক্রিপ্টটি দ্রুত কাজ করার সবচেয়ে দ্রুততম উপায় কী, যদি তা ন্যূনতম হলেও হয়।

bash ./myscript.sh 
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null


"নিয়মিত ফাইলটিতে পুনঃনির্দেশ" এবং "/ dev /
নালকে

উত্তর:


31

টার্মিনালগুলি আজকাল তাদের আগের তুলনায় ধীরতর হয়, মূলত কারণ গ্রাফিক্স কার্ডগুলি 2D ত্বরণ সম্পর্কে আর চিন্তা করে না। সুতরাং প্রকৃতপক্ষে, টার্মিনালে মুদ্রণ একটি স্ক্রিপ্টকে ধীর করতে পারে, বিশেষত যখন স্ক্রোলিং জড়িত থাকে।

ফলস্বরূপ ./script.shধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ./script.sh >script.logধীরে /script.sh >/dev/nullকাজ কম হয়। তবে এটি কোনও ব্যবহারিক উদ্দেশ্যে যথেষ্ট পার্থক্য করে কিনা আপনার স্ক্রিপ্টটি কত আউটপুট উত্পন্ন করে এবং কত দ্রুত তা নির্ভর করে। যদি আপনার স্ক্রিপ্টটি 3 টি লাইন লিখে প্রস্থান করে, বা এটি প্রতি কয়েক ঘন্টা 3 পৃষ্ঠা প্রিন্ট করে তবে আপনাকে পুনঃনির্দেশগুলি নিয়ে বিরক্ত করার দরকার নেই।

সম্পাদনা করুন: কিছু দ্রুত (এবং সম্পূর্ণরূপে ভাঙ্গা) মানদণ্ড:

  • একটি লিনাক্স কনসোলে, 240x75:

    $ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done)
    real    3m52.053s
    user    0m0.617s
    sys     3m51.442s
  • ইন xterm, 260x78:

    $ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done)
    real    0m1.367s
    user    0m0.507s
    sys     0m0.104s
  • স্যামসং এসএসডি 850 প্রো 512 জিবি ডিস্কে কোনও ফাইলে পুনঃনির্দেশ করুন:

     $ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >file)
     real    0m0.532s
     user    0m0.464s
     sys     0m0.068s
  • এতে পুনঃনির্দেশ করুন /dev/null:

     $ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >/dev/null)
     real    0m0.448s
     user    0m0.432s
     sys     0m0.016s

6
@ কিঙ্গোফেকেচ এটি 200 লাইন / সেকেন্ডের কম। এটি খুব একটা পার্থক্য করতে পারে না। (তুলনার জন্য, timeout 1 yes "This is a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line"আমার এমবিপিতে এক সেকেন্ডে 100000+ লাইনগুলি মুদ্রণ করে))
মুরু

4
@ কিঙ্গোফেকচ যদি এটি স্ক্রিপ্ট হয় তবে একটি ফাইল সম্পাদনা করুন এবং লাইনটি মন্তব্য করুন যা অপ্রয়োজনীয় আউটপুট প্রিন্ট করে। আপনি অনেক কিছু অর্জন করবেন, বিশেষত যদি এটি বাহ্যিক কমান্ড হয় (
শেল্ট

2
"ব্যবহৃত হত" এর সংকীর্ণ ব্যাখ্যার জন্য। একটি vt220 টার্মিনাল আজকের টার্মিনাল এমুলেটরগুলির তুলনায় বেশ ধীর। এছাড়াও, সান স্পার্ক ওয়ার্কস্টেশনগুলি (আমি যেগুলি ব্যবহার করেছি) সত্যিই ধীর কনসোল ছিল, সুতরাং কোনও বৃহত প্রকল্পের সংকলন করার সময় আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করার ফলে কমপাইলের সময়টি তাত্পর্যপূর্ণ হয়।
কুসালানন্দ

1
@ কুসালানন্দ এটি সত্য, xterm30 বছর আগে এইচপি অ্যাপোলোতে xterms20 বছর আগে এইচপি-ইউএক্সের তুলনায় ক্রল করতেন । যাইহোক, 15 বছর আগে ম্যাট্রক্স ভিডিও কার্ড সহ একটি লিনাক্স কনসোলটি 20 বছর আগের এস -3 কার্ডের সাথে একই লিনাক্স কনসোলের চেয়ে ধীর ছিল। এবং একটি আধুনিক কার্ডে উচ্চ-রেজোলিউশন ফ্রেম বাফার সহ একটি লিনাক্স কনসোলটি কেবল ব্যবহারযোগ্য। :)
সাটস ক্যাটসুরা

6
@ কিঙ্গোফেকেচ এটি প্রায় 2400 বিপিএস। আমাদের মধ্যে কয়েকজন সেই গতি নিয়ে বাস্তবে বছরের পর বছর বেঁচে ছিল। :)
সাটস ক্যাটসুরা

14

আমি সহজাত ক্যাটসুরার জবাবের সাথে একমত হইতাম; এটা বোঝা যায়। তবে এটি পরীক্ষা করা যথেষ্ট সহজ।

আমি স্ক্রিনে এক মিলিয়ন লাইন লেখার, কোনও ফাইলে লিখতে (সংযোজন করা) এবং এর দিকে পুনর্নির্দেশ পরীক্ষা করেছি /dev/null। আমি এগুলির প্রত্যেকটি ঘুরে ফিরে পরীক্ষা করেছিলাম, তারপরে পাঁচটি প্রতিলিপি করেছি। এগুলি আমি ব্যবহার করা আদেশগুলি।

$ time (for i in {1..1000000}; do echo foo; done)
$ time (for i in {1..1000000}; do echo foo; done > /tmp/file.log) 
$ time (for i in {1..1000000}; do echo foo; done > /dev/null)

আমি তারপরে নীচে মোট বার প্লট করেছি।

সময় বনাম আউটপুট প্লট

আপনি দেখতে পাচ্ছেন, স্যাট ক্যাটসুরার অনুমানগুলি সঠিক ছিল। স্যাট ক্যাটসুরার উত্তর অনুসারে, আমি সন্দেহও করি যে সীমাবদ্ধ ফ্যাক্টরটি আউটপুট হবে, সুতরাং আউটপুট নির্বাচনের স্ক্রিপ্টের সামগ্রিক গতিতে যথেষ্ট প্রভাব ফেলবে এমনটা সম্ভাবনা কম।

এফডাব্লুআইডাব্লু, আমার আসল উত্তরে আলাদা কোড ছিল, এতে লুপের ভিতরে ফাইল সংযোজন এবং /dev/nullপুনর্নির্দেশ করা হয়েছিল।

$ rm /tmp/file.log; touch /tmp/file.log; time (for i in {1..1000000}; do echo foo >> /tmp/file.log; done) 
$ time (for i in {1..1000000}; do echo foo > /dev/null; done)

জন কুগেলম্যান মন্তব্যগুলিতে যেমন উল্লেখ করেছেন, এটি প্রচুর ওভারহেড যুক্ত করে। যেহেতু প্রশ্নটি দাঁড়িয়েছে, এটি পরীক্ষা করার পক্ষে এটি সঠিক উপায় নয় তবে আমি এটি এখানে রেখে দেব কারণ এটি স্পষ্টতই স্ক্রিপ্টের মধ্যে থেকে বারবার কোনও ফাইল পুনরায় খোলার ব্যয় দেখায় ।

সময় বনাম আউটপুট প্লট

এই ক্ষেত্রে, ফলাফলগুলি বিপরীত হয়।


এফডাব্লুআইডাব্লু আমি আমার উত্তরে একটি দ্রুত মানদণ্ড যুক্ত করেছি। উল্লেখযোগ্যভাবে, লিনাক্স কনসোলটি> 200 এর চেয়ে 200 গুণ কম ধীরে ধীরে xterm, যা পরিবর্তে ~ 3 গুণ বেশি ধীর হয় /dev/null
স্যাটাস কাতসুরা

আপনার কিছু রেট সীমাবদ্ধ করেও পরীক্ষা করা উচিত। ওপি'র আউটপুট প্রায় 200 লাইন / সে।
মুড়ু

@ মুরু আপনার মানে কি একটি লাইন মুদ্রণ করা, 1/200 সেকেন্ড অপেক্ষা করুন, তারপরে পুনরাবৃত্তি করুন? আমি চেষ্টা করতে পারি, তবে আমি অনুভব করি এটি একইরকম ফলাফল হবে তবে শব্দটি কাটিয়ে উঠতে সংকেতটির জন্য আরও অনেক বেশি সময় লাগবে। যদিও আমি বিশ্লেষণের আগে অপেক্ষা করার সময়টি বিয়োগ করতে পারি।
স্পারহাক

পছন্দ করুন আমি মনে করি যে আউটপুটের সেই স্তরে, সিপিইউতে আউটপুট হার হ্রাস না করে ডিসপ্লে আপডেট করার জন্য প্রচুর সময় পাবে। যখন প্রোগ্রামটি বিরতি ছাড়াই লাইনগুলি বানান ব্যতীত অন্য কিছুই করছে না, টার্মিনাল বাফারগুলি ডিসপ্লে আপডেট হওয়ার চেয়ে দ্রুত পূর্ণ হয়ে যায় এবং একটি বাধা তৈরি করে।
মুরু

3

স্ক্রিপ্টকে গতি বাড়ানোর আরেকটি উপায় হ'ল দ্রুত শেল ইন্টারপ্রেটার ব্যবহার করা। একটি POSIX ব্যস্ত লুপের গতি তুলনা করুন , bash v4.4 , ksh v93u + 20120801 এবং dash v0.5.8 এর অধীনে চালিত

  1. bash:

    time echo 'n=0;while [ $n -lt 1000000 ] ; do \
                      echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); 
                   done' | bash -s > /dev/null

    আউটপুট:

    real    0m25.146s
    user    0m24.814s
    sys 0m0.272s
  2. ksh:

    time echo 'n=0;while [ $n -lt 1000000 ] ; do \
                      echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); 
                   done' | ksh -s > /dev/null

    আউটপুট:

    real    0m11.767s
    user    0m11.615s
    sys 0m0.010s
  3. dash:

    time echo 'n=0;while [ $n -lt 1000000 ] ; do \
                      echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); 
                   done' | dash -s > /dev/null

    আউটপুট:

    real    0m4.886s
    user    0m4.690s
    sys 0m0.184s

একটি উপসেট কমান্ড এর bashএবং kshহয় backwardly সামঞ্জস্যপূর্ণ কমান্ড সব dash। একজনbash স্ক্রিপ্ট যা কেবলমাত্র সেই উপসেটে কমান্ড ব্যবহার করে তা দিয়ে কাজ করা উচিত dash

কিছু bashনতুন স্ক্রিপ্ট যা নতুন বৈশিষ্ট্য ব্যবহার করে তা অন্য দোভাষীতে রূপান্তর করতে পারে। যদি bashস্ক্রিপ্টটি আরও বেশি নতুন বৈশিষ্ট্যগুলির উপর নির্ভর করে, তবে এটি বিরক্ত করার উপযুক্ত হবে না - কিছু নতুন bashবৈশিষ্ট্য এমন উন্নতি যা কোড করা সহজ এবং আরও দক্ষ, ( bashসাধারণত ধীর হওয়া সত্ত্বেও ), যাতেdash সমতুল্য, (যা চলমান জড়িত থাকতে পারে) আরও কয়েকটি কমান্ড), ধীর হবে।

সন্দেহ হলে, একটি পরীক্ষা চালান ...


সুতরাং আমার বাশ স্ক্রিপ্টটি দ্রুত করার জন্য, আমি এগুলিকে আবার বাশ বা আবার লিখতে হবে?
Kingofkech

@ কিঙ্গোফেকেক হতে পারে আপনি বাশের জন্য যে কোডটি লিখেছেন তা সহজেই ksh বা ড্যাশ কোড সঠিক is শুধু দোভাষী বদলানোর চেষ্টা করুন।
bli
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.