Pertanyaan : Mengapa org-map-entries
pencocokan properti sangat lambat, dan apa yang bisa saya lakukan untuk mempercepatnya?
Latar belakang : Saya memiliki penggunaan yang relatif sederhana untuk org-map-entries
: ambil upaya (dalam menit integer) dari semua entri agenda org dengan tag goal
dan prioritas yang diberikan (misalnya B
).
(org-map-entries
#'hw-org-get-effort-in-minutes
"goal+PRIORITY=\"B\""
'agenda)
Ini sangat lambat, mengambil lebih dari satu menit untuk file agenda baris ~ 12k saya.
Namun, jika saya menghapus PRIORITY
dari filter sehingga setiap goals
item yang ditandai dipilih, itu menyelesaikan hampir secara instan.
Saya juga dapat mengatur filter seperti goal/DONE
dan mereka selesai dengan sangat cepat, tetapi jika saya melakukan sesuatu seperti goals+EFFORT>0
kita kembali mengambil alih satu menit. Tampaknya properti pada umumnya sangat lambat untuk dicocokkan.
Saya menemukan solusi curang : Saya dapat mencocokkan properti di dalam fungsi yang dipetakan dengan sangat cepat org-entry-get
. Ketika saya melakukan ini, eksekusi kurang dari satu detik. Ini kelihatannya konyol, semoga ada cara yang lebih baik, tapi setidaknya berhasil!
Sudah mencoba : Sejak (benchmark 1000 (hw-org-effort-to-minutes "1:20"))
kembali "Elapsed time: 0.000019s"
, saya tidak berpikir fungsi saya berkontribusi banyak.
Menurut profiler
, ~ 40% dari waktu CPU digunakan oleh cond
, dengan ~ 29% berasal dari elemen parsing ( org-element--current-element
). Dua kontribusi terbesar berikutnya secara keseluruhan adalah 14% dan 13%, sehingga 40% dari cond
tampaknya menjadi bagian terbesar dari masalah. Tidak yakin mengapa elemen parsing akan dilakukan lebih sering dengan pencocokan properti, kecuali perbedaannya berasal dari parsing hanya header (tag, TODO) vs header + tubuh (properti).
sumber