Bagaimana cara mengukur kinerja kode elisp saya? Alat / paket eksternal apa yang tersedia bagi saya untuk mengukur waktu yang dibutuhkan?
Selain total waktu, dapatkah saya melihat profil yang menunjukkan waktu yang diambil per fungsi? Bisakah saya profil penggunaan memori juga?
performance
benchmarking
Wilfred Hughes
sumber
sumber
benchmark
dan profiler tidak mengukur kinerja Emacs . Ini mengukur kinerja mengevaluasi ekspresi tertentu. Sangat membantu dalam membandingkan kinerja dalam Emacs. Untuk mengukur kinerja Emacs sendiri, Anda perlu membandingkannya dengan kinerja selain Emacs. Dan di situlah keluasan Emacs ikut bermain. Anda dapat mengukur Emacs vs XYZ untuk ini atau itu, tetapi untuk mengukur kinerja Emacs secara keseluruhan, Anda perlu beberapa perbandingan seperti itu.Jawaban:
Tolok ukur
Opsi yang paling mudah adalah
benchmark
paket bawaan. Penggunaannya sangat sederhana:Diisi otomatis, jadi Anda bahkan tidak perlu memerlukannya.
Pembuatan profil
Benchmark bagus dalam pengujian keseluruhan, tetapi jika Anda mengalami masalah kinerja, itu tidak memberi tahu Anda fungsi mana yang menyebabkan masalah. Untuk itu, Anda memiliki profiler (juga built-in) .
M-x profiler-start
.M-x profiler-report
.Anda harus dibawa ke buffer dengan pohon panggilan fungsi yang dapat dinavigasi.
sumber
benchmark
fungsi sepertinya tidak berfungsi: ketika saya melakukannya di dalam.c
file yang dibuka(benchmark 100 (c-font-lock-fontify-region 0 17355))
, saya terus mendapatkanvoid-function jit-lock-bounds
.benchmark
ada fungsibenchmark-run
danbenchmark-run-compiled
. Bagi saya perbedaan utamanya adalah kedua fungsi tersebut benar-benar berfungsi (lihat komentar sebelumnya) : ЬSelain jawaban @ Malabara, saya cenderung menggunakan
with-timer
makro yang dibuat khusus untuk secara permanen instrumen berbagai bagian kode saya (misalnyainit.el
file saya ).Perbedaannya adalah bahwa sementara
benchmark
memungkinkan untuk mempelajari kinerja sedikit kode spesifik yang Anda instrumenkan,with-timer
selalu memberi Anda waktu yang dihabiskan di setiap bagian kode yang diinstrumentasi (tanpa banyak biaya overhead untuk bagian yang cukup besar), yang memberi Anda masukan untuk mengetahui bagian mana yang harus diselidiki lebih lanjut.Contoh penggunaan:
menghasilkan output berikut dalam
*Messages*
buffer:Saya harus menyebutkan bahwa ini sangat terinspirasi oleh
use-package-with-elapsed-timer
makro Jon Wiegley dalamuse-package
ekstensi yang luar biasa .sumber
emacs-init-time
.esup
dan saya menyukainya. Tetapi sekali lagi, minat hal sepertiwith-timer
itu tidak begitu banyak untuk profil sesuatu yang sama sekali. Minat sebenarnya adalah bahwa Anda selalu memiliki informasi profil. Setiap kali saya memulai emacs, saya memiliki baris di*Messages*
buffer saya yang memberitahu saya bagian mana yang memakan waktu berapa lama. Jika saya mendeteksi sesuatu yang tidak normal, saya dapat menggunakan alat yang lebih memadai untuk membuat profil dan mengoptimalkan berbagai hal.emacs-init-time
memang menghasilkan informasi yang menarik. Namun, itu hanya memberikan waktu berlalu yang inklusif, tanpa kemungkinan untuk memecah bagian individu dari inisialisasi.Selain jawaban @ Malabarba, perhatikan bahwa Anda dapat mengukur waktu eksekusi yang dikompilasi dengan kode Anda
benchmark-run-compiled
. Metrik itu seringkali jauh lebih relevan daripada waktu eksekusi yang ditafsirkan yangM-x benchmark
memberi Anda:Tiga angka tersebut adalah total waktu yang telah berlalu, jumlah GC yang berjalan, dan waktu yang dihabiskan dalam GC.
sumber
Benchmarking bukan hanya tentang mendapatkan angka, tetapi juga tentang membuat keputusan berdasarkan analisis hasil.
Ada paket benchstat.el pada MELPA yang dapat Anda gunakan untuk mendapatkan fitur yang disediakan oleh program benchstat .
Ini mengimplementasikan pembandingan berbasis perbandingan tempat Anda menguji
X
properti kinerjaY
.Fungsi Benchstat dapat dilihat sebagai
benchmark-run-compiled
pembungkus yang tidak hanya mengumpulkan informasi, tetapi juga mengembalikannya dalam format interpretasi yang mudah dibaca. Itu termasuk:X
danY
Contoh penggunaan yang sangat sederhana:
Surat
benchstat-compare
wasiat akan menghasilkan buffer sementara:Anda akan membutuhkan
benchstat
program biner. Jika Anda menggunakan bahasa pemrograman Go, kemungkinan besar Anda sudah memilikinya di sistem. Kalau tidak, ada opsi untuk mengkompilasinya dari sumber.Biner terkompilasi untuk linux / amd64 dapat ditemukan di halaman rilis github .
sumber