मैं केवल इस उत्तर में कुछ सामान्य सलाह देने जा रहा हूं, और बेंचमार्क नहीं। बेंचमार्क प्रदर्शन के बारे में मज़बूती से सवालों के जवाब देने का एकमात्र तरीका है। लेकिन जब से आप यह नहीं कहते हैं कि आप कितना डेटा जोड़-तोड़ कर रहे हैं और आप कितनी बार इस ऑपरेशन को करते हैं, एक उपयोगी बेंचमार्क करने का कोई तरीका नहीं है। 10 वस्तुओं के लिए क्या अधिक कुशल है और 1000000 वस्तुओं के लिए अधिक कुशल क्या है यह अक्सर समान नहीं होता है।
अंगूठे के एक सामान्य नियम के रूप में, बाहरी शेल को लागू करना शुद्ध शेल निर्माणों के साथ कुछ करने की तुलना में अधिक महंगा है, जब तक कि शुद्ध शेल कोड में लूप शामिल नहीं होता है। दूसरी ओर, एक शेल लूप जो एक बड़ी स्ट्रिंग या स्ट्रिंग की एक बड़ी मात्रा पर पुनरावृत्ति करता है, विशेष प्रयोजन उपकरण के एक आह्वान की तुलना में धीमा होने की संभावना है। उदाहरण के लिए, आपका लूप इनवोकिंग cut
अभ्यास में अच्छी तरह से धीमा हो सकता है, लेकिन यदि आप एक एकल cut
आह्वान के साथ पूरे काम को करने का एक तरीका ढूंढते हैं, तो शेल में स्ट्रिंग हेरफेर के साथ एक ही चीज़ करने की तुलना में तेज़ होने की संभावना है।
ध्यान दें कि सिस्टम के बीच कटऑफ बिंदु बहुत भिन्न हो सकता है। यह कर्नेल पर निर्भर कर सकता है कि कर्नेल के शेड्यूलर को कैसे कॉन्फ़िगर किया गया है, बाह्य निष्पादनयोग्य युक्त फाइलसिस्टम पर, इस समय कितना CPU बनाम मेमोरी प्रेशर है, और कई अन्य कारक हैं।
expr
यदि आप प्रदर्शन के बारे में चिंतित हैं तो अंकगणित करने के लिए कॉल न करें । वास्तव में, expr
अंकगणितीय प्रदर्शन करने के लिए कॉल न करें । शेल में अंतर्निहित अंकगणित होते हैं, जो स्पष्ट और आह्वान से तेज होते हैं expr
।
आपको लगता है कि आप bash कंस्ट्रक्शन का उपयोग कर रहे हैं, जो कि bash का उपयोग नहीं कर रहा है। तो पृथ्वी पर आप एक सरणी का उपयोग क्यों नहीं करेंगे? एक सरणी सबसे प्राकृतिक समाधान है, और यह सबसे तेज़, भी होने की संभावना है। ध्यान दें कि सरणी सूचकांक 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 करते हैं, तो आपकी स्क्रिप्ट अच्छी तरह से तेज़ हो सकती है । यदि आप श का उपयोग करते हैं, तो आपको नामित सरणियाँ नहीं मिलती हैं, लेकिन आपको अभी भी सरणी को स्थितीय मापदंडों में से एक मिलता है, जिसे आप सेट कर सकते हैं 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
कौन सा दृष्टिकोण तेज है यह शेल पर और तत्वों की संख्या पर निर्भर करता है।
एक अन्य संभावना स्ट्रिंग प्रसंस्करण का उपयोग करना है। इसका फायदा यह है कि स्थितिगत मापदंडों का उपयोग न करने के लिए, इसलिए आप उन्हें किसी और चीज़ के लिए उपयोग कर सकते हैं। यह बड़ी मात्रा में डेटा के लिए धीमा होगा, लेकिन यह डेटा की छोटी मात्रा के लिए ध्यान देने योग्य अंतर करने की संभावना नहीं है।
# 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