मैक ओएस एक्स के तहत मिलीसेकंड में बैश निष्पादन समय कैसे प्राप्त करें?


12

मैं देख लिया है इस है, लेकिन उपलब्ध कराई समाधान मेरे लिए काम नहीं किया।

दिनांक का उपयोग करके मैं सेकंड में निष्पादन समय प्राप्त कर सकता हूं:

T="$(date +%s)"
#some work here
T="$(($(date +%s)-T))"
echo "execution time (secs) ${T}"

हालाँकि, जब मैं यह कोशिश करता हूँ:

T="$(date +%s%N)"
#some work here
T="$(($(date +%s%N)-T))"

नैनो-सेकेंड प्रिसेंस प्राप्त करने की तारीख में% N (उपरोक्तानुसार) जोड़ने पर मुझे निम्न त्रुटि मिलती है: -Bash: 1369320760N: आधार के लिए मूल्य बहुत अधिक है (त्रुटि टोकन "1369320760N")

किसी को पता है कि मैक ओएस एक्स के तहत बैश का उपयोग करके मिलीसेकंड में निष्पादन समय को कैसे मापें?


क्या आपको वास्तव में नैनो के दूसरे प्रस्ताव की आवश्यकता है? इस दृष्टिकोण से आपके पास बहुत अधिक ओवरहेड है। # some work hereOmmited के साथ , मुझे 0.2 से 0.3 सेकंड तक का समय मिलता है - आपके लक्ष्य तक पहुंचने के लिए शून्य (या कम से कम स्थिर) क्या होना चाहिए। जबकि /usr/bin/time usleep 500000.05 +/- 0.01 सेकंड का तर्कपूर्ण स्थिर समय देता है। (केवल लिनक्स में परीक्षण किया है, पता नहीं है अगर / usr / bin / समय और / या usleep पर OSX उपलब्ध है।)
MPY

क्या आप सुनिश्चित हैं कि आंतरिक घड़ी रिज़ॉल्यूशन नैनो-सेकेंड स्तर तक नीचे रिज़ॉल्यूशन को पूरा करता है?
mdpc

जवाबों:


14

चूँकि OSX एक BSD-ish प्रणाली है, यह स्ट्रैफ़टाइम लाइब्रेरी नहीं है %N( http://www.freebsd.org/cgi/man.cgi?query=date )

क्या बाश बिलिन timeकमांड आपको आवश्यक जानकारी देता है?

time some work here

2
यह स्पष्ट करने के लिए धन्यवाद, समय पूरी तरह से काम करता है और तीन परिणामों को आउटपुट करता है, लेकिन मुझे विशेष रूप से प्रारंभिक और अंतिम समय के साथ काम करने की आवश्यकता है।
पचोडेलमबर्ग

11

अगर मुझे मिलीसेकंड और बीएसडी की तारीख का समर्थन नहीं होता तो मैं इस रास्ते पर जाता +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'

धन्यवाद!!! यही कारण है कि समाधान कोई भी आसपास की रिपोर्ट नहीं कर रहा था ...
Daniele B

3

echo $(($(date +%s%N)/1000000))

यह नैनो-सेकंड से मिली-सेकंड में परिवर्तित हो जाएगा।

@Mpy से, date +%s.%Nकाम करता है।

आउटपुट Linux और OS X के बीच अलग है, हालांकि:
linux: 1369322592.573787111
OS X:1369322610.N


मुझे निम्न त्रुटि मिल रही है: -बैश: 1369321446N: आधार के लिए बहुत अधिक मूल्य (त्रुटि टोकन "1369321446N" है) यह मैक ओएक्सएक्स में काम नहीं करता है, मुझे मिल रहा है:
pacodelumit

ठीक है, कि कष्टप्रद है ... (गलत खिड़की पर परीक्षण) एक ही त्रुटि देख: /
संकोची

1
आउटपुट को विभाजित करने की आवश्यकता नहीं है, बस उपयोग करें date +%s.%N(लेकिन मैं OSX पर जांच नहीं कर सकता; यह लिनक्स पर काम कर रहा है)। लेकिन समस्या यह है तो वह यह है कि, bashके $(( ))IMHO चल बिन्दु संख्या को संभालने में सक्षम नहीं है।
MPY

@ ऑम्पी जो ओएक्सएक्स पर काम करती है। पहले 10 वर्णों के लिए समान है, हालांकि linux और OS X के बीच अलग-अलग कार्य करता है।
संकोची

क्या इसका मतलब है कि हम तारीख का उपयोग करके दूसरी सूचना नहीं प्राप्त कर सकते हैं?
पचोडेलमबर्ग

3

यदि आप स्थापित coreutilsकरते हैं तो आप dateलेखन द्वारा GNU लिनक्स का उपयोग कर सकते हैं gdate

Coreutils Homebrew के साथ उपलब्ध है brew install coreutils:।


1

जैसा कि अन्य उत्तर में बताया गया है, OS X की तिथि% N (नैनोसेकंड) का समर्थन नहीं करती है।

क्या आप स्क्रिप्ट के रूप में समय-समय पर कमांड बचा सकते हैं? या उनके लिए एक उप-समूह या कमांड समूह का उपयोग करें:

time (sleep 0.1; echo a; sleep 0.1)
time { sleep 0.1; echo a; sleep 0.1; }

या अलग-अलग आदेशों के समय का योग:

$ time=$(TIMEFORMAT=%R; (time sleep 0.1; echo a) 2>&1 > /dev/null)
$ time+=+$(TIMEFORMAT=%R; (time sleep 0.1) 2>&1)
$ bc <<< $time
.206

या कुछ स्क्रिप्टिंग भाषा का उपयोग करें:

$ ruby -e 'puts "%.3f" % Time.now'
1369329611.046
$ time ruby -e '""'
0.029
$ time ruby -e 'puts "%.3f" % Time.now'
1369329622.943
0.029

%.3f3 दशमलव बिंदुओं के साथ एक अस्थायी बिंदु संख्या के लिए एक प्रारूप निर्दिष्ट करने वाला है। Time.now टाइम क्लास का एक क्लास तरीका है।


आपके उत्तर के लिए धन्यवाद, क्या आप ऊपर दिए गए रूबी कोड का वर्णन कर सकते हैं?
पैकोडलोडबर्ग

1
में ruby -e 'puts "%.3f" % Time.now', rubyरूबी दुभाषिया को कॉल -eकरता है, कमांड लाइन पर आने वाली स्क्रिप्ट को निष्पादित करता है। putsरूबी है printf(सॉर्ट), Timeएक रूबी ऑब्जेक्ट है और Time.nowएपोक के बाद से सेकंड है। %.3f3 दशमलव स्थानों के लिए ट्रिम्स का उपयोग करना , जो कि मिलीसेकंड है (आउटपुट का ".046" और ".943"।)
ओली

1
इसके अलावा, timeएक कमांड लाइन टूल है जो उस समय के कमांड को चलाने में कितना समय लेता है। man timeअधिक जानकारी के लिए देखें।
ओली

1

ग्लेन सही है, timeवह कमांड है जिसे आप ढूंढ रहे हैं, लेकिन आपको जो जानकारी चाहिए, उसे पार्स करने के लिए, आपको इसे कुछ अन्य प्रोसेसर के साथ पास करना होगा sed

time command-goes-here >/dev/null 2>$1|sed rules-go-here

इस कमांड से आउटपुट को कमांड से ही छुटकारा मिल जाएगा (मानक / त्रुटि आउटपुट / / dev / null को आउटपुट दोनों भेजना), और समय परिणाम को sed करने के लिए पास करें, जहां आपको स्ट्रीम संपादित करने के लिए उचित नियम चुनने की आवश्यकता होगी, और आउटपुट वांछित मूल्य।

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