Umumiy bo'lmagan bash`ning vaqt ko'rsatkichi muqobilmi?

Skriptlarning turli vaqtlardagi ishlash vaqtlarini taqqoslash uchun ba'zi YU javoblar bash ning o'rnatilgan time buyrug'i yordamida shunday taklif qiladi:

time bash -c 'foo.sh'
time dash -c 'foo.sh'

... va hokazo. , sinov uchun har bir qobiq uchun. Bunday qiyoslashlar har bir qobiq uchun yuklanadigan vaqtni bartaraf eta olmaydi va o'zini ni ishga tushiradi. Masalan, ikkala yuqoridagi buyruqlar ham da o'qish tezligi bilan sekin floppi ( ~ 150K ) 7x haqida bash ( time raqamlarini burishib ketadi - bu kabuklar oldindan yuklash vaqti foo.sh har bir qobiq ostida keyin kabukları yukladilar.

Har bir qobiqda ichida ishlaydigan skript vaqtini ishlatish uchun eng yaxshi portativ va umumiy foydalanish nima? Shunday qilib, yuqoridagi kod quyidagi kabi ko'rinadi:

bash -c 'general_timer_util foo.sh'
dash -c 'general_timer_util foo.sh'

Eslatma: Hech kim ko'chma yoki umumiy bo'lmaganligi bois, hech qanday qobiq o'rnatilgan emas time buyruqlar.


Yaxshiyamki, util shuningdek, foydalanuvchining buyrug'i bilan dastaklashi kerak bo'lmay turib, qobiqning ichki buyruqlari va quvurlari orqali olingan vaqtni qiyoslashi mumkin. Bu kabi sun'iy sintaksis yordam beradi:

general_timer_util "while read x ; do echo x ; done < foo"

Ba'zi kabuklar time buni boshqarishi mumkin. Misol uchun bash -c "vaqt false bo'lsa, bajaring:" ishlaydi.

7
Faqat /usr/bin/time dan foydalaning?
qo'shib qo'ydi muallif Tejaswi Yerukalapudi, manba
Shuningdek, sizning savolingiz bo'yicha qayta ochilgan ovozingiz bor.
qo'shib qo'ydi muallif marcel_g, manba
"Portativ yoki umumiy" deganingiz nimani anglatadi? Qobiq joylari tashqi buyruqlar sifatida ko'chma (ko'plab tizimlarda ishlaydi) va ko'proq umumiy (boshqa holatlarda ishlaydi, chunki ular faylni bajarishdan boshqa narsa qilishlari mumkin). Siz nima muammoni echishga harakat qilyapsiz?
qo'shib qo'ydi muallif Valters Vingolds, manba
@MichaelHomer, agar bilsangiz (yoki ishonasiz), muayyan cheklashlar mutlaqo mutlaqo mutlaqo boshqacha bo'lishi kerak bo'lsa, iltimos, bu mumkin bo'lmagan kombaynlarni javobga qo'ying.
qo'shib qo'ydi muallif agc, manba
@MichaelHomer, men turli xil usullarni nazarda tutgan edim. Misol uchun, bu erda xomashyo usuli mavjud: foydalanilsa chiziqda qobiliyatli bo'shliqni null skript bilan yuklashga qancha vaqt sarflaganini yaxshi o'rtacha hisoblab chiqsa, o'sha vaqtni o'sha vaqtdan foydalanuvchining test skriptini ishlatish uchun talab qilinadi.
qo'shib qo'ydi muallif agc, manba
@Gilles, faqat qiziq, turli muammolar kelib chiqadi, keyin esa bu narsa emas. <div> <div> <div style = "text-align: justify;"> <html> muru vaqt qurilgan s ...
qo'shib qo'ydi muallif agc, manba
Taşınabilirlikle bilan bog'liq bo'lib, /proc/uptime qiymatidan oldin va keyin, oddiygina chiqarish qanday qilinadi? (Shuningdek, vaqt o'zgarishi bilan ishlaydi.)
qo'shib qo'ydi muallif phk, manba
Men eng yaxshi tashabbusimni tarqatganman, ammo menimcha, bu savolga hali erishmoqchi bo'lgan narsalar haqida hali aniq aytilmagan.
qo'shib qo'ydi muallif Michael Homer, manba
Bu savolga javob emas, siz xohlagan narsani aniqlab berishingiz kerak.
qo'shib qo'ydi muallif Michael Homer, manba
Qanday qilib biron-bir bino bo'lmagan bo'lishi mumkin, har ikkala "har bir qobiq uchun vaqtni bekor qilish va uni ishga tushirishni bekor qilish" mumkin va "portativ va umumiy" bo'lganda mustaqil yozuvni amalga oshirish mumkin.
qo'shib qo'ydi muallif Michael Homer, manba

5 javoblar

time ko'rsatilishini e'tiborga olishingiz kerak POSIX tomonidan va AFAICTning POSIX (P kodi-p ) deb nomlangan yagona variantini turli xil shekilli tomonidan to'g'ri qo'llab-quvvatlanadigan:

$ bash -c 'time -p echo'

real 0.00
user 0.00
sys 0.00
$ dash -c 'time -p echo'

real 0.01
user 0.00
sys 0.00
$ busybox sh -c 'time -p echo'

real 0.00
user 0.00
sys 0.00
$ ksh -c 'time -p echo'       

real 0.00
user 0.00
sys 0.00
7
qo'shib qo'ydi
Muammo shundaki, vaqtni taqqoslash uchun natijani time bilan bir xil amalga oshirish vaqti bilan bajarish kerak. Sprinterlarni o'z vaqtini bir soat ichida bir soat bilan bajarish o'rniga, alohida-alohida 100 metrga o'lchash imkonini beradi. Bu ochiq-oydin gap, ammo ...
qo'shib qo'ydi muallif Tejaswi Yerukalapudi, manba
@muru, RASMIYLE ni ko'rib chiqish: bu bo'lim faqatgina kelishuvning ikki tomonini tavsiflab berganday tuyuladi, chunki u yozilmagan paytda hech kim bu savolga qoniqarli javob topdi. Ko'proq POSIX qobiq asosidagi time o'rnatilgan va tashqi time util uchun o'rnashdi, chunki ikkita umumiy bo'lmagan vaqt usullari umuman time standartlaridan yaxshiroq edi.
qo'shib qo'ydi muallif agc, manba
@muru, bu POSIX taklifining manbasi nima?
qo'shib qo'ydi muallif agc, manba
@muru, tizimimda dash -c 'vaqt-false while false; qilish:; amalga oshirilgan "vaqt: ishlamaydi: bunday fayl yoki katalog bo'lmasa nol bo'lmagan holat 127" xatolar bilan o'chirilgan.
qo'shib qo'ydi muallif agc, manba
@Kusalananda Men muammo deb o'yladim, o'p o'yini time ko'chma emas; portativ ko'rinadi. (Men sizning fikringizni taqqoslash bo'yicha fikringizga qo'shilaman)
qo'shib qo'ydi muallif muru, manba
@agc POSIX da shunday deyilgan: "Kabelning buyruqlar buyrug'i, quvur tarmoqlari, maxsus o'rnatilganlar va hokazolarni to'g'ridan-to'g'ri ishlatib bo'lmaydigan haqiqatni ta'kidlash uchun komyuter buyrug'i emas, balki ishlatiladi. qobiq skriptlari, faqat standart yordam dasturlari emas. " (RATIONALE bo'limiga qarang)
qo'shib qo'ydi muallif muru, manba
qo'shib qo'ydi muallif muru, manba

time yordam dasturi, odatda, "neytral" taymer sifatida foydasiz holga keltirganini sezganingiz kabi odatda qobiqga o'rnatiladi.

Shu bilan birga, yordamchi dastur odatda siz taklif qilgan vaqt sinovlarini amalga oshirish uchun ishlatilishi mumkin bo'lgan /usr/bin/time tashqi yordam dasturi sifatida ham mavjud.

$ bash -c '/usr/bin/time foo.sh'
6
qo'shib qo'ydi
@Kevin Juda to'g'ri. Men faqatgina "kodni o'rnatish vaqtida" hech qanday qobiqni olmadim. . Qobiqning boshlanish vaqti alohida ravishda o'lchanishi mumkin.
qo'shib qo'ydi muallif Tejaswi Yerukalapudi, manba
time builtin buyrug'i bo'lgan har qanday qobiqni bilmayman. Biroq, bash , jumladan, ko'plab chig'anoqlari vaqt quvurlari uchun ishlatilishi mumkin bo'lgan time kalit so'ziga ega. Ushbu kalit so'zni o'chirish uchun time buyrug'i (fayl tizimida) ishlatilishi mumkin, siz buni "vaqt" foo.sh kabi taklif qilishingiz mumkin. Shuningdek qarang: unix.stackexchange.com/search?q=user%3A22565+time+keywordtion/a >
qo'shib qo'ydi muallif Stéphane Chazelas, manba
Agar foo.sh executable va shebang bo'lsa, u har doim bir xil qobiq bilan ishlaydi, va bu qobiqning boshlanish vaqtini hisoblaydi, shuning uchun OP nima istaydi. Agar foo.sh bo'lmasa, unda bu ishlamaydi.
qo'shib qo'ydi muallif Kevin, manba
Qanday qilib bu "har bir qobiq uchun o'z vaqtini o'rnatish va ishga tushirish vaqtini yo'qotadi"?
qo'shib qo'ydi muallif Michael Homer, manba

Yuqori o'lchamdagi taymerni qo'llab-quvvatlaydigan GNU sana buyrug'ini ishlataman:

START=$(date +%s.%N)
# do something #######################

"[email protected]" &> /dev/null

#######################################
END=$(date +%s.%N)
DIFF=$( echo "scale=3; (${END} - ${START})*1000/1" | bc )
echo "${DIFF}"

Va men quyidagi buyruqni chaqiraman:

/usr/local/bin/timing dig +short unix.stackexchange.com
141.835

Chiqish birligi millisekundlarda.

6
qo'shib qo'ydi
Bunga maxsus GNU sana kerak.
qo'shib qo'ydi muallif Tejaswi Yerukalapudi, manba
Bundan tashqari, ba'zi bir NTP mijozlari tizim vaqtida "o'tish" qilishdan ko'ra soatni tezlashtirmaydi va tezlashtiradimi? Agar sizda bunday NTP mijozi bo'lsa va siz kecha kechqurun ba'zi vaqtlarni belgilagan bo'lsangiz, ehtimol ular NTP mijozidan "ikkinchi darajali" kutib olishlari mumkin. (Yoki tizim soati bu holatda 61 ga ishlaydi?)
qo'shib qo'ydi muallif Kristof Provost, manba
NTP mijozlari vaqtni to'g'ridan-to'g'ri to'g'ridan-to'g'ri almashtirish o'rniga soatni sekinlatish/tezlashtirishni afzal ko'radi. Bu soat va vaqtning uzilishiga to'sqinlik qiladi, bu vaqt belgilariga ishlaydigan ilovalarga umuman yoqimlidir. Biroq, NTP-serverlarga zarar etkazuvchi googllarni ishlatmaguningizcha, sakrash soniyalari qo'shimcha soniya sifatida ko'rib chiqiladi.
qo'shib qo'ydi muallif JKP, manba
@ JörgWMittag Bu AIXning vaqtinchalik belgilari UNIXga ta'sir qilmaydigan ikkinchi pog'ona haqida emas edi va siz gaplashayotgan usul moslashsa, men ko'rgan narsa emas. Men mijozning busybox ning ntpd deb ishonaman.
qo'shib qo'ydi muallif phk, manba
@Rabin Sizning NTP mijozingiz sizning muammolaringiz haqida gapiradi va yangilaydi va kodni START va END o'rtasida o'rnatgan vaqtni o'zgartirasiz, bu sizning natijangizga ta'sir qiladi. Hech qanday tasavvurga ega emasligingizni va sizning holatingizda muhimligini bilmasangiz ham, men aytganimdek, nimani yodda tutish kerakligini bilib bo'lmaydi. (O'yin haqida hikoya: Men dasturni bilaman, bu aniq kutilmagan tarzda salbiy natijalarga olib keldi - u hisob-kitoblarni bajarish uchun ishlatildi - bu keyinchalik bir nechta narsani buzdi.)
qo'shib qo'ydi muallif phk, manba
Vaqtni (vaqtli vaqtni) nazarda tutib, o'zgarmaydi. Muammoni keltirib chiqaradigan, ammo eslatib turadigan vaziyatni amalda ko'rib bo'lmaydi.
qo'shib qo'ydi muallif phk, manba
@phk Rahmat, siz to'g'ri, kichik o'zgarishsiz, lekin hisobga olinadi.
qo'shib qo'ydi muallif Rabin, manba
@phk Iltimos, izoh bering?
qo'shib qo'ydi muallif Rabin, manba

Ko'p marta kiritilgan ma'lumotlar tufayli katta qismlarda /proc/uptime va dc / bc / awk agc tomonidan tayyorlangan:

#!/bin/sh

read -r before _ < /proc/uptime

sleep 2s # do something...

read -r after _ < /proc/uptime

duration=$(dc -e "${after} ${before} - n")
# Alternative using bc:
#   duration=$(echo "${after} - ${before}" | bc)
# Alternative using awk:
#   duration=$(echo "${after} ${before}" | awk '{print $1 - $2}')

echo "It took $duration seconds."

Shubhasiz, /proc/uptime mavjud va ma'lum bir shaklga ega.

4
qo'shib qo'ydi
Bu esa, shell'lar orasida ko'chma bo'ladi, lekin Unix ilovalari orasida portativ emas, chunki ba'zilar /proc fayl tizimiga ega emas. Agar bu tashvish bo'lsa yoki yo'q bo'lsa, bilmayman.
qo'shib qo'ydi muallif Tejaswi Yerukalapudi, manba
Buni ilgari o'ylamagan edim, lekin agar read kabi builtins cat dan yaxshiroq bo'lsa, bu tozalovchi (va biroz tezroq) bo'ladi: dummyvar oldin o'qish
qo'shib qo'ydi muallif agc, manba
Buning uchun Q floppy disk tezligini yoki yomonligini taklif qiladi. Bu holatda awk yuklanishining yuki sezilarli bo'lishi mumkin. Bundan oldin b = $ (cat/proc/uptime) , so'ng a = $ (cat/proc/uptime) so'ng keyin i> $ a va $ b ni olib tashlang.
qo'shib qo'ydi muallif agc, manba
@agc Yaxshi kirish, rahmat, bunga mos ravishda muqobil echimlarni qo'shdim.
qo'shib qo'ydi muallif phk, manba

Mana bu yechim:

  1. eliminate[s] the time taken for each shell to load and initialize itself

  2. can be run from within each shell

  3. Uses

    no shell built-in time commands, since none are portable or general

  4. Works in all POSIX-compatible shells.
  5. Works on all POSIX-compatible and XSI-conforming systems with a C compiler, or where you can compile a C executable in advance.
  6. Uses the same timing implementation on all shells.

Ikki qism mavjud: gettimeofday clock_gettime dan ancha eski, ammo undan ham ko'chma bo'lgan kodi va skriptni sotib olishning har ikkala tomonini o'qiyotgan mikrosaniyadan iborat aniq soatni olish uchun ushbu dasturdan foydalanadigan qisqa qobiqli skript. C dasturi vaqt belgilari bo'yicha pastki ikkinchi aniqlikni olishning yagona ko'chma va minimal-tepalik usuli hisoblanadi.

Bu erda C kodi epoch.c :

#include 
#include 
int main(int argc, char **argv) {
    struct timeval time;
    gettimeofday(&time, NULL);
    printf("%li.%06i", time.tv_sec, time.tv_usec);
}

Va taymer shell skript:

#!/bin/echo Run this in the shell you want to test

START=$(./epoch)
. "$1"
END=$(./epoch)
echo "$END - $START" | bc

Bu standart shell buyrug'i tili va bc va har qanday POSIX mos keluvchi qobiq ostida skript sifatida ishlashi kerak.

Buni quyidagi kabi foydalanishingiz mumkin:

$ bash timer ./test.sh
.002052
$ dash timer ./test.sh
.000895
$ zsh timer ./test.sh
.000662

Tizim yoki foydalanuvchi vaqtini o'lchamaydi, faqat monotonik bo'lmagan devor soatining o'tgan vaqti. Agar skriptni bajarish paytida tizim soati o'zgarib ketsa, bu noto'g'ri natijalar beradi. Tizim yuk ostida bo'lsa, natija ishonchsiz bo'ladi. Kabuklar orasida yaxshi portativ bo'lishi mumkinligini o'ylamayman.

O'zgartirilgan taymer skriptida eval buyrug'i tashqari buyruqlarni ishlatish o'rniga.

4
qo'shib qo'ydi
qo'shib qo'ydi muallif agc, manba