বাশ লিপি; প্রক্রিয়াকরণের গতি অপ্টিমাইজেশন


10

আমি ভাবছিলাম বাশ স্ক্রিপ্টগুলির অনুকূলকরণের জন্য সাধারণ নির্দেশিকা আছে কিনা।

  • উদাহরণস্বরূপ, কমান্ডের রেখার চেয়ে লুপগুলি লেখা আরও সুবিধাজনক তবে এটি কি সিস্টেমের জন্য প্রক্রিয়া করাও দ্রুত ? উদাহরণ:

    for i in a b c; do echo $i; done
    
    echo a
    echo b
    echo c
  • কখনও কখনও লোকেরা একই সমস্যার জন্য বিভিন্ন সমাধান উপস্থাপন করে। উদাহরণস্বরূপ, sed, cut, awk, এবং echoসব একটি স্ট্রিং থেকে সংখ্যা স্ট্রিপ করতে পারবেন। আমি ভাবছিলাম যে আপনি যদি বলতে পারেন যে অল্প সংখ্যার কোড রয়েছে, আপনি যদি ব্যবহার করেন তবে এটি তত দ্রুত হয়:

    1. একই কমান্ড, যেমন

      STRING=abc.def
      echo ${STRING} | sed 's/.def//g'
      echo ${STRING} | sed '$s/....$//'
    2. বিভিন্ন কমান্ড, যেমন

      STRING=abc.def
      echo ${STRING} | cut -d . -f 1
      echo ${STRING} | sed 's/.def//g'

2
বেশিরভাগ ক্ষেত্রে আমি গতির চেয়ে পঠনযোগ্যতা পছন্দ করি।
বার্নহার্ড

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

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

উত্তর:


8

শেলগুলি তাদের হাতে দেওয়া কোডটির কোনও পুনর্গঠন করে না, এটি অন্যটির পরে কেবল একটি লাইনকে ব্যাখ্যা করা হয় (কমান্ড ইন্টারপ্রেটারে অন্য কিছুই বেশি বোঝায় না)। শেল দ্বারা ব্যয় করা বেশিরভাগ সময় লেক্সিকাল বিশ্লেষণ / পার্সিং / ডাকা প্রোগ্রামগুলি চালু করতে যায়।

সাধারণ ক্রিয়াকলাপের জন্য (প্রশ্নের শেষে উদাহরণগুলিতে স্ট্রিংগুলি মুং করে দেওয়ার মতো) আমি যদি প্রোগ্রামগুলি লোড করার সময়টি কোনও বিয়োগ গতির পার্থক্য সোয়াম না করে তবে আমি অবাক হয়ে যাব।

গল্পটির নৈতিকতাটি হ'ল যদি আপনার আরও গতির প্রয়োজন হয় তবে আপনি পার্ল বা পাইথনের মতো একটি (আধাসিক) সংকলিত ভাষা দিয়ে আরও ভাল করতে পারেন, যা শুরু করার জন্য দ্রুত চালানো যায়, যাতে আপনি সরাসরি উল্লিখিত অনেকগুলি ক্রিয়াকলাপ লিখতে পারেন এবং বাহ্যিক প্রোগ্রামগুলিতে কল করতে হবে না, এবং বহিরাগত প্রোগ্রামগুলি চাওয়ার বা কাজের অনেক কিছু করার জন্য অনুকূলিত সি (বা যাই হোক না কেন) মডিউলগুলিতে কল করার বিকল্প রয়েছে। এ কারণেই ফেডোরায় "সিস্টেম অ্যাডমিনিস্ট্রেশন সুগার" (জিইউআইগুলি, মূলত) পাইথনে লেখা আছে: খুব বেশি প্রচেষ্টা না করে এমন একটি চমৎকার জিইউআই যুক্ত করতে পারে, যেমন অ্যাপ্লিকেশনের জন্য দ্রুত পর্যাপ্ত, সিস্টেম কলগুলিতে সরাসরি অ্যাক্সেস থাকতে পারে। যদি এটি পর্যাপ্ত গতি না হয় তবে সি ++ বা সি ধরুন

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


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

22

অপ্টিমাইজেশান হল প্রথম নিয়ম: অপটিমাইজ করবেন না । প্রথম পরীক্ষা। যদি পরীক্ষাগুলি দেখায় যে আপনার প্রোগ্রামটি খুব ধীর গতিতে রয়েছে, তবে সম্ভাব্য অনুকূলিতকরণগুলি সন্ধান করুন।

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

কিছু সাধারণ নিয়ম যা কোনও নির্দিষ্ট পরিস্থিতিতে সত্য হতে পারে বা নাও পারে:

  • শেলের অভ্যন্তরীণ প্রক্রিয়াকরণের জন্য, এটিটি ksh দ্রুত হয়। আপনি যদি অনেকগুলি স্ট্রিং ম্যানিপুলেশন করেন তবে এটিটি কেএসএস ব্যবহার করুন। ড্যাশ দ্বিতীয় আসে; bash, pdksh এবং zsh lag পিছনে।
  • প্রতিবার খুব সংক্ষিপ্ত কাজ সম্পাদন করতে আপনার যদি ঘন ঘন শেলটি চাওয়ার প্রয়োজন হয়, ড্যাশ কম সময় শুরুর কারণে জয়ী হয়।
  • একটি বাহ্যিক প্রক্রিয়া শুরু করতে সময় ব্যয় হয়, সুতরাং লুপের পাইপলাইনের চেয়ে জটিল টুকরোযুক্ত একটি পাইপলাইন দ্রুততর হয়।
  • echo $fooএর চেয়ে ধীরে ধীরে echo "$foo", কারণ কোনও ডাবল উদ্ধৃতি নেই, এটি $fooশব্দের মধ্যে বিভক্ত হয় এবং প্রতিটি শব্দকে ফাইলের নাম ওয়াইল্ডকার্ড প্যাটার্ন হিসাবে ব্যাখ্যা করে। আরও গুরুত্বপূর্ণ, বিভাজন এবং গ্লোববিং আচরণ খুব কমই কাঙ্ক্ষিত। সুতরাং ভেরিয়েবল বিকল্প এবং কমান্ড বিকল্পের চারপাশে সর্বদা ডাবল উদ্ধৃতি রাখার কথা মনে রাখবেন: "$foo", "$(foo)"
  • উত্সর্গীকৃত সরঞ্জামগুলি সাধারণ-উদ্দেশ্যে সরঞ্জামগুলিতে জয়লাভ করে। উদাহরণস্বরূপ, সরঞ্জামগুলি যেমন পছন্দ করে cutবা তার headসাথে অনুকরণ করা যায় sedতবে sedএটি ধীর awkহবে এবং আরও ধীর হবে। শেল স্ট্রিং প্রসেসিং ধীর গতিতে থাকে তবে সংক্ষিপ্ত স্ট্রিংয়ের জন্য এটি বহিরাগত প্রোগ্রামকে কল করে বেশিরভাগ ক্ষেত্রে ats
  • পার্ল, পাইথন এবং রুবির মতো আরও উন্নত ভাষা প্রায়শই আপনাকে দ্রুত অ্যালগোরিদম লিখতে দেয় তবে এগুলির একটি প্রারম্ভিক সময় খুব বেশি থাকে তাই তারা প্রচুর পরিমাণে ডেটার জন্য পারফরম্যান্সের জন্য উপযুক্ত worth
  • কমপক্ষে লিনাক্সে পাইপগুলি অস্থায়ী ফাইলগুলির চেয়ে দ্রুততর হয়।
  • শেল স্ক্রিপ্টিংয়ের বেশিরভাগ ব্যবহারগুলি I / O- বাউন্ড প্রক্রিয়াগুলির আশেপাশে থাকে, সুতরাং সিপিইউ গ্রহণের বিষয়টি বিবেচনা করে না।

এটি বিরল যে কর্মক্ষমতা শেল স্ক্রিপ্টগুলিতে উদ্বেগ is উপরের তালিকাটি নিখুঁতভাবে সূচক; এটি বেশিরভাগ ক্ষেত্রে "ধীর" পদ্ধতিগুলি ব্যবহার করা পুরোপুরি ঠিক কারণ পার্থক্য প্রায়শই শতাংশের একটি ভগ্নাংশ।

সাধারণত শেল স্ক্রিপ্টের বিন্দু হ'ল কিছু দ্রুত করা fast স্ক্রিপ্টটি লেখার জন্য অতিরিক্ত সময় ব্যয় করে ন্যায়সঙ্গত করতে আপনাকে অপ্টিমাইজেশন থেকে অনেক কিছু অর্জন করতে হবে।


2
যদিও pythonএবং rubyশুরু করার জন্য স্পষ্টভাবে মন্থর হয়, আমার সিস্টেমে অন্তত perlহিসাবে দ্রুত শুরু হয় হিসাবে bashবা ksh। GNU বিশ্রী বিশেষত utf-8 লোকেলগুলিতে GNU সেডের তুলনায় উল্লেখযোগ্যভাবে ধীর গতিযুক্ত, তবে এটি সমস্ত ছাদ এবং সমস্ত সেডের ক্ষেত্রে সত্য নয়। ksh93> ড্যাশ> pdksh> zsh> বাশ সবসময় তার মতো পরিষ্কার কাট হয় না। কিছু শেল অন্য জিনিসগুলির চেয়ে কিছু কিছুতে ভাল, এবং বিজয়ী সর্বদা এক হয় না।
স্টাফেন চেজেলাস

2
পুনরায় "আপনাকে এর থেকে অনেক কিছু অর্জন করতে হবে ..." : যদি "আপনি" ব্যবহারকারী ব্যবহারকারীকে অন্তর্ভুক্ত করেন তবে এটি সত্য। জনপ্রিয় লিনাক্স প্যাকেজগুলিতে শেল স্ক্রিপ্টগুলির সাহায্যে ব্যবহারকারীরা তাত্ক্ষণিক প্রোগ্রামার সংরক্ষণের চেয়ে প্রায়শই সম্মিলিতভাবে বেশ কয়েকটি ক্রমের পরিমাণ নষ্ট করে থাকেন।
এগ্রি

2

শেল স্ক্রিপ্ট ইন্টারপ্রেটারের কিছু কার্যকারিতা বৈশিষ্ট্য বর্ণনা করার জন্য আমরা উপরে আমাদের গ্লোববিং উদাহরণটিতে এখানে প্রসারিত করব। এই উদাহরণটির জন্য bashএবং dashদোভাষীদের তুলনা করে যেখানে প্রতি 30,000 ফাইলের জন্য একটি প্রক্রিয়া তৈরি করা হয় তা দেখায় যে ড্যাশগুলি wcপ্রক্রিয়াগুলিকে প্রায় দ্বিগুণ তত দ্রুত কাঁটাতে পারেbash

bash-4.2$ time dash -c 'for i in *; do wc -l "$i"; done>/dev/null'
real    0m1.238s
user    0m0.309s
sys     0m0.815s


bash-4.2$ time bash -c 'for i in *; do wc -l "$i"; done>/dev/null'
real    0m1.422s
user    0m0.349s
sys     0m0.940s

wcপ্রক্রিয়াগুলি না চালিয়ে বেস লুপিং গতির তুলনা করা , দেখায় যে ড্যাশের লুপিং প্রায় 6 গুণ বেশি দ্রুত!

$ time bash -c 'for i in *; do echo "$i">/dev/null; done'
real    0m1.715s
user    0m1.459s
sys     0m0.252s



$ time dash -c 'for i in *; do echo "$i">/dev/null; done'
real    0m0.375s
user    0m0.169s
sys     0m0.203s

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

$ time find -type f -print0 | wc -l --files0-from=- | tail -n1
    30000 total
real    0m0.299s
user    0m0.072s
sys     0m0.221s

উপরেরটি এখন পর্যন্ত সবচেয়ে কার্যকর সমাধান এবং পয়েন্টটি ভালভাবে তুলে ধরেছে যে শেল স্ক্রিপ্টে যতটা সম্ভব কম করা উচিত এবং ইউনিক্স সিস্টেমে উপলব্ধ সমৃদ্ধ ইউটিলিটিগুলির মধ্যে বিদ্যমান বিদ্যমান যুক্তি সংযোগ করার জন্য এটি ব্যবহার করার লক্ষ্য রাখে।

পেদ্রাগ ব্র্যাডি কমন শেল স্ক্রিপ্ট ভুল থেকে চুরি করেছেন।


1
একটি জেনেরিক নিয়ম: ফাইল বর্ণনাকারী হ্যান্ডলিংয়ের জন্যও ব্যয় হয়, সুতরাং তাদের সংখ্যা হ্রাস করুন। পরিবর্তে for i in *; do wc -l "$i">/dev/null; doneআরও ভাল করতে for i in *; do wc -l "$i"; done>/dev/null
manatwork

@manatwork এটা করবে এর আরো নাল আউটপুট timecmd কমান্ড
রাহুল পাতিল

@ মানাত ওয়ার্ক ভাল ... এখন দয়া করে আমাকেও বিনা wc -lআমন্ত্রণে আউটপুট দিন, আপনার আউটপুট পোস্টে আমি আপডেট হয়েছি কিনা তা দেখুন
রাহুল পাতিল

ঠিক আছে, পূর্ববর্তী পরিমাপগুলি একটি ছোট ডিরেক্টরিতে তৈরি করা হয়েছিল। : এখন আমি 30000 ফাইলগুলির সাথে এক সৃষ্টি পরীক্ষার পুনরাবৃত্তি pastebin.com/pCV6QKp2
manatwork

এই মানদণ্ডগুলি প্রতিটি শেলের বিভিন্ন প্রারম্ভিক সময়ের জন্য অনুমতি দিতে ব্যর্থ হয়। প্রতিটি শেলের মধ্যে থেকে করা বেঞ্চমার্কগুলি আরও ভাল।
এগ্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.