วิธีใช้ตัวจับเวลาในการทุบตี?


30

ฉันต้องการตัวจับเวลาซึ่งจะเริ่มในตอนต้นของสคริปต์และหยุดในตอนท้าย


2
กรุณาเขียนเป้าหมายที่คุณต้องการบรรลุ เพื่อวัดสคริปต์เวลาทำงานใช้timeคำสั่ง (time ./script.sh) เพื่อพิมพ์dateคำสั่งใช้เวลาปัจจุบันและอื่น ๆ
เร่ง


ใช้ linux พื้นฐาน cmd: time yourprogram.shที่ @Marius Cotofana อธิบาย
Martijn van Wezel

คำตอบ:


29

หากคุณต้องการระยะเวลาเป็นวินาทีที่การใช้งานสูงสุด

start=$SECONDS

และในตอนท้าย

duration=$(( SECONDS - start ))

จะทำอย่างไรถ้าใช้เวลามากกว่าวินาที
Pithikos

@Pithikos ดูคำตอบของ Philip Gibbonsด้านล่าง
xhienne

23

คุณสามารถใช้timeคำสั่งในตัวของ Linux จากหน้าคน:

เวลา COMMAND [อาร์กิวเมนต์]

เวลากำหนดว่าข้อมูลใดที่จะแสดงเกี่ยวกับทรัพยากรที่ใช้โดยคำสั่งจากสตริงรูปแบบ หากไม่มีการระบุรูปแบบบนบรรทัดคำสั่ง แต่ตั้งค่าตัวแปรสภาพแวดล้อม TIME ค่าจะถูกใช้เป็นรูปแบบ

ในการกำหนดเวลาcleanup.shสคริปต์ให้ใช้:

$ time cleanup.sh

1
รู้ว่าtimeคุณกำลังใช้ hackernoon.com/…
km6zla

8

ฉันรู้ว่านี่เป็นคำถามที่ค่อนข้างเก่า แต่นี่เป็นวิธีที่ฉันทำเพื่อทุกสิ่งเมื่อฉันต้องการ / จำเป็นต้องรู้ว่าจะต้องใช้เวลานานแค่ไหน

Bash มีตัวจับเวลาวินาทีในตัวในรูปแบบของตัวแปรภายในชื่อSECONDS(ดู: ที่นี่สำหรับตัวแปรภายในอื่น ๆ )

ใส่ SECONDS=0ก่อนสิ่งที่คุณกำลังตรวจสอบเวลาทำงานของ จะต้องอยู่หลังการป้อนข้อมูลของผู้ใช้เพื่อให้ได้ผลลัพธ์ที่ดีดังนั้นหากคุณได้รับพร้อมท์สำหรับข้อมูลให้วางไว้หลังพรอมต์

จากนั้นให้ใส่ส่วนท้ายของสิ่งที่คุณกำลังตรวจสอบ:

if (( $SECONDS > 3600 )) ; then
    let "hours=SECONDS/3600"
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" 
elif (( $SECONDS > 60 )) ; then
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $minutes minute(s) and $seconds second(s)"
else
    echo "Completed in $SECONDS seconds"
fi

หากคุณต้องการทราบเวลาเป็นวินาทีเท่านั้นคุณสามารถลดความซับซ้อนของด้านบนเป็น:

echo "Completed in $SECONDS seconds"

ตัวอย่างเช่น:

read -rp "What's your name? " "name"
SECONDS=0
echo "Hello, $name"
if (( $SECONDS > 3600 )) ; then
    let "hours=SECONDS/3600"
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" 
elif (( $SECONDS > 60 )) ; then
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $minutes minute(s) and $seconds second(s)"
else
    echo "Completed in $SECONDS seconds"
fi

3
ทางลัดสำหรับผู้ที่ไม่ต้องการรูปแบบเวลาที่ซับซ้อนเช่น: date +%T -d "1/1 + $SECONDS sec"(จำกัด ให้น้อยกว่า 24 ชั่วโมง แต่คุณสามารถปรับตัวเพื่อเพิ่มวันได้เช่นกัน)
xhienne

1
#!/bin/bash

start=$(date +%s)
#
# do something
sleep 10
#
#
end=$(date +%s)

seconds=$(echo "$end - $start" | bc)
echo $seconds' sec'

echo 'Formatted:'
awk -v t=$seconds 'BEGIN{t=int(t*1000); printf "%d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'

1
สวัสดียินดีต้อนรับสู่ Unix SE! คำตอบที่ใช้โค้ดไม่ได้ผลดีนักบางทีคุณอาจอธิบายว่าสคริปต์ของคุณทำอะไรอยู่
peterh กล่าวว่าคืนสถานะโมนิก้า

0

@anask แก้ปัญหาที่ชาญฉลาดสำหรับคำตอบนี้ฉันแนะนำให้ใช้ native $SECONDSแทนการสร้างคำตอบใหม่

awk -v t=$SECONDS 'BEGIN{t=int(t*1000); printf "Elapsed Time (HH:MM:SS): %d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'

วัตถุประสงค์ของการprintfและการหารคือการแปลงวินาทีที่ผ่านไปเป็นชั่วโมงเอกภาพสอดคล้อง Mins, Secs ตามลำดับ

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