আমি কেবল এই উত্তরে কিছু সাধারণ পরামর্শ দিতে যাচ্ছি, এবং মানদণ্ড নয়। পারফরম্যান্স সম্পর্কে নির্ভরযোগ্য প্রশ্নের উত্তর দেওয়ার একমাত্র উপায় বেঞ্চমার্ক। আপনি যে পরিমাণ ডেটা ম্যানিপুলেট করছেন এবং আপনি কতবার এই অপারেশনটি সম্পাদন করছেন তা আপনি বলছেন না , তাই কোনও কার্যকর বেঞ্চমার্ক করার উপায় নেই। 10 টি আইটেমের জন্য কী বেশি দক্ষ এবং 1000000 আইটেমগুলির জন্য আরও কার্যকর কী তা প্রায়শই এক রকম হয় না।
থাম্বের একটি সাধারণ নিয়ম হিসাবে, খাঁটি শেল কনস্ট্রাক্টস সহ কিছু করার চেয়ে বাহ্যিক আদেশগুলি চাওয়া আরও ব্যয়বহুল, যতক্ষণ না খাঁটি শেল কোড কোনও লুপকে জড়িত না করে। অন্যদিকে, একটি শেল লুপ যা একটি বৃহত স্ট্রিং বা প্রচুর পরিমাণে স্ট্রিং দিয়ে পুনরাবৃত্তি হয় বিশেষ-উদ্দেশ্যে সরঞ্জামটির একটি অনুরোধের চেয়ে ধীর হতে পারে। উদাহরণস্বরূপ, আপনার লুপটি চাওয়াটি cut
অভ্যাসের ক্ষেত্রে লক্ষণীয়ভাবে ধীর হতে পারে, তবে আপনি যদি একটি একক অনুরোধ দিয়ে পুরো কাজটি করার উপায় খুঁজে cut
পান যা শেলের মধ্যে স্ট্রিং ম্যানিপুলেশন সহ একই জিনিসটি করার চেয়ে দ্রুত হতে পারে।
মনে রাখবেন যে কাটঅফ পয়েন্ট সিস্টেমের মধ্যে অনেকগুলি পৃথক হতে পারে। এটি কার্নেলের উপর নির্ভর করে, কার্নেলের শিডিয়ুলার কীভাবে কনফিগার করা যায়, বাহ্যিক এক্সিকিউটেবলগুলি সমন্বিত ফাইল সিস্টেমে, এই মুহুর্তে CPU বনাম মেমরির চাপের পরিমাণ এবং অন্যান্য অনেকগুলি বিষয়গুলির উপর নির্ভর করতে পারে।
আপনি expr
যদি পারফরম্যান্স সম্পর্কে উদ্বিগ্ন হন তবে গাণিতিক সম্পাদনের জন্য কল করবেন না । আসলে, expr
গাণিতিক সম্পাদন করার জন্য মোটেই কল করবেন না । শেলগুলিতে বিল্ট-ইন গাণিতিক থাকে, যা প্রার্থনার চেয়ে পরিষ্কার এবং দ্রুত expr
।
আপনি ব্যাশ ব্যবহার করছেন বলে মনে হচ্ছে, যেহেতু আপনি ব্যাশ নির্মাণগুলি ব্যবহার করছেন যা sh এ নেই in তাহলে কেন পৃথিবীতে আপনি একটি অ্যারে ব্যবহার করবেন না? একটি অ্যারে হ'ল সর্বাধিক প্রাকৃতিক সমাধান এবং এটি খুব দ্রুততম হওয়ার সম্ভাবনাও রয়েছে। নোট করুন যে অ্যারে সূচকগুলি 0 থেকে শুরু হয়।
list=(1 2 3 5 9 8 6 90 84 9 3 2 15 75 55)
for ((count = 0; count += 3; count < ${#list[@]})); do
echo "${list[$count]}"
done
আপনি স্ক ব্যবহার করলে আপনার স্ক্রিপ্টটি আরও দ্রুত হতে পারে, যদি আপনার সিস্টেমে বাশের sh
পরিবর্তে ড্যাশ বা ksh থাকে। আপনি যদি sh ব্যবহার করেন, আপনি নামযুক্ত অ্যারে পাবেন না, তবে আপনি এখনও অবস্থানীয় পরামিতিগুলির একটি অ্যারে পাবেন যা আপনি সেট করতে পারেন set
। রানটাইম পর্যন্ত জানা যায় না এমন অবস্থানে এমন কোনও উপাদান অ্যাক্সেস করার জন্য আপনাকে ব্যবহার করতে হবে eval
(জিনিসগুলি যথাযথভাবে উদ্ধৃত করার ক্ষেত্রে যত্ন নিন!)।
# List elements must not contain whitespace or ?*\[
list='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
set $list
count=1
while [ $count -le $# ]; do
eval "value=\${$count}"
echo "$value"
count=$((count+1))
done
আপনি যদি কেবল একবারে অ্যারে অ্যাক্সেস করতে চান এবং বাম থেকে ডানে বাম দিকে চলে যাচ্ছেন (কিছু মান বাদ দিচ্ছেন), আপনি shift
ভেরিয়েবল সূচকগুলির পরিবর্তে ব্যবহার করতে পারেন ।
# List elements must not contain whitespace or ?*\[
list='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
set $list
while [ $# -ge 1 ]; do
echo "$1"
shift && shift && shift
done
কোন পদ্ধতির দ্রুত শেল এবং উপাদানগুলির সংখ্যার উপর নির্ভর করে।
আরেকটি সম্ভাবনা স্ট্রিং প্রসেসিং ব্যবহার করা। অবস্থানগত পরামিতি ব্যবহার না করার সুবিধা রয়েছে, তাই আপনি এগুলি অন্য কোনও কিছুর জন্য ব্যবহার করতে পারেন। এটি প্রচুর পরিমাণে ডেটার জন্য ধীর হয়ে উঠবে, তবে অল্প পরিমাণে ডেটার জন্য এটি একটি উল্লেখযোগ্য পার্থক্য করার সম্ভাবনা কম unlikely
# List elements must be separated by a single space (not arbitrary whitespace)
list='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
while [ -n "$list" ]; do
echo "${list% *}"
case "$list" in *\ *\ *\ *) :;; *) break;; esac
list="${list#* * * }"
done