วิธีรับเวลาการประมวลผล Bash เป็นมิลลิวินาทีใน Mac OS X


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")

ไม่มีใครรู้วิธีวัดเวลาดำเนินการเป็นมิลลิวินาทีโดยใช้ bash ใน Mac OS X


คุณต้องการความละเอียดระดับที่สองของนาโนจริงหรือไม่? ซึ่งวิธีนี้คุณมีค่าใช้จ่ายจำนวนมาก ด้วย# some work hereommited ฉันได้รับเวลา 0.2-0.3 วินาทีสิ่งที่ควรเป็นศูนย์ (หรืออย่างน้อยคงที่) เพื่อให้บรรลุเป้าหมายของคุณ ในขณะที่/usr/bin/time usleep 50000ให้เวลาที่มีเหตุผลคงที่ 0.05 +/- 0.01 วินาที (ทดสอบเฉพาะในลินุกซ์ไม่ทราบว่า / usr / bin / เวลาและ / หรือ usleep สามารถใช้ได้ใน OSX.)
MPY

คุณแน่ใจหรือว่าความละเอียดสัญญาณนาฬิกาภายในให้ความละเอียดที่ถูกต้องถึงระดับนาโนวินาที
mdpc

คำตอบ:


14

เนื่องจาก OSX เป็นระบบ BSD-ish จึงไม่มีไลบรารี strftime %N( http://www.freebsd.org/cgi/man.cgi?query=date )

timeคำสั่งbash builtin ให้ข้อมูลที่คุณต้องการหรือไม่?

time some work here

2
ขอบคุณที่ทำให้มันชัดเจนเวลาทำงานได้อย่างสมบูรณ์และให้ผลลัพธ์ที่สาม แต่ฉันต้องทำงานเฉพาะกับครั้งแรกและครั้งสุดท้าย
pacodelumberg

11

ฉันจะไปเส้นทางนี้ถ้าฉันต้องการมิลลิวินาทีและ BSD ไม่สนับสนุนวันที่ +%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


ฉันได้รับข้อผิดพลาดต่อไปนี้: -bash: 1369321446N: ค่ามากเกินไปสำหรับฐาน (โทเค็นข้อผิดพลาดคือ "1369321446N") สิ่งนี้ไม่ทำงานใน mac osx ฉันได้รับ:
pacodelumberg

นั่นเป็นเรื่องที่น่ารำคาญ ... (ทดสอบในหน้าต่างผิด) เห็นข้อผิดพลาดเดียวกัน: /
เอียงอาย

1
ไม่จำเป็นต้องหารผลลัพธ์แค่ใช้date +%s.%N(แต่ฉันไม่สามารถตรวจสอบ OSX ได้มันทำงานบน Linux) แต่ปัญหาก็คือว่าbash's $(( ))IMHO จะไม่สามารถที่จะจัดการกับตัวเลขทศนิยม
mpy

@mpy นั้นใช้ได้กับ osx ออกมาเหมือนกันสำหรับ 10 ตัวแรกทำหน้าที่แตกต่างกันระหว่าง linux และ OS X
เอียง

หมายความว่าเราไม่สามารถรับข้อมูลที่สองของนาโนโดยใช้วันที่ได้หรือไม่?
pacodelumberg

3

หากคุณติดตั้งcoreutilsคุณสามารถใช้ GNU ลินุกซ์โดยการเขียนdategdate

coreutils สามารถใช้ได้กับ brew install coreutilsHomebrew:


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

%.3fเป็นตัวระบุรูปแบบสำหรับตัวเลขทศนิยมที่มีทศนิยม 3 ตำแหน่ง Time.nowเป็นวิธีการเรียนของคลาสเวลา


ขอบคุณสำหรับคำตอบของคุณคุณช่วยอธิบายรหัสทับทิมด้านบนได้ไหม
pacodelumberg

1
ในruby -e 'puts "%.3f" % Time.now', rubyเรียกล่ามทับทิม-eรันสคริปต์ที่ดังต่อไปนี้ในบรรทัดคำสั่ง putsคือ ruby printf(เรียงลำดับ) Timeเป็นวัตถุทับทิมและTime.nowเป็นวินาทีตั้งแต่ยุค การใช้การ%.3fตัดแต่งเอาต์พุตให้เป็นทศนิยม 3 ตำแหน่งซึ่งเป็นมิลลิวินาที (ส่วน ".046" และ ".943" ของเอาต์พุต)
Olie

1
นอกจากนี้timeเป็นเครื่องมือบรรทัดคำสั่งที่ใช้เวลานานเท่าใดในการเรียกใช้คำสั่งที่ตามมา ดูman timeรายละเอียดเพิ่มเติมได้ที่
Olie

1

เกล็นที่ถูกต้องtimeเป็นคำสั่งที่คุณกำลังมองหา แต่เพื่อที่จะแยกออกจากข้อมูลที่คุณต้องการคุณจะต้องผ่านมันไปให้บางหน่วยประมวลผลอื่น ๆ sedเช่น

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

คำสั่งนี้จะกำจัดเอาต์พุตจากคำสั่งเอง (ส่งทั้งเอาต์พุตมาตรฐานและข้อผิดพลาดไปยัง / dev / null) และส่งผ่านผลลัพธ์เวลาไปยัง sed ซึ่งคุณจะต้องเลือกกฎที่เหมาะสมเพื่อแก้ไขสตรีมและเอาต์พุต ค่าที่ต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.