Since org-sidebar
uses it, it probably makes more sense for org-ql
to be the primary focus of the repo. But it also uses org-agenda-ng--format-element
, so org-agenda-ng
probably should be part of that package, too.
And maybe pick a single name for them…
deadline
- Be sure to explain how it works with regard to the implied date and
today
. date
,scheduled
- No implied date, but supports
today
.
- [ ]
category
- [ ] Any date
- e.g. it would search for timestamps (active/inactive?) anywhere in an entry
Because the existing ones only search the special date property line.
I think it should probably be enabled in most cases, to avoid missing results that users would expect to find, but it will reduce performance in some cases, so users should be able to turn it off when they don’t need it.
[2018-06-12 Tue 14:32] The docstring for org-map-entries
says:
If your function needs to retrieve the tags including inherited tags at the current entry, you can use the value of the variable ‘org-scanner-tags’ which will be much faster than getting the value with ‘org-get-tags-at’. If your function gets properties with ‘org-entry-properties’ at the current entry, bind ‘org-trust-scanner-tags’ to t around the call to ‘org-entry-properties’ to get the same speedup. Note that if your function moves around to retrieve tags and properties at a different entry, you cannot use these techniques.
Searching and matching could be sped up by constructing a regexp that searches directly to the next possible match, and then matching with predicate functions.
For example, a search like:
(org-ql (org-agenda-files)
(and (regexp "lisp")
(scheduled < today)))
Only entries that contain the word lisp
can be matches, and searching each entry for that word is wasteful. Instead, we could search the buffer for the next occurrence of lisp
, then check the scheduled date for that entry.
This would require processing the predicate to pull out matchers that can be done as buffer-wide regexps, e.g. regexp
, heading-regexp
, todo
, and possibly tags
. Org has some regexp-building functions that might make this fairly easy, and then we could probably use rx
to make an optimized version of the regexp. It would also require some refactoring to the searching that would go directly to regexp matches when possible, rather than checking every entry with the predicate.
- State “DONE” from [2018-05-10 Thu 15:02]
[2017-12-31 Sun 17:54] I wonder if, instead of parsing the whole buffer with org-element-parse-buffer
, we could simply work on a list of heading positions, e.g. a loop would search forward to the next heading position, then call whatever predicates it needed at the heading’s position, using save-excursion
around each function call. The predicates would need to be updated to get their data from the buffer, instead of using org-element-property
, but that wouldn’t be hard.
[2018-05-10 Thu 15:01] I already changed to using buffer-parsing predicates instead of org-element-parse-buffer
.
- State “DONE” from [2018-05-10 Thu 14:59]
If I made the date
selector a macro, I could avoid the need to quote the comparator.
Also, maybe instead of having a single date
selector, I should have scheduled
, deadline
, etc.
- State “DONE” from [2018-05-09 Wed 17:30]
elfeed-search--update-list
byte-compiles lambdas returned by elfeed-search-compile-filter
. Maybe I could do something like this too.
If I can get this working, I should profile it to see what difference it makes.
Going to try byte-compiling the predicate function:
(elp-profile 10 nil (org-agenda-ng "~/src/emacs/org-super-agenda/test/test.org"
(and (or (date :date '= (org-today))
(date :deadline '<= (+ org-deadline-warning-days (org-today)))
(date :scheduled '<= (org-today)))
(not (apply #'todo org-done-keywords-for-agenda)))))
Function | Times called | Total time | Average time |
---|---|---|---|
org-agenda-ng–agenda | 10 | 0.8370581039 | 0.0837058104 |
org-agenda-finalize-entries | 10 | 0.652886608 | 0.0652886608 |
org-super-agenda–filter-finalize-entries | 10 | 0.641794501 | 0.0641794501 |
org-super-agenda–group-items | 10 | 0.636057006 | 0.0636057006 |
org-super-agenda–group-dispatch | 130 | 0.631911849 | 0.0048608603 |
org-super-agenda–group-tag | 50 | 0.592883869 | 0.0118576773 |
list | 2720 | 0.5792795169 | 0.0002129704 |
mapcar | 331 | 0.2333591920 | 0.0007050126 |
org-agenda-ng–filter-buffer | 10 | 0.09247626 | 0.009247626 |
org-agenda-ng–format-element | 150 | 0.0649320479 | 0.0004328803 |
org-entry-get | 860 | 0.0408285349 | 4.747…e-05 |
org-agenda-ng–date-p | 910 | 0.0385646249 | 4.237…e-05 |
org-element-headline-parser | 150 | 0.0374417470 | 0.0002496116 |
org-is-habit-p | 270 | 0.0290107389 | 0.0001074471 |
org–property-local-values | 270 | 0.0268615979 | 9.948…e-05 |
org-get-property-block | 270 | 0.0244613309 | 9.059…e-05 |
org-get-tags-at | 150 | 0.017875864 | 0.0001191724 |
org-super-agenda–group-habit | 10 | 0.015910656 | 0.0015910655 |
mapc | 2540 | 0.0158616290 | 6.244…e-06 |
org-agenda-ng–add-faces | 150 | 0.0143329670 | 9.555…e-05 |
Now the same thing without byte-compiling:
(elp-profile 10 nil (org-agenda-ng "~/src/emacs/org-super-agenda/test/test.org"
(and (or (date :date '= (org-today))
(date :deadline '<= (+ org-deadline-warning-days (org-today)))
(date :scheduled '<= (org-today)))
(not (apply #'todo org-done-keywords-for-agenda)))))
Function | Times called | Total time | Average time |
---|---|---|---|
org-agenda-ng–agenda | 10 | 0.846645537 | 0.0846645537 |
org-agenda-finalize-entries | 10 | 0.662896805 | 0.0662896805 |
sort | 40 | 0.591123256 | 0.0147780814 |
org-entries-lessp | 400 | 0.5901201620 | 0.0014753004 |
mapcar | 201 | 0.2318270599 | 0.0011533684 |
org-agenda-ng–filter-buffer | 10 | 0.092519787 | 0.0092519787 |
org-super-agenda–filter-finalize-entries | 10 | 0.0664278040 | 0.0066427804 |
org-agenda-ng–format-element | 150 | 0.064658994 | 0.0004310599 |
org-super-agenda–group-items | 10 | 0.0602504089 | 0.0060250408 |
org-super-agenda–group-dispatch | 130 | 0.0561904470 | 0.0004322342 |
org-entry-get | 860 | 0.0437458889 | 5.086…e-05 |
org-agenda-ng–date-p | 910 | 0.0382623409 | 4.204…e-05 |
org-element-headline-parser | 150 | 0.0374662920 | 0.0002497752 |
org-is-habit-p | 270 | 0.0320861079 | 0.0001188374 |
org–property-local-values | 270 | 0.0298690430 | 0.0001106260 |
org-get-property-block | 270 | 0.0274716649 | 0.0001017469 |
org-super-agenda–group-habit | 10 | 0.019117901 | 0.0019117901 |
org-get-tags-at | 150 | 0.0178958930 | 0.0001193059 |
mapc | 2470 | 0.0150361130 | 6.087…e-06 |
org-agenda-ng–add-faces | 150 | 0.0143092169 | 9.539…e-05 |
Virtually indistinguishable. Going to try moving the byte-compile
call from the org-agenda-ng
macro to other places…
(elp-profile 10 nil (org-agenda-ng "~/src/emacs/org-super-agenda/test/test.org"
(and (or (date :date '= (org-today))
(date :deadline '<= (+ org-deadline-warning-days (org-today)))
(date :scheduled '<= (org-today)))
(not (apply #'todo org-done-keywords-for-agenda)))))
Function | Times called | Total time | Average time |
---|---|---|---|
org-agenda-ng–agenda | 10 | 0.8476316779 | 0.0847631678 |
mapcar | 331 | 0.8159452220 | 0.0024650913 |
org-agenda-ng–filter-buffer | 10 | 0.674217912 | 0.0674217912 |
org-element-headline-parser | 150 | 0.6171195889 | 0.0041141305 |
line-beginning-position | 620 | 0.5802579680 | 0.0009358999 |
org-agenda-finalize-entries | 10 | 0.082065157 | 0.0082065157 |
org-super-agenda–filter-finalize-entries | 10 | 0.0708772279 | 0.0070877227 |
org-super-agenda–group-items | 10 | 0.065523103 | 0.0065523103 |
org-agenda-ng–format-element | 150 | 0.0652783740 | 0.0004351891 |
org-super-agenda–group-dispatch | 130 | 0.0614253589 | 0.0004725027 |
org-entry-get | 860 | 0.0494023029 | 5.744…e-05 |
org-agenda-ng–date-p | 910 | 0.0388435519 | 4.268…e-05 |
org-is-habit-p | 270 | 0.0375687549 | 0.0001391435 |
org–property-local-values | 270 | 0.0353892929 | 0.0001310714 |
org-get-property-block | 270 | 0.0329700440 | 0.0001221112 |
org-super-agenda–group-habit | 10 | 0.024468601 | 0.0024468601 |
re-search-backward | 1500 | 0.0186344089 | 1.242…e-05 |
org-get-tags-at | 150 | 0.0180038809 | 0.0001200258 |
mapc | 2540 | 0.0156518099 | 6.162…e-06 |
org-agenda-ng–add-faces | 150 | 0.0144141080 | 9.609…e-05 |
Doesn’t seem to make any difference.
(org-agenda-ng org-agenda-files
(and (or (date :deadline '<= (org-today))
(date :scheduled '<= (org-today)))
(not (apply #'todo org-done-keywords-for-agenda)))
((group (tags "bills"))
(group (todo "SOMEDAY"))))
(org-agenda-ng org-agenda-files
(and (or (date :deadline '<= (org-today))
(date :scheduled '<= (org-today)))
(not (apply #'todo org-done-keywords-for-agenda))))
(org-agenda-ng "~/org/main.org"
(and (or (date :deadline '<= (org-today))
(date :scheduled '<= (org-today)))
(not (apply #'todo org-done-keywords-for-agenda))))
(org-ql org-agenda-files
(and (todo "SOMEDAY")
(tags "Emacs")))
(org-ql org-agenda-files
(and (todo "SOMEDAY")
(tags "Emacs")
(priority >= "B")))
(org-ql "~/org/main.org"
(and (or (tags "Emacs")
(priority >= "B"))
(not (done))))
(org-ql "~/org/main.org"
(and (or (tags "Emacs")
(priority >= "B"))
(done)))
(org-ql "~/src/emacs/org-super-agenda/test/test.org"
(regexp "over")
:sort (priority deadline scheduled))
(org-ql "~/src/emacs/org-super-agenda/test/test.org"
(regexp "over")
:sort (date))
(org-ql "~/src/emacs/org-super-agenda/test/test.org"
(todo)
:sort (todo))
(org-ql "~/src/emacs/org-super-agenda/test/test.org"
(regexp "over"))
(org-agenda-ng "~/src/emacs/org-super-agenda/test/test.org"
(regexp "over"))
(org-agenda-ng "~/src/emacs/org-super-agenda/test/test.org"
(property "agenda-group"))
(org-agenda-ng "~/src/emacs/org-super-agenda/test/test.org"
(property "agenda-group" "plans"))
(org-super-agenda--test-with-org-today-date "2017-07-08 00:00"
(org-agenda-ng "~/src/emacs/org-super-agenda/test/test.org"
(and (or (date = today)
(deadline <=)
(scheduled <= today))
(not (done)))))
This basically works, as a very basic kind of agenda view, but we can already see that it’s much slower (at least, for single-day views) because org-element-parse-buffer
is slow compared to the agenda code.
[2018-05-10 Thu 15:03] Note: This is the old, much slower code that used org-element-parse-buffer
.
(defmacro elp-profile (times prefixes &rest body)
(declare (indent defun))
(let ((prefixes (append '(org- string- s- buffer- append delq map
list car save- outline- delete-dups
sort line- nth concat char-to-string
rx- goto- when search- re-)
prefixes)))
`(let (output)
(dolist (prefix ',prefixes)
(elp-instrument-package (symbol-name prefix)))
(dotimes (x ,times)
,@body)
(elp-results)
(elp-restore-all)
(point-min)
(forward-line 20)
(delete-region (point) (point-max))
(setq output (buffer-substring-no-properties (point-min) (point-max)))
(kill-buffer)
(delete-window)
(let ((rows (s-lines output)))
(append (list (list "Function" "Times called" "Total time" "Average time")
'hline)
(cl-loop for row in rows
collect (s-split (rx (1+ space)) row 'omit-nulls)))))))
[2018-05-09 Wed 17:31] Note: I seem to have misplaced the org-agenda-ng--test-agenda-today
function I used in these tests.
(elp-profile 1 (org-agenda-ng--test-agenda-today))
Make sure to kill any existing agenda buffers first.
(elp-profile 1 (org-agenda-list nil nil 'week))
(elp-profile 1 (with-current-buffer (find-buffer-visiting "~/org/main.org")
(org-element-parse-buffer 'headline)))
(defmacro elp-profile (times &rest body)
(declare (indent defun))
`(let ((prefixes '("org-" "string-" "s-" "buffer-" "append" "delq" "map"
"list" "car" "save-" "outline-" "delete-dups"
"sort" "line-" "nth" "concat" "char-to-string"
"rx-" "goto-" "when" "search-" "re-"))
output)
(dolist (prefix prefixes)
(elp-instrument-package prefix))
(dotimes (x ,times)
,@body)
(elp-results)
(elp-restore-all)
(point-min)
(forward-line 20)
(delete-region (point) (point-max))
(setq output (buffer-substring-no-properties (point-min) (point-max)))
(kill-buffer)
(delete-window)
output))
Make sure to kill any existing agenda buffers first.
(elp-profile 1 (org-agenda-list nil nil 'week))
(elp-profile 5 (org-agenda-ng--test-agenda-today))
(elp-profile 5 (org-agenda-ng--test-agenda-today))
[2018-05-10 Thu 12:59] Turned on org-trust-scanner-tags
, going to try profiling again:
;; (elp-profile 1 nil (org-agenda-ng "~/src/emacs/org-super-agenda/test/test.org"
;; (tags "world")))
(elp-profile 10 nil (org-agenda-ng org-agenda-files
(tags "Emacs")))
Function | Times called | Total time | Average time |
---|---|---|---|
org-agenda-ng–agenda | 10 | 44.092598282 | 4.4092598282 |
mapcar | 282 | 40.234516707 | 0.1426755911 |
org-agenda-ng–filter-buffer | 80 | 26.895492471 | 0.3361936558 |
org-element-headline-parser | 3980 | 10.387614362 | 0.0026099533 |
org-agenda-finalize-entries | 10 | 9.194458252 | 0.9194458252 |
org-agenda-ng–tags-p | 70250 | 8.1897379849 | 0.0001165799 |
org-agenda-ng–format-element | 3980 | 6.5944325679 | 0.0016568926 |
outline-next-heading | 70320 | 6.1190180490 | 8.701…e-05 |
re-search-forward | 97050 | 5.8706467829 | 6.049…e-05 |
org-get-tags-at | 74230 | 5.4078158059 | 7.285…e-05 |
org-super-agenda–filter-finalize-entries | 10 | 5.2320123400 | 0.5232012340 |
org-super-agenda–group-items | 10 | 5.1260959210 | 0.5126095921 |
org-super-agenda–group-dispatch | 130 | 5.119333624 | 0.0393794894 |
sort | 20 | 3.8204368569 | 0.1910218428 |
org-element–parse-objects | 6180 | 3.5386578929 | 0.0005725983 |
org-is-habit-p | 5970 | 3.2497755920 | 0.0005443510 |
org-entry-get | 5970 | 3.2347964049 | 0.0005418419 |
org–property-local-values | 5970 | 3.1796357319 | 0.0005326023 |
org-get-property-block | 5970 | 3.0767919680 | 0.0005153755 |
org-entries-lessp | 20020 | 2.6563960079 | 0.0001326871 |
Now trying again without it:
;; (elp-profile 1 nil (org-agenda-ng "~/src/emacs/org-super-agenda/test/test.org"
;; (tags "world")))
(elp-profile 10 nil (org-agenda-ng org-agenda-files
(tags "Emacs")))
Function | Times called | Total time | Average time |
---|---|---|---|
mapcar | 1791 | 57.096304538 | 0.0318795670 |
org-agenda-ng–agenda | 10 | 54.232133506 | 5.4232133505 |
org-agenda-ng–filter-buffer | 80 | 30.065167040 | 0.3758145880 |
org-get-tags-at | 74230 | 13.840202495 | 0.0001864502 |
org-agenda-ng–format-element | 3980 | 13.429297797 | 0.0033741954 |
org-element-headline-parser | 3980 | 12.771776652 | 0.0032089891 |
org-agenda-finalize-entries | 10 | 9.1439433990 | 0.9143943399 |
org-agenda-ng–tags-p | 70250 | 9.0249653730 | 0.0001284692 |
org-super-agenda–filter-finalize-entries | 10 | 7.300515859 | 0.7300515859 |
outline-next-heading | 70320 | 7.2384435649 | 0.0001029357 |
org-super-agenda–group-items | 10 | 4.918585855 | 0.4918585855 |
org-super-agenda–group-dispatch | 130 | 4.9125893509 | 0.0377891488 |
re-search-forward | 101020 | 4.6294823850 | 4.582…e-05 |
org-up-heading-safe | 7370 | 4.4629885620 | 0.0006055615 |
org-is-habit-p | 5960 | 4.2772351910 | 0.0007176569 |
org-entry-get | 5960 | 4.2595350800 | 0.0007146870 |
org-super-agenda–group-tag | 50 | 3.8942044929 | 0.0778840898 |
re-search-backward | 26150 | 3.3660083490 | 0.0001287192 |
org–property-local-values | 5960 | 3.1793476329 | 0.0005334475 |
org-get-property-block | 5960 | 3.0662425979 | 0.0005144702 |
Wow, using org-trust-scanner-tags
saves a lot of time.
(elp-profile 5 (org-agenda-ng--agenda
:files org-agenda-files
:pred (lambda ()
(and (org-agenda-ng--todo-p)
(or (org-agenda-ng--date-p :deadline '<= (org-today))
(org-agenda-ng--date-p :scheduled '<= (org-today)))
(not (apply #'org-agenda-ng--todo-p org-done-keywords-for-agenda))))))
(elp-profile 5 (org-agenda-ng--agenda
:files org-agenda-files
:pred (lambda ()
(and (todo)
(or (date :deadline '<= (org-today))
(date :scheduled '<= (org-today)))
(not (apply #'todo org-done-keywords-for-agenda))))))
This shows that the difference between them, if any, is so small as to be irrelevant. The convenience and clarity are a big win.
(elp-profile 5 (org-agenda-ng--agenda
:files "~/org/main.org"
:pred (lambda ()
(and (org-agenda-ng--todo-p)
(or (org-agenda-ng--date-p :deadline '<= (org-today))
(org-agenda-ng--date-p :scheduled '<= (org-today)))
(not (apply #'org-agenda-ng--todo-p org-done-keywords-for-agenda))))))
(elp-profile 5 (org-agenda-ng--agenda
:files "~/org/main.org"
:pred (lambda ()
(and (todo)
(or (date :deadline '<= (org-today))
(date :scheduled '<= (org-today)))
(not (apply #'todo org-done-keywords-for-agenda))))))
(elp-profile 1 nil
(org-agenda-ng "~/org/main.org"
(tags "computer")))
Function | Times called | Total time | Average time |
---|---|---|---|
mapcar | 4217 | 12.612716455 | 0.0029909216 |
org-agenda-ng–agenda | 1 | 9.721410651 | 9.721410651 |
org-get-tags-at | 1845 | 7.4793860389 | 0.0040538677 |
org-up-heading-safe | 9361 | 6.4622674019 | 0.0006903394 |
re-search-backward | 25001 | 5.3399866239 | 0.0002135909 |
org-agenda-ng–filter-buffer | 1 | 4.874598854 | 4.874598854 |
org-agenda-ng–tags-p | 1238 | 4.8067623430 | 0.0038826836 |
org-agenda-ng–format-element | 607 | 3.6325626609 | 0.0059844524 |
org-outline-level | 17484 | 1.0298924459 | 5.890…e-05 |
org-add-props | 2074 | 0.8305549259 | 0.0004004604 |
org-element-headline-parser | 607 | 0.2092664829 | 0.0003447553 |
org-back-to-heading | 11813 | 0.1252112960 | 1.059…e-05 |
outline-back-to-heading | 11813 | 0.1100693780 | 9.317…e-06 |
org-end-of-subtree | 607 | 0.0721986340 | 0.0001189433 |
outline-on-heading-p | 11813 | 0.0675261030 | 5.716…e-06 |
outline-next-heading | 1239 | 0.0627980999 | 5.068…e-05 |
re-search-forward | 3273 | 0.0612446620 | 1.871…e-05 |
org-agenda-finalize-entries | 1 | 0.041846274 | 0.041846274 |
buffer-substring-no-properties | 6329 | 0.0308716979 | 4.877…e-06 |
line-end-position | 903 | 0.0280484950 | 3.106…e-05 |
(elp-profile 1 nil
(org-agenda-ng "~/org/main.org"
(tags "computer")))
Function | Times called | Total time | Average time |
---|---|---|---|
mapcar | 4217 | 12.580246839 | 0.0029832219 |
org-agenda-ng–agenda | 1 | 8.777776059 | 8.777776059 |
org-get-tags-at | 1845 | 8.2853503299 | 0.0044907047 |
org-up-heading-safe | 9361 | 7.2710981889 | 0.0007767437 |
re-search-backward | 25001 | 5.3360082060 | 0.0002134317 |
org-agenda-ng–filter-buffer | 1 | 4.865602689 | 4.865602689 |
org-agenda-ng–tags-p | 1238 | 4.7983754310 | 0.0038759090 |
org-agenda-ng–format-element | 607 | 3.6273825100 | 0.0059759184 |
org-outline-level | 17484 | 1.0284417919 | 5.882…e-05 |
org-back-to-heading | 11813 | 0.9390534479 | 7.949…e-05 |
org-split-string | 4940 | 0.833825087 | 0.0001687905 |
string-match | 9102 | 0.8231629100 | 9.043…e-05 |
org-element-headline-parser | 607 | 0.2034305819 | 0.0003351409 |
outline-back-to-heading | 11813 | 0.1096120189 | 9.278…e-06 |
org-end-of-subtree | 607 | 0.0710802559 | 0.0001171009 |
outline-on-heading-p | 11813 | 0.0670029359 | 5.671…e-06 |
outline-next-heading | 1239 | 0.0622323519 | 5.022…e-05 |
re-search-forward | 3273 | 0.0603102519 | 1.842…e-05 |
org-agenda-finalize-entries | 1 | 0.037286496 | 0.037286496 |
buffer-substring-no-properties | 6329 | 0.0285818689 | 4.516…e-06 |
(elp-profile 1 nil
(with-current-buffer "main.org"
(org-tags-view nil "computer")))
Function | Times called | Total time | Average time |
---|---|---|---|
org-tags-view | 1 | 2.620578129 | 2.620578129 |
org-scan-tags | 1 | 1.448883817 | 1.448883817 |
org-agenda-format-item | 607 | 0.9273893060 | 0.0015278242 |
org-add-props | 2042 | 0.8877267209 | 0.0004347339 |
org-agenda-finalize | 1 | 0.144506782 | 0.144506782 |
re-search-forward | 2154 | 0.1367046650 | 6.346…e-05 |
string-match | 8742 | 0.1002517259 | 1.146…e-05 |
org-get-priority | 607 | 0.0961996220 | 0.0001584837 |
org-agenda-align-tags | 1 | 0.095166495 | 0.095166495 |
org-agenda-prepare | 1 | 0.081724472 | 0.081724472 |
org-outline-level | 1246 | 0.0771033170 | 6.188…e-05 |
org-agenda-finalize-entries | 1 | 0.071707404 | 0.071707404 |
org-agenda-prepare-buffers | 1 | 0.057903921 | 0.057903921 |
org-get-heading | 607 | 0.0517784369 | 8.530…e-05 |
mapcar | 3738 | 0.0418641110 | 1.119…e-05 |
org-agenda-highlight-todo | 607 | 0.0273123070 | 4.499…e-05 |
mapconcat | 609 | 0.024743305 | 4.062…e-05 |
sort | 2 | 0.02117069 | 0.010585345 |
org-activate-plain-links | 132 | 0.0203558980 | 0.0001542113 |
org-activate-bracket-links | 78 | 0.0198589680 | 0.0002546021 |
[2018-05-10 Thu 15:02] I think these are decent improvements.
(elp-profile 1 nil (org-agenda-ng "~/org/main.org"
(or (habit)
(and (or (date '= (org-today))
(deadline '<=)
(scheduled '<= (org-today)))
(not (apply #'todo org-done-keywords-for-agenda)))
(and (todo "DONE" "CANCELLED")
(closed '= (org-today))))))
Function | Times called | Total time | Average time |
---|---|---|---|
mapcar | 164 | 1.5004585290 | 0.0091491373 |
org-agenda-ng–agenda | 1 | 1.348231247 | 1.348231247 |
org-agenda-ng–filter-buffer | 1 | 1.1391189879 | 1.1391189879 |
org-agenda-ng–date-plain-p | 1267 | 0.6198571040 | 0.0004892321 |
org-entry-get | 3983 | 0.2979337370 | 7.480…e-05 |
org-is-habit-p | 1365 | 0.2049101109 | 0.0001501172 |
org–property-local-values | 1365 | 0.1940614150 | 0.0001421695 |
org-agenda-ng–habit-p | 1272 | 0.1911009179 | 0.0001502365 |
org-agenda-ng–format-element | 52 | 0.177965411 | 0.0034224117 |
org-get-property-block | 1365 | 0.1760004519 | 0.0001289380 |
org-get-tags-at | 52 | 0.1362824969 | 0.0026208172 |
org-agenda-ng–date-p | 3880 | 0.1351176629 | 3.482…e-05 |
org-up-heading-safe | 226 | 0.1276747609 | 0.0005649325 |
re-search-backward | 2028 | 0.1144211070 | 5.642…e-05 |
org-entry-properties | 2618 | 0.0848660999 | 3.241…e-05 |
org-agenda-ng–todo-p | 1319 | 0.081952653 | 6.213…e-05 |
org-get-todo-state | 1319 | 0.0796836810 | 6.041…e-05 |
re-search-forward | 3754 | 0.0739803739 | 1.970…e-05 |
org-inlinetask-in-task-p | 1365 | 0.0657829330 | 4.819…e-05 |
org-agenda-ng–scheduled-p | 1247 | 0.0619497850 | 4.967…e-05 |