क्या आज्ञाओं को चलाना उन्हें धीमा कर देता है?


37

मैंने खुद -vको बहुत सारे अनुप्रयोगों के लिए ध्वज का उपयोग करते हुए कम और कम (विशेष रूप से तुच्छ सामान के लिए ) tarऔर पाया है cp। हालाँकि, जब मैंने किया था और मैंने कहा था, एक बड़ी फ़ाइल को खोलना, जब मैंने -vध्वज का उपयोग नहीं किया था, तो इससे अधिक समय लगेगा ।

मुझे लगता है कि यह इसलिए है क्योंकि टर्मिनल को टेक्स्ट को प्रोसेस करना है और जो भी बफर हो सकता है मैं उसे भर रहा हूं। लेकिन मेरा सवाल यह है कि क्या यह एप्लिकेशन को वास्तव में धीमी गति से चलाता है या क्या यह उसी समय में पूरा होता है और मैं जो देख रहा हूं क्या टर्मिनल पकड़ने की कोशिश कर रहा है?


क्या आपने समय tar xvf file.tar > /dev/nullबनाम बनाम की कोशिश की tar xf file.tar? पर फिर से निर्देशित /dev/nullइस के अपने टर्मिनल से बाहर ले जाना चाहिए।
बेंजामिन बैनियर

3
इसके अलावा, कृपया ध्यान दें कि stdoutऔर stderrकर रहे हैं लाइन बफ़र - जिसका अर्थ है कि बफ़र्स को भरने कि अधिक समय नहीं लगता है - यह अवरुद्ध है printfकॉल (और विस्तार के टर्मिनल उत्पादन से) हमेशा के लिए लेता है।
new123456

1
यदि आपने विंडोज कमांड के बारे में बात की थी, तो मैं निश्चित रूप से कहूंगा कि यह सच है :)
कोकबीरा

CPU गहन कार्य के लिए, आप कितना IO कर रहे हैं, इसके आधार पर, आप भयानक प्रदर्शन गिरावट देख सकते हैं।
उपयोगकर्ता

जवाबों:


31

हां, वर्बोज़ चलाने से आपके एप्लिकेशन धीमा हो जाएंगे।

आवेदन पर कितना निर्भर करता है।

टर्मिनल के प्रत्येक प्रिंट के लिए अतिरिक्त प्रसंस्करण समय की आवश्यकता होगी। प्रिंटफ () या उसकी किसी भी बहन का उपयोग करने के मामले में, यह काफी भारी मात्रा में प्रसंस्करण है।

साथ ही, टर्मिनल को उस डेटा से निपटना होगा। अनुप्रयोग और टर्मिनल के बीच बफर स्थान की एक सीमित मात्रा है, और आईओ चैनल तब तक ब्लॉक करेगा जब तक कि वास्तव में डेटा को आउटपुट करने के लिए बफर में पर्याप्त जगह नहीं है। आमतौर पर यह अवरुद्ध होने पर आवेदन जारी नहीं रह पाएगा। 1

इसके अलावा, टर्मिनल पर डिबगिंग पाठ प्रदर्शित करने का कार्य प्रसंस्करण चक्र का उपभोग करेगा। फिर, यह दोनों अनुप्रयोग (डिबगिंग की मात्रा), टर्मिनल प्रोग्राम (उपयोग किए गए फोंट, प्रभाव, आदि) और यहां तक ​​कि एक्स विंडोज़ ड्राइवर का उपयोग (हार्डवेयर त्वरण, आदि) दोनों पर निर्भर है।

timeकार्यक्रम अच्छी तरह सटीक निर्धारित करने के लिए कितनी देर तक एक कमांड को चलाने के लिए ले लिया है इस्तेमाल किया जा सकता। एक ही प्रोग्राम को दो बार समय से चलाना, एक बार डिबगिंग के साथ, और एक बार बिना, आपको दिखाएगा कि इससे कितना फर्क पड़ता है। मैं यह सुनिश्चित करने के लिए परीक्षण करने से पहले एक बार कमांड चलाने का सुझाव दूंगा कि कैशिंग कमांड के दोनों टेस्ट रन के लिए समान है। आप दूसरा रन बहुत तेजी से जाने से परिणाम को तिरछा नहीं करना चाहते हैं क्योंकि पहले रन के बाद अब ज्यादातर डेटा कैश हो गया था ...


1 मल्टीथ्रेडेड एप्लिकेशन के मामले में केवल डिबगिंग आउटपुट का प्रदर्शन करने वाला धागा वास्तव में ब्लॉक होगा।


अधिकांश प्रोग्रामर इसे बहुत तेजी से सीखते हैं (डॉस में बोरलैंड सी);)
ड्रैगोस

बेशक, यदि कंसोल विंडो छिपी हुई है (या आंशिक रूप से कवर भी है), तो यह लगभग उतना ही प्रभाव नहीं डालेगा जब कंसोल दिखाई देता है। कमांड-प्रॉम्प्ट खोलें और ए करें dir c:\/s/a। जब आप पूरी तरह से दृश्यमान और आंशिक रूप से कवर होते हैं तो आप गति परिवर्तन देख सकते हैं। कम से कम होने पर आप इसे गति नहीं दे सकते हैं , लेकिन यह निश्चित रूप से तेज़ है, हालांकि यदि आप परीक्षण करना चाहते हैं, तो आपको रिबूट करना होगा, ताकि कैशिंग को बायपास किया जा सके, जो कि वैसे भी तेज़ होगा, क्योंकि यह नहीं होगा। डिस्क तक पहुँचने के लिए।
Synetech

1
@ यहाँ हम लिनक्स की बात कर रहे हैं।
माजेंको

1
@ मैट यह अभी भी एक वैध टिप्पणी है। कृपया सम्मान करें।
nhinkle

@ मत्त, दोह! मैंने ध्यान नहीं दिया। (शायद मैं डॉस टिप्पणी से विचलित हो गया।) वैसे भी, लिनक्स काफी अलग है, लेकिन मुझे आश्चर्य है कि अगर वही इसके लिए सही है (बहुत सारे पाठ स्क्रॉलिंग धीमी गति के साथ दिखाई देता है)।
Synetech

8

यह उस एप्लिकेशन पर निर्भर करता है जो आप चला रहे हैं। हालाँकि, सामान्य तौर पर, हम कह सकते हैं कि वर्बोज़ सबसे आम लिनक्स अनुप्रयोगों को धीमा कर देगा क्योंकि उन्हें स्टडआउट और I / O या प्रोसेसर सीमा के बीच अपने कार्यों को सिंक्रनाइज़ करना होगा।


6

yesOS X 10.7 पर एक परीक्षण मामले के रूप में उपयोग करना , ऐसा लगता है कि यह वास्तव में मायने रखता है यदि आप टर्मिनल पर बहुत अधिक आउटपुट प्रिंट करते हैं, जैसा कि कोई उम्मीद करेगा।

इसे थोड़ा आगे बढ़ाते हुए, मैं yes5 सेकंड के लिए भाग गया , एक मामले में टर्मिनल को आउटपुट प्रिंट करने और इसे एक फ़ाइल (साथ tee) में सहेजने के लिए , दूसरे मामले में भी ऐसा करने के अलावा इसे पुनर्निर्देशित किया stdoutगया /dev/null:

  1. yes | tee yeslog_term & sleep 5 && killall yes && wc -l yeslog_term
  2. yes | tee yeslog_noterm > /dev/null & sleep 5 && killall yes && wc -l yeslog_noterm

केस 1. 2371584 लाइनें और केस 2 देता है। 136421376 लाइन या 57 गुना अधिक देता है। (' yesप्रति यूनिट समय प्रिंट करता है) की मात्रा के अनुसार ' प्रदर्शन ' इस मामले में 57 गुना धीमा है

यहां एक ओर ध्यान दिया गया है कि मैंने यहां yesके साथ संयोजन के रूप में उपयोग किया tee, जो परिणामों को थोड़ा प्रभावित कर सकता है, हालांकि मुझे लगता है कि परिणाम अभी भी मान्य हैं।

एक और संकेत है कि कार्यक्रम धीमा हो गया है कि yesटर्मिनल में आउटपुट करते समय चल रहा है , टर्मिनल लगभग 100% सीपीयू और yesकेवल 37% के आसपास का उपयोग करता है , जबकि yesटर्मिनल के लिए आउटपुट के बिना यह पूर्ण 100% का उपयोग करता है (यह एक बहु पर है) कोर मशीन, इसलिए yesअधिक सीपीयू का उपयोग कर सकता था यदि यह सक्षम था, सिवाय इसके कि इसे टर्मिनल द्वारा धीमा कर दिया गया था)।


5

बस हां में जवाब देना आसान है, यह एप्लिकेशन को धीमा कर देगा। लेकिन बहुत अधिक सही जवाब यह है कि यह 99% मामलों में मायने नहीं रखेगा।

यदि आपका एप्लिकेशन किसी भी तरह का काम कर रहा है जो वास्तव में कुछ सीपीयू पावर लेता है, तो स्क्रीन पर टेक्स्ट की कुछ अतिरिक्त लाइनों को प्रिंट करने की संभावना किसी भी तरह का अंतर बनाने का मौका 0% के करीब है।

वास्तव में, आप आसानी से अपना निर्णय ले सकते हैं: यदि आवेदन पाठ की एक विशाल दीवार को उगल रहा है, तो यह वास्तव में आपको एक छोटा सा खर्च कर सकता है। शायद।


3
-1 यह सच नहीं है। printf()बहुत महंगा है
थॉमस बोनिनी

1
मैंने जो कहा वह सच था। हालांकि, जैसा कि मैंने कहा कि आप इसे बनाने की कोशिश कर रहे हैं, यह पूरी तरह से कुछ और है। मैं किसी भी विशिष्ट stdlib मुद्रण की दक्षता के बारे में कुछ नहीं कह रहा हूं। मैं कह रहा हूं कि कार्यक्रम पर्याप्त कार्य करने वाले होने चाहिए कि समय बिताया मुद्रण नगण्य है। अब किसी और को ट्रोल करो।
slarpspark

@slarpspark: यह आवश्यक रूप से नगण्य नहीं है, भले ही हम प्रिंटफ () समीकरण से बाहर ले जाएं, बाइट्स की धारा को अभी भी बैश से गुजरना पड़ता है, फिर टर्मिनल एमुलेटर, फिर टर्मिनल एमुलेटर को स्क्रीन में पाठ को प्रस्तुत करना पड़ता है भागने के पात्रों को पार्स करने के बाद, और पाठ-प्रतिपादन सस्ता नहीं है अगर इस दर पर किया जाए कि कुछ वर्बोज़ कमांड कर सकते हैं; और यह विशेष रूप से महंगा होगा यदि प्रोग्राम आउटपुट बफर को हर लाइन पर फ्लश करता है, जैसे कि संदर्भ स्विच। मैं अक्सर अजगर लिपियों को लिखते समय अनुभव करता हूं, कि तंग पाश में प्रिंट को हटाने से कभी-कभी 10s से 1s हो सकते हैं।
रेयान

SSH पर चलने वाली एक कमांड के बारे में क्या है, फिर भले ही सीपीयू का समय कम से कम हो, एक बार जब आप नेटवर्क विलंबता का परिचय देते हैं, तो यह महत्वपूर्ण है?
ec2011

3

एक क्रिया कोड का मूल्यांकन आमतौर पर एक निर्देश के साथ किया जाता है और हर बार जब यह किसी डिस्प्ले फंक्शन को नियंत्रित करता है, तो इसमें अधिक समय लगता है, संदर्भ स्विच हो सकता है, अधिक व्यवधान हो सकता है।

लेकिन यह निर्भर करता है, यदि आप वर्बोज़ कोड एक अलग धागा है जो समय-समय पर पूरा होने की स्थिति की जाँच कर रहा है, तो अंतर उपेक्षित है।

इस सवाल का स्टैकओवरफ्लो के अनुभवी प्रोग्रामर के योगदान से बहुत लाभ हो सकता है। मेरा सुझाव है कि आगे बढ़ना :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.