
Publikasi ini menyajikan implementasi perangkat lunak dari alat bawaan untuk mengumpulkan dan mengumpulkan informasi metrik pada runtime aplikasi yang ditulis dalam C / C ++ / C #.
Inti dari pendekatan yang dideskripsikan didasarkan pada dimasukkannya "titik kontrol" dalam kode program aplikasi untuk mengekstraksi data pada waktu eksekusi komponen struktural: metode, fungsi, dan blok {}. Informasi metrik yang diekstrak diakumulasikan dalam basis data internal, yang isinya di akhir aplikasi dikonversi menjadi bentuk laporan teks yang disimpan dalam file. Ketepatan menggunakan sarana kontrol bawaan waktu eksekusi adalah karena kebutuhan untuk mengidentifikasi area masalah kode, menganalisis penyebab degradasi sementara aplikasi: penuh atau sebagian, atau muncul pada set tertentu dari sumber data.
Contoh kode sumber C ++ / C # yang diberikan menunjukkan kemungkinan implementasi dari pendekatan yang dijelaskan.
Pendahuluan
Pengembangan aplikasi perangkat lunak pada setiap iterasi (misalnya, rilis rilis berikutnya) pengembangan evolusionernya meliputi langkah-langkah dasar berikut:
- pengembangan dan pengujian fungsionalitas;
- optimalisasi sumber daya RAM yang dikonsumsi;
- stabilisasi metrik runtime.
Langkah-langkah ini membutuhkan sejumlah besar pengembang tidak hanya kreatif (seperti pengembangan dan implementasi algoritma yang efektif, membangun arsitektur perangkat lunak yang fleksibel, dll), tetapi juga pekerjaan rutin. Kategori yang terakhir mencakup kegiatan yang bertujuan untuk menstabilkan metrik waktu untuk eksekusi aplikasi. Dalam banyak kasus, ini adalah prosedur yang agak menyakitkan ketika pengembang dihadapkan pada degradasi, yang merupakan konsekuensi dari perluasan fungsionalitas produk perangkat lunak, pembangunan kembali arsitektur perangkat lunak dan munculnya utas baru dalam aplikasi. Pada saat yang sama, sumber-sumber degradasi memerlukan upaya tertentu untuk mendeteksinya, yang dicapai tidak hanya dengan tekun dan tanggung jawab pengembang yang tinggi (kondisi yang diperlukan), tetapi juga oleh komposisi alat yang digunakan untuk tujuan ini (kondisi yang memadai).
Salah satu pendekatan yang efektif untuk memecahkan masalah menganalisis metrik waktu aplikasi adalah penggunaan produk perangkat lunak khusus, misalnya
gprof GNU. Analisis laporan yang dihasilkan oleh alat-alat tersebut memungkinkan Anda untuk mengidentifikasi "hambatan" (metode dan fungsi kelas), yang merupakan jumlah waktu yang dihabiskan untuk menjalankan aplikasi secara keseluruhan. Pada saat yang sama, validitas waktu yang dihabiskan untuk pelaksanaan metode dan prosedur tentu memenuhi syarat oleh pengembang.
Perlu juga dicatat bahwa produk perangkat lunak dari kelas ini, sebagai suatu peraturan, melakukan analisis metrik dari waktu eksekusi kode program pada level metode kelas dan fungsi, mengabaikan level yang lebih rendah (namun tetap signifikan dari sudut pandang analisis masalah):
{...}, untuk, sementara, lakukan-sampai, jika - selain itu, coba-tangkap blok, yang di dalamnya pengeluaran pengeluaran waktu eksekusi tidak kurang signifikan terjadi.
Selanjutnya, konten utama dari salah satu solusi yang mungkin untuk penerapan alat kontrol runtime built-in yang ditujukan untuk mengekstraksi dan mengumpulkan informasi terperinci tentang metrik waktu dari blok perangkat lunak yang dikontrol dengan pembuatan laporan berikutnya untuk pengembang dipertimbangkan.
Metode untuk Mengambil Data Runtime
Fungsionalitas aplikasi perangkat lunak apa pun dapat diartikan sebagai
mesin abstrak dengan seperangkat
status unik
{St} dan transisi
{Tr} di antaranya.
Dalam kerangka pendekatan ini, setiap aliran eksekusi dalam aplikasi harus diinterpretasikan sebagai urutan urutan negara dan transisi di antara mereka. Dalam hal ini, estimasi biaya waktu eksekusi dilakukan dengan menjumlahkan metrik waktu pada seluruh rangkaian negara yang disahkan dengan mengabaikan biaya transisi dari satu kondisi ke kondisi lainnya - sebagai nilai yang dapat diabaikan.
Ekstraksi dan akumulasi data pada waktu eksekusi aplikasi pada titik kontrol yang ditentukan adalah tugas utama yang diselesaikan oleh alat kontrol bawaan yang dijelaskan di bawah ini.
Untuk setiap breakpoint dideklarasikan dalam kode sumber dengan menempatkan
PROFILE_ENTRY C ++ makro, jumlah pass-nya selama eksekusi aplikasi dicatat, serta metrik waktu - total waktu aplikasi berada dalam status dari saat checkpoint melewati ke level berikutnya dari hirarki program (termasuk blok, metode kelas, fungsi, dll.) seperti yang diilustrasikan dalam diagram di bawah ini.
Kontrol titik kontrol (pendaftaran awal dan perhitungan metrik waktu mereka) dilakukan oleh objek
'timeManager' , yang dibuat dalam satu instance. Setiap peristiwa melewati pos pemeriksaan ditetapkan oleh objek
'timeManager', dan selama pass pertama terdaftar olehnya sebagai diamati sebagai
'registerEntry' .
Pada saat setiap bagian dari titik kontrol,
timerObject dibuat, menetapkan waktu pembuatannya. Waktu eksekusi ditetapkan pada pos pemeriksaan ketika aplikasi keluar dari level hirarki perangkat lunak saat ini. Pada saat ini, timerObject dari objek secara otomatis dihancurkan, yang disertai dengan perhitungan "seumur hidupnya" T. Sebagai hasilnya,
manajer waktu meningkatkan jumlah kali melewati pos pemeriksaan dan waktu yang dihabiskan di dalamnya oleh
T. Untuk semua titik kontrol yang ditetapkan,
timeManager mengumpulkan data dengan rilis laporan berikutnya saat aplikasi berakhir.

Di bawah ini adalah kode sumber C ++ yang mengimplementasikan alat bawaan untuk mengendalikan waktu eksekusi aplikasi.
Struktur aplikasi demo diilustrasikan di bawah ini, mengilustrasikan penggunaan alat kontrol runtime built-in sebagai contoh, serta tabel hasil yang diperoleh (untuk detail, lihat
Lampiran 1. Kode sumber aplikasi demo ).


Bagian
Adendum 2. Kode sumber alat kontrol bawaan untuk waktu eksekusi aplikasi C # menyajikan implementasi yang serupa dari kontrol bawaan di C #.
Penulis menggunakan pasangan
TimeWatcher.StartWatch () dan
TimeWatcher.StopWatch () ketika membuat profil waktu pelaksanaan metode dan prosedur yang melelahkan (dari sudut pandang komputasi) sebagai bagian dari produk perangkat lunak
Delta Design yang dikembangkan oleh
EREMEX - sistem desain berbantuan komputer untuk peralatan elektronik.
Di bawah ini adalah contoh laporan singkat tentang metrik waktu dari salah satu fungsi produk yang disebutkan.
Kesimpulan singkat
Alat yang dijelaskan dapat digunakan untuk mengumpulkan data tentang waktu eksekusi aplikasi di berbagai bagian kode programnya, khususnya, mereka memungkinkan:
- mengumpulkan dan mengumpulkan data tentang metrik waktu utas eksekusi dalam aplikasi;
- melakukan perkiraan waktu pelaksanaan kode program yang akurat untuk konstruksi bahasa dasar;
- mengelola volume data yang diekstraksi dengan menghidupkan dan mematikan alat kontrol bawaan pada bagian yang sesuai dari aliran eksekusi aplikasi;
- mengembangkan dan menerapkan tes regresi yang memantau stabilitas (dan mendeteksi degradasi) dari metrik waktu aplikasi.
Sebagai kesimpulan, harus dicatat bahwa di luar ruang lingkup publikasi ini ada pertanyaan tentang penggunaan alat kontrol bawaan yang dijelaskan dalam konteks aplikasi
multithreading dan tidak ada analisis keakuratan data yang diperoleh dengan metrik waktu disajikan dalam bentuk apa pun. Yang terakhir ini disebabkan oleh kenyataan bahwa dalam praktiknya, ketika mengidentifikasi penyebab degradasi sementara suatu aplikasi, data pada
distribusi relatif dari biaya waktu eksekusi antara komponen perangkat lunak dari aplikasi tersebut terutama relevan
. Dalam hal ini, pertanyaan tentang keakuratan data yang diperoleh memudar ke latar belakang.
Lampiran 1. Kode sumber untuk aplikasi demo
INITIALIZE_PROFILER int main(int argc, char * argv[]) {
Tambahan 2. Kode sumber aplikasi kontrol C # runtime bawaan