Pregunta : ¿Por qué la org-map-entries
coincidencia de propiedades es tan lenta y qué puedo hacer para acelerarla?
Antecedentes : tengo un uso relativamente simple para org-map-entries
: tomar el esfuerzo (en minutos enteros) de todas las entradas de la agenda de la organización con etiqueta goal
y una prioridad dada (por ejemplo B
).
(org-map-entries
#'hw-org-get-effort-in-minutes
"goal+PRIORITY=\"B\""
'agenda)
Esto es terriblemente lento, toma más de un minuto para mi archivo de agenda de ~ 12k líneas.
Sin embargo, si elimino el PRIORITY
filtro para goals
que se seleccione cualquier elemento etiquetado, se completa casi al instante.
También puedo configurar filtros como goal/DONE
y se completan muy rápidamente, pero si hago algo así goals+EFFORT>0
, volveremos a tomar más de un minuto. Parece que las propiedades en general son muy lentas para igualar.
Encontré una solución alternativa : puedo hacer coincidir propiedades dentro de la función asignada muy rápidamente usando org-entry-get
. Cuando hago esto, la ejecución es menos de un segundo. Esto parece una tontería, espero que haya una mejor manera, ¡pero al menos funciona!
Ya lo intenté : desde que (benchmark 1000 (hw-org-effort-to-minutes "1:20"))
regresa "Elapsed time: 0.000019s"
, no creo que mi función contribuya mucho.
De acuerdo con profiler
, ~ 40% del tiempo de CPU es utilizado por cond
, con ~ 29% proveniente del análisis de elementos ( org-element--current-element
). Las siguientes dos contribuciones más grandes en general son 14% y 13%, por lo que el 40% cond
parece ser la mayor parte del problema. No estoy seguro de por qué el análisis de elementos se haría con más frecuencia con los emparejadores de propiedades, a menos que la diferencia provenga de analizar solo el encabezado (etiquetas, TODO) frente al encabezado + cuerpo (propiedades).
fuente