Masa skrip dan prosedur bash anda dari dalam kod

Masa skrip dan prosedur bash anda dari dalam kod

Secara umum, seseorang boleh menggunakan masa Utiliti bash (lihat Masa lelaki Untuk maklumat lanjut) untuk menjalankan program, dan dapatkan ringkasan jangka masa dan ringkasan penggunaan sumber sistem. Tetapi bagaimana satu bahagian kod tertentu, secara langsung dari dalam kod sumber bash?

Menggunakan beberapa tugasan dan pengiraan yang mudah berubah, adalah mungkin untuk mencapai metrik masa yang tepat untuk eksekusi skrip bash.

Dalam tutorial ini anda akan belajar:

  • Bagaimana Skrip Bash Masa Menggunakan Tugasan dan Pengiraan Berbeza
  • Cara Menggunakan Pemasa Bertindih ke Bahagian Khusus Masa Skrip Anda
  • Contoh yang memberi contoh bagaimana bahagian kod tertentu dapat ditetapkan
Pelaksanaan skrip bash masa

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengedaran linux-bebas
Perisian Baris perintah bash, sistem berasaskan linux
Yang lain Sebarang utiliti yang tidak termasuk dalam shell bash secara lalai boleh dipasang menggunakan sudo apt-get memasang nama utiliti (atau pemasangan yum untuk sistem berasaskan redhat)
Konvensyen # - memerlukan komando linux untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$-Memerlukan komando linux untuk dilaksanakan sebagai pengguna yang tidak istimewa

Asas tarikh

Kami akan menggunakan Tarikh Perintah untuk masa kami. Khususnya, kami akan menggunakan tarikh +%s Untuk mendapatkan masa dalam beberapa saat sejak zaman, atau dengan kata lain, bilangan saat sejak 1970-01-01 00:00:00 UTC.

$ tarikh +%s 1607481317 

Perintah tarikh juga boleh menyediakan ketepatan nanoseconds (000000000 ... 9999999999), jika masa anda perlu menjadi sangat tepat:

$ tarikh +%s%n 1607488248328243029 

Membincangkan pelaksanaan pemasa tepat nanosecond adalah di luar skop artikel ini, tetapi sila beritahu kami jika topik ini menarik minat anda. Persediaan akan sangat serupa dengan persediaan yang ditunjukkan di bawah, dengan beberapa pengiraan dan peruntukan tambahan untuk mengendalikan detik berbanding milisaat dan lain -lain.

Contoh 1: Contoh masa yang mudah

Mari kita mulakan dengan contoh yang mudah, di mana kita akan meluangkan masa satu arahan, iaitu Tidur 1, menggunakan dua tarikh +%s arahan dan satu tugasan berubah. Simpan skrip di bawah ke dalam fail yang dipanggil ujian.sh:

#!/bin/bash start = "$ (tarikh +%s)" tidur 1 durasi = $ [$ (tarikh +%s) - $ start] echo $ duration 
Salinan

Di sini kita mula -mula menunjukkan bahawa kita mahu skrip dilaksanakan sebagai kod bash dengan menggunakan #!/bin/bash Pemilihan penterjemah. Kami juga dilaksanakan chmod +x ./ujian.sh untuk menjadikan skrip boleh dilaksanakan setelah menciptanya.

Seterusnya kami menetapkan pembolehubah Mula hingga detik semasa sejak zaman dengan memanggil subshell (seperti yang ditunjukkan oleh $ (...)) dan dalam subshell itu kita laksanakan tarikh +%s. Kami kemudian menggunakan tidur berfungsi untuk menjeda skrip kami selama satu saat. Perhatikan bahawa Tidur 1 boleh digantikan untuk kod program sebenar anda, dengan kata lain bahagian yang anda mahu masa.

Akhirnya kami menetapkan pemboleh ubah baru Tempoh dengan melakukan pengiraan (seperti yang ditunjukkan oleh $ [...]) - iaitu kita mengambil detik semasa sejak zaman (sekali lagi dengan menggunakan tarikh +%s dari dalam subshell) dan kemudian menolak masa permulaan dari yang sama. Hasilnya adalah bilangan detik yang telah berlalu sejak permulaan.

Apabila kita melaksanakan skrip ini, output adalah seperti yang diharapkan:

$ ./ujian.sh 1 

Contoh 2: Contoh masa yang lebih kompleks

Kali ini, mari kita berkembang sedikit dan menjadikan masa lebih modular. ujian2.sh:

#!/bin/bash start1 = "$ (tarikh +%s)" tidur 2 end1 = "$ (tarikh +%s)" tidur 2 start2 = "$ (date +%s)" tidur 3 end2 = "$ (tarikh + %s) "duration1 = $ [$ end1 - $ start1] duration2 = $ [$ end2 - $ start2] echo" Bahagian pertama kod mengambil: $ duration1 "echo" Bahagian ke -2 kod mengambil: $ duration2 " 
Salinan

Di sini kami membuat persediaan yang sama dengan contoh pertama, tetapi kali ini kami menetapkan masa dua arahan yang berbeza, menggunakan set dua pembolehubah, dan kami menyusun perkara sedikit lagi dengan menggunakan Akhir pemboleh ubah untuk kedua -dua arahan. Kita juga boleh menulis garis echo terakhir seperti berikut ujian3.sh:

#!/bin/bash start1 = "$ (tarikh +%s)" tidur 2 end1 = "$ (tarikh +%s)" tidur 2 start2 = "$ (date +%s)" tidur 3 end2 = "$ (tarikh + %s) "echo" bahagian pertama kod mengambil: $ [$ end1 - $ start1] "echo" bahagian ke -2 kod mengambil: $ [$ end2 - $ start2] " 
Salinan

Sebagai kedua -duanya Tempoh Pembolehubah dalam beberapa cara tidak perlu. Mungkin telah membuat kod lebih jelas untuk dibaca, tetapi mereka tidak memenuhi fungsi lain yang nyata, tidak seperti Mula dan Akhir pembolehubah yang digunakan untuk pengiraan sebenar.

Perhatikan bagaimanapun bahawa kita tidak dapat menulis test4.sh:

#!/bin/bash start1 = "$ (tarikh +%s)" tidur 2 tidur 2 start2 = "$ (tarikh +%s)" tidur 3 echo "bahagian pertama kod mengambil: $ [$ (tarikh +%s ) - $ start1] "echo" bahagian 2 kod yang diambil: $ [$ (tarikh +%s) - $ start2] " 
Salinan

Kerana tarikh yang ditangkap di dalam subshell adalah masa ketika echo sedang dilaksanakan, waktu untuk kedua.

Mungkin untuk masa kedua, mungkin ada kemungkinan untuk menggunakan tarikh +%s Secara langsung di echo (sebagai echo pertama hanya akan mengambil beberapa milisaat untuk dilaksanakan, walaupun dengan subshell dan tarikh dimasukkan), tetapi ia tidak sempurna, dan pastinya tidak berfungsi jika masa ketepatan nanodik diperlukan. Ia juga tidak bersih pengekodan dan lebih sukar untuk dibaca/difahami.

Mari laksanakan skrip ini dan bandingkan output:

$ ./test2.SH bahagian pertama kod mengambil: 2 bahagian ke -2 kod yang diambil: 3 $ ./test3.SH bahagian pertama kod mengambil: 2 bahagian ke -2 kod yang diambil: 3 $ ./test4.SH bahagian pertama kod mengambil: 7 bahagian ke -2 kod yang diambil: 3 

The ujian2.sh dan ujian3.sh melaporkan masa yang betul, seperti yang diharapkan. The test4.sh Skrip melaporkan masa yang salah, seperti yang diharapkan.

Bolehkah anda melihat berapa lama skrip berlari secara keseluruhan, kira -kira dalam beberapa saat, tanpa mengira sebarang masa? Sekiranya anda menjawab adalah enam saat, anda betul. Anda dapat melihat bagaimana dalam ujian2.sh dan ujian3.sh ada tambahan Tidur 2 yang tidak ditangkap dalam arahan masa. Ini mencontohkan bagaimana anda dapat meluangkan masa pelbagai bahagian kod.

Contoh 3: Pemasa bertindih

Mari kita lihat contoh akhir yang mempunyai tumpang tindih pemasa dan masa fungsi.test5.sh:

#!/bin/bash my_sleep_function () tidur 1 echern_start = "$ (date +%s)" function_start = "$ (date +%s)" my_sleep_function function_end = "$ (date +%s) $ (tarikh +%s) "echo" bahagian fungsi kod mengambil: $ [$ function_end - $ function_start] detik untuk menjalankan "echo" Kod keseluruhan mengambil: $ [$ echerne_end - $  Keseluruhan_start] detik untuk dijalankan " 
Salinan

Di sini kita menentukan fungsi my_sleep_function yang hanya tidur selama satu saat. Kami seterusnya menetapkan pemasa permulaan keseluruhan dengan menggunakan Keseluruhan_start pemboleh ubah dan sekali lagi kami tarikh +%s Dalam subshell. Seterusnya kita memulakan pemasa lain (pemasa fungsi berdasarkan pada Fungsi_start berubah). Kami menjalankan fungsi dan akhir segera menamatkan pemasa fungsi dengan menetapkan Fungsi_end pembolehubah.

Kami kemudian melakukan tambahan Tidur 2 dan kemudian menamatkan pemasa keseluruhan dengan menetapkan Keseluruhan_end pemasa. Akhirnya, kami mengeluarkan maklumat dalam format yang bagus berhampiran akhir skrip. Kedua-dua echo Kenyataan bukan sebahagian daripada masa, tetapi runtime mereka akan menjadi minimum; Biasanya kami berusaha untuk memasuki pelbagai bahagian dan spesifik kod kami yang cenderung mempunyai tempoh yang panjang seperti gelung yang luas, panggilan program luaran, banyak subshells dll.

Mari lihat keluar test5.sh:

$ ./test5.SH Bahagian fungsi kod mengambil: 1 saat untuk menjalankan kod keseluruhan mengambil: 3 saat untuk dijalankan 


Nampak bagus. Skrip dengan betul menetapkan fungsi ke 1 saat, dan skrip keseluruhan runtime sebagai 3 saat, sebagai gabungan panggilan fungsi dan tidur dua saat tambahan.

Perhatikan bahawa jika fungsi itu berulang, mungkin masuk akal untuk menggunakan pembolehubah masa global tambahan yang mana fungsi runtime dapat ditambah kepada. Anda juga boleh mengira jumlah fungsi panggilan dan kemudian akhirnya membahagikan bilangan panggilan fungsi dengan menggunakan BC (REF Cara Membuat Pengiraan Decimal Di Bash Menggunakan BC). Dalam kes penggunaan ini, ia mungkin menjadi yang terbaik untuk memindahkan pemasa permulaan dan berhenti, serta pengiraan tempoh fungsi ke dalam fungsi. Ia menjadikan kod yang lebih bersih dan lebih jelas dan mungkin menghapuskan duplikasi kod yang tidak perlu.

Kesimpulan

Dalam artikel ini, kami melihat masa pelbagai bahagian kod skrip bash kami dengan menggunakan tarikh +%s sebagai asas untuk mendapatkan detik sejak masa zaman, serta satu atau lebih tugasan berubah untuk mengira masa prestasi satu atau lebih bahagian kod. Menggunakan blok bangunan asas ini, seseorang boleh membuat struktur pengukuran masa yang kompleks, setiap fungsi, setiap skrip yang dipanggil atau bahkan pemasa yang bertindih (contohnya satu setiap skrip serta satu fungsi dan lain -lain.) dengan menggunakan pembolehubah yang berbeza. Nikmati!

Sekiranya anda berminat untuk mempelajari lebih lanjut mengenai Bash, sila lihat siri Tips dan Trik Bash Bash kami yang berguna.

Tutorial Linux Berkaitan:

  • Cara Membina Aplikasi TKInter Menggunakan Objek Berorientasikan ..
  • Tutorial Debugging GDB untuk Pemula
  • Ungkapan biasa python dengan contoh
  • Advanced Bash Regex dengan contoh
  • Gelung bersarang dalam skrip bash
  • Gelung bash dengan contoh
  • Cara Bekerja Dengan API Rest WooCommerce dengan Python
  • Pasang Arch Linux di Workstation VMware
  • Cara Menyiapkan Pelayan OpenVPN di Ubuntu 20.04
  • Idiom pemboleh ubah yang maju untuk kepekaan kes ..