Pergunta : Por que a org-map-entries
correspondência de propriedades é tão lenta e o que posso fazer para acelerar isso?
Antecedentes : Eu tenho um uso relativamente simples para org-map-entries
: agarre o esforço (em minutos inteiros) de todas as entradas da agenda organizacional com tag goal
e uma determinada prioridade (por exemplo B
).
(org-map-entries
#'hw-org-get-effort-in-minutes
"goal+PRIORITY=\"B\""
'agenda)
Isso é muito lento, levando mais de um minuto para o meu arquivo de agenda de ~ 12k linhas.
No entanto, se eu remover o PRIORITY
filtro para goals
selecionar qualquer item marcado, ele será concluído quase instantaneamente.
Também posso definir filtros como goal/DONE
e eles são concluídos muito rapidamente, mas se eu fizer algo como goals+EFFORT>0
voltaremos a demorar um minuto. Parece que as propriedades em geral são muito lentas para combinar.
Encontrei uma solução alternativa para truques : posso combinar propriedades dentro da função mapeada muito rapidamente usando org-entry-get
. Quando faço isso, a execução é menor que um segundo. Isso parece bobagem, espero que exista uma maneira melhor, mas pelo menos funciona!
Já tentei : desde (benchmark 1000 (hw-org-effort-to-minutes "1:20"))
retornos "Elapsed time: 0.000019s"
, acho que minha função não contribui muito.
De acordo com profiler
, ~ 40% do tempo da CPU é usado cond
, com ~ 29% vindo da análise de elementos ( org-element--current-element
). As próximas duas maiores contribuições em geral são 14% e 13%, portanto, 40% cond
parece ser a maior parte do problema. Não sei por que a análise de elementos seria feita com mais frequência com correspondentes de propriedades, a menos que a diferença ocorra apenas na análise de cabeçalho (tags, TODO) vs. cabeçalho + corpo (propriedades).