* [PATCH] Speed up org-diary
@ 2010-03-28 18:12 Matt Lundin
2010-03-29 12:20 ` Carsten Dominik
0 siblings, 1 reply; 3+ messages in thread
From: Matt Lundin @ 2010-03-28 18:12 UTC (permalink / raw)
To: Org Mode
[-- Attachment #1: Type: text/plain, Size: 3082 bytes --]
Hi Carsten,
Thanks to the new variable org-agenda-entry-types, I have moved all my
appointments from emacs diary into org-mode. It is now quite fast to
pull up weekly and monthly calendars with a custom agenda command.
The missing piece of the puzzle is integration with "diary" and
"cal-tex" functions via the org-diary sexp. I have found org-diary to be
excruciatingly slow when called for anything more than a couple of days.
I have the following line in my diary file:
&%%(org-diary :timestamp :sexp)
If I try to view 20 or so upcoming days in the diary by typing C-u 20 d
on a date in the calendar, it can take upwards of 30 seconds to generate
the diary display. This is of little consequence, since I can, after
all, simply use the custom agenda command. But I often want to print out
a nice LaTeX calendar of my appointments with cal-tex-cursor-month. And
that takes upwards of 50 seconds (see attached elp-results file).
Judging from the elp-results, the culprit seems to be
org-prepare-agenda-buffers (46 seconds), which is called 31 times (once
for each day). It seems to me that since org-diary is being called 31
times in quick succession by the same function (diary-sexp-entry), one
should only need to call org-prepare-agenda-buffers once.
The only solution I could see to this problem was to add a test to see
if org-diary had been called less than 1 second ago. Thus, I added the
variable org-diary-last-run-time and a conditional in org-diary that
only runs org-prepare-agenda-buffers if org-diary-last-run-time is less
than 1 second in the past.
With the patch, it now takes appr. 5 seconds to generate the LaTeX
calendar with cal-tex and org-prepare-agenda-buffers is called only
once.
--8<---------------cut here---------------start------------->8---
diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index 797728b..6179907 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -4086,6 +4086,8 @@ Needed to avoid empty dates which mess up holiday display."
(apply 'diary-add-to-list args)
(apply 'add-to-diary-list args)))
+(defvar org-diary-last-run-time nil)
+
;;;###autoload
(defun org-diary (&rest args)
"Return diary information from org-files.
@@ -4123,8 +4125,14 @@ function from a program - use `org-agenda-get-day-entries' instead."
(let* ((files (if (and entry (stringp entry) (string-match "\\S-" entry))
(list entry)
(org-agenda-files t)))
+ (time (org-float-time))
file rtn results)
- (org-prepare-agenda-buffers files)
+ (when (or (not org-diary-last-run-time)
+ (> (- time
+ org-diary-last-run-time)
+ 1))
+ (org-prepare-agenda-buffers files))
+ (setq org-diary-last-run-time time)
;; If this is called during org-agenda, don't return any entries to
;; the calendar. Org Agenda will list these entries itself.
(if org-disable-agenda-to-diary (setq files nil))
--8<---------------cut here---------------end--------------->8---
Thanks for looking at this. I'm eager to know if there is a more elegant
way of accomplishing the same thing.
- Matt
[-- Attachment #2: elp-results --]
[-- Type: text/plain, Size: 8888 bytes --]
cal-tex-cursor-month 1 50.220853 50.220853
cal-tex-list-diary-entries 1 48.950022 48.950022
diary-list-entries 1 48.949987 48.949987
diary-list-sexp-entries 31 48.934395 1.5785288709
diary-sexp-entry 31 48.916153000 1.5779404193
org-diary 31 48.914679 1.5778928709
org-prepare-agenda-buffers 31 46.019204000 1.4844904516
org-agenda-get-day-entries 868 2.644963 0.0030471923
org-refresh-category-properties 868 2.3602110000 0.0027191370
org-agenda-get-timestamps 868 1.0062780000 0.0011593064
org-agenda-get-sexps 868 0.8682250000 0.0010002592
org-end-of-subtree 1426 0.7195369999 0.0005045841
org-agenda-get-blocks 868 0.5283550000 0.0006087039
org-get-agenda-file-buffer 1736 0.4188759999 0.0002412880
org-back-to-heading 2826 0.2957579999 0.0001046560
org-diary-sexp-entry 620 0.209813 0.0003384080
org-parse-time-string 1710 0.1728869999 0.0001011035
org-format-agenda-item 71 0.161254 0.0022711830
org-time-string-to-time 434 0.1496349999 0.0003447811
org-time-string-to-absolute 1276 0.1480890000 0.0001160572
org-find-base-buffer-visiting 1736 0.1476030000 8.502...e-05
diary-anniversary 465 0.1349429999 0.0002901999
org-before-change-function 1302 0.1321850000 0.0001015245
org-get-time-of-day 149 0.1294050000 0.0008684899
org-agenda-files 31 0.1266870000 0.0040866774
org-closest-date 1276 0.1155559999 9.056...e-05
org-at-date-range-p 1386 0.1094259999 7.895...e-05
org-finalize-agenda-entries 26 0.1068299999 0.0041088461
org-entries-lessp 73 0.1007950000 0.0013807534
org-check-agenda-file 868 0.0899190000 0.0001035933
org-uniquify 62 0.0846519999 0.0013653548
org-date-to-gregorian 2552 0.0658019999 2.578...e-05
org-agenda-skip 2246 0.0605190000 2.694...e-05
org-calendar-holiday 31 0.041807 0.0013486129
org-trim 2263 0.0414180000 1.830...e-05
org-get-todo-state 263 0.0411600000 0.0001565019
cal-tex-insert-days 1 0.033083 0.033083
org-on-heading-p 403 0.0228089999 5.659...e-05
cal-tex-end-document 1 0.01942 0.01942
org-outline-level 1522 0.0151009999 9.921...e-06
diary-pull-attrs 58 0.0142740000 0.0002461034
org-get-effort 71 0.0136870000 0.0001927746
org-entry-get 71 0.012828 0.0001806760
diary-list-entries-2 31 0.012181 0.0003929354
cal-tex-arg 135 0.0113300000 8.392...e-05
diary-block 274 0.0108729999 3.968...e-05
cal-tex-latexify-list 62 0.0105160000 0.0001696129
org-get-property-block 71 0.0099130000 0.0001396197
org-get-tags-at 38 0.0093790000 0.0002468157
cal-tex-LaTeXify-string 70 0.0089039999 0.0001271999
org-get-priority 38 0.0058529999 0.0001540263
org-up-heading-safe 67 0.0045239999 6.752...e-05
cal-tex-comment 57 0.0044230000 7.759...e-05
diary-make-date 1013 0.0035599999 3.514...e-06
cal-tex-insert-preamble 1 0.00313 0.00313
org-agenda-highlight-todo 71 0.002797 3.939...e-05
cal-tex-cmd 11 0.002558 0.0002325454
org-add-props 199 0.0025159999 1.264...e-05
org-compile-prefix-format 31 0.0020719999 6.683...e-05
org-agenda-new-marker 109 0.0020570000 1.887...e-05
cal-tex-list-holidays 1 0.00142 0.00142
cal-tex-insert-day-names 1 0.00133 0.00133
cal-tex-month-name 33 0.0011330000 3.433...e-05
org-float-time 140 0.0007870000 5.621...e-06
cal-tex-nl 5 0.0007859999 0.0001571999
org-remove-uniherited-tags 38 0.0007720000 2.031...e-05
org-downcase-keep-props 113 0.0007170000 6.345...e-06
cal-tex-preamble 1 0.000525 0.000525
cal-tex-insert-blank-days-at-end 1 0.000479 0.000479
org-delete-all 38 0.000337 8.868...e-06
org-get-category 71 0.0003360000 4.732...e-06
cal-tex-insert-month-header 1 0.000335 0.000335
org-agenda-fix-displayed-tags 71 0.0003129999 4.408...e-06
cal-tex-e-document 1 0.00028 0.00028
diary-add-to-list 31 0.0002730000 8.806...e-06
cal-tex-vspace 1 0.000266 0.000266
cal-tex-b-document 1 0.000264 0.000264
cal-tex-hfill 4 0.0002549999 6.374...e-05
cal-tex-insert-blank-days 1 0.000237 0.000237
org-set-sorting-strategy 31 0.0001240000 4.000...e-06
org-agenda-reset-markers 2 9.400...e-05 4.700...e-05
cal-tex-first-blank-p 1 8.5e-05 8.5e-05
cal-tex-last-blank-p 1 7.1e-05 7.1e-05
org-defkey 2 3.8e-05 1.9e-05
org-get-todo-face 1 2.2e-05 2.2e-05
cal-tex-number-weeks 1 1.9e-05 1.9e-05
diary-ordinal-suffix 3 1.300...e-05 4.333...e-06
org-key 2 6e-06 3e-06
org-face-from-face-or-color 1 4e-06 4e-06
[-- Attachment #3: Type: text/plain, Size: 201 bytes --]
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] Speed up org-diary
2010-03-28 18:12 [PATCH] Speed up org-diary Matt Lundin
@ 2010-03-29 12:20 ` Carsten Dominik
2010-03-29 14:17 ` Matthew Lundin
0 siblings, 1 reply; 3+ messages in thread
From: Carsten Dominik @ 2010-03-29 12:20 UTC (permalink / raw)
To: Matt Lundin; +Cc: Org Mode
Hi Matt,
that is a good catch. org-diary is a total orphan for me,
I have not looked at this function for 5 years - it was written
when I was still thinking to use Org-files through the Emacs diary.
I have made one change - I have given it 3 seconds instead of 1,
I think this is a better value.
- Carsten
On Mar 28, 2010, at 8:12 PM, Matt Lundin wrote:
> Hi Carsten,
>
> Thanks to the new variable org-agenda-entry-types, I have moved all my
> appointments from emacs diary into org-mode. It is now quite fast to
> pull up weekly and monthly calendars with a custom agenda command.
>
> The missing piece of the puzzle is integration with "diary" and
> "cal-tex" functions via the org-diary sexp. I have found org-diary
> to be
> excruciatingly slow when called for anything more than a couple of
> days.
> I have the following line in my diary file:
>
> &%%(org-diary :timestamp :sexp)
>
> If I try to view 20 or so upcoming days in the diary by typing C-u
> 20 d
> on a date in the calendar, it can take upwards of 30 seconds to
> generate
> the diary display. This is of little consequence, since I can, after
> all, simply use the custom agenda command. But I often want to print
> out
> a nice LaTeX calendar of my appointments with cal-tex-cursor-month.
> And
> that takes upwards of 50 seconds (see attached elp-results file).
>
> Judging from the elp-results, the culprit seems to be
> org-prepare-agenda-buffers (46 seconds), which is called 31 times
> (once
> for each day). It seems to me that since org-diary is being called 31
> times in quick succession by the same function (diary-sexp-entry), one
> should only need to call org-prepare-agenda-buffers once.
>
> The only solution I could see to this problem was to add a test to see
> if org-diary had been called less than 1 second ago. Thus, I added the
> variable org-diary-last-run-time and a conditional in org-diary that
> only runs org-prepare-agenda-buffers if org-diary-last-run-time is
> less
> than 1 second in the past.
>
> With the patch, it now takes appr. 5 seconds to generate the LaTeX
> calendar with cal-tex and org-prepare-agenda-buffers is called only
> once.
>
> --8<---------------cut here---------------start------------->8---
> diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
> index 797728b..6179907 100644
> --- a/lisp/org-agenda.el
> +++ b/lisp/org-agenda.el
> @@ -4086,6 +4086,8 @@ Needed to avoid empty dates which mess up
> holiday display."
> (apply 'diary-add-to-list args)
> (apply 'add-to-diary-list args)))
>
> +(defvar org-diary-last-run-time nil)
> +
> ;;;###autoload
> (defun org-diary (&rest args)
> "Return diary information from org-files.
> @@ -4123,8 +4125,14 @@ function from a program - use `org-agenda-get-
> day-entries' instead."
> (let* ((files (if (and entry (stringp entry) (string-match "\\S-"
> entry))
> (list entry)
> (org-agenda-files t)))
> + (time (org-float-time))
> file rtn results)
> - (org-prepare-agenda-buffers files)
> + (when (or (not org-diary-last-run-time)
> + (> (- time
> + org-diary-last-run-time)
> + 1))
> + (org-prepare-agenda-buffers files))
> + (setq org-diary-last-run-time time)
> ;; If this is called during org-agenda, don't return any entries
> to
> ;; the calendar. Org Agenda will list these entries itself.
> (if org-disable-agenda-to-diary (setq files nil))
> --8<---------------cut here---------------end--------------->8---
>
> Thanks for looking at this. I'm eager to know if there is a more
> elegant
> way of accomplishing the same thing.
>
> - Matt
>
> cal-tex-cursor-month
> 1 50.220853 50.220853
> cal-tex-list-diary-entries
> 1 48.950022 48.950022
> diary-list-entries
> 1 48.949987 48.949987
> diary-list-sexp-entries
> 31 48.934395 1.5785288709
> diary-sexp-entry
> 31 48.916153000 1.5779404193
> org-diary
> 31 48.914679 1.5778928709
> org-prepare-agenda-buffers
> 31 46.019204000 1.4844904516
> org-agenda-get-day-entries
> 868 2.644963 0.0030471923
> org-refresh-category-properties
> 868 2.3602110000 0.0027191370
> org-agenda-get-timestamps
> 868 1.0062780000 0.0011593064
> org-agenda-get-sexps
> 868 0.8682250000 0.0010002592
> org-end-of-subtree
> 1426 0.7195369999 0.0005045841
> org-agenda-get-blocks
> 868 0.5283550000 0.0006087039
> org-get-agenda-file-buffer
> 1736 0.4188759999 0.0002412880
> org-back-to-heading
> 2826 0.2957579999 0.0001046560
> org-diary-sexp-entry
> 620 0.209813 0.0003384080
> org-parse-time-string
> 1710 0.1728869999 0.0001011035
> org-format-agenda-item
> 71 0.161254 0.0022711830
> org-time-string-to-time
> 434 0.1496349999 0.0003447811
> org-time-string-to-absolute
> 1276 0.1480890000 0.0001160572
> org-find-base-buffer-visiting
> 1736 0.1476030000 8.502...e-05
> diary-anniversary
> 465 0.1349429999 0.0002901999
> org-before-change-function
> 1302 0.1321850000 0.0001015245
> org-get-time-of-day
> 149 0.1294050000 0.0008684899
> org-agenda-files
> 31 0.1266870000 0.0040866774
> org-closest-date
> 1276 0.1155559999 9.056...e-05
> org-at-date-range-p
> 1386 0.1094259999 7.895...e-05
> org-finalize-agenda-entries
> 26 0.1068299999 0.0041088461
> org-entries-lessp
> 73 0.1007950000 0.0013807534
> org-check-agenda-file
> 868 0.0899190000 0.0001035933
> org-uniquify
> 62 0.0846519999 0.0013653548
> org-date-to-gregorian
> 2552 0.0658019999 2.578...e-05
> org-agenda-skip
> 2246 0.0605190000 2.694...e-05
> org-calendar-holiday
> 31 0.041807 0.0013486129
> org-trim
> 2263 0.0414180000 1.830...e-05
> org-get-todo-state
> 263 0.0411600000 0.0001565019
> cal-tex-insert-days
> 1 0.033083 0.033083
> org-on-heading-p
> 403 0.0228089999 5.659...e-05
> cal-tex-end-document
> 1 0.01942 0.01942
> org-outline-level
> 1522 0.0151009999 9.921...e-06
> diary-pull-attrs
> 58 0.0142740000 0.0002461034
> org-get-effort
> 71 0.0136870000 0.0001927746
> org-entry-get
> 71 0.012828 0.0001806760
> diary-list-entries-2
> 31 0.012181 0.0003929354
> cal-tex-arg
> 135 0.0113300000 8.392...e-05
> diary-block
> 274 0.0108729999 3.968...e-05
> cal-tex-latexify-list
> 62 0.0105160000 0.0001696129
> org-get-property-block
> 71 0.0099130000 0.0001396197
> org-get-tags-at
> 38 0.0093790000 0.0002468157
> cal-tex-LaTeXify-string
> 70 0.0089039999 0.0001271999
> org-get-priority
> 38 0.0058529999 0.0001540263
> org-up-heading-safe
> 67 0.0045239999 6.752...e-05
> cal-tex-comment
> 57 0.0044230000 7.759...e-05
> diary-make-date
> 1013 0.0035599999 3.514...e-06
> cal-tex-insert-preamble
> 1 0.00313 0.00313
> org-agenda-highlight-todo
> 71 0.002797 3.939...e-05
> cal-tex-cmd
> 11 0.002558 0.0002325454
> org-add-props
> 199 0.0025159999 1.264...e-05
> org-compile-prefix-format
> 31 0.0020719999 6.683...e-05
> org-agenda-new-marker
> 109 0.0020570000 1.887...e-05
> cal-tex-list-holidays
> 1 0.00142 0.00142
> cal-tex-insert-day-names
> 1 0.00133 0.00133
> cal-tex-month-name
> 33 0.0011330000 3.433...e-05
> org-float-time
> 140 0.0007870000 5.621...e-06
> cal-tex-nl
> 5 0.0007859999 0.0001571999
> org-remove-uniherited-tags
> 38 0.0007720000 2.031...e-05
> org-downcase-keep-props
> 113 0.0007170000 6.345...e-06
> cal-tex-preamble
> 1 0.000525 0.000525
> cal-tex-insert-blank-days-at-end
> 1 0.000479 0.000479
> org-delete-all
> 38 0.000337 8.868...e-06
> org-get-category
> 71 0.0003360000 4.732...e-06
> cal-tex-insert-month-header
> 1 0.000335 0.000335
> org-agenda-fix-displayed-tags
> 71 0.0003129999 4.408...e-06
> cal-tex-e-document
> 1 0.00028 0.00028
> diary-add-to-list
> 31 0.0002730000 8.806...e-06
> cal-tex-vspace
> 1 0.000266 0.000266
> cal-tex-b-document
> 1 0.000264 0.000264
> cal-tex-hfill
> 4 0.0002549999 6.374...e-05
> cal-tex-insert-blank-days
> 1 0.000237 0.000237
> org-set-sorting-strategy
> 31 0.0001240000 4.000...e-06
> org-agenda-reset-markers
> 2 9.400...e-05 4.700...e-05
> cal-tex-first-blank-p
> 1 8.5e-05 8.5e-05
> cal-tex-last-blank-p
> 1 7.1e-05 7.1e-05
> org-defkey
> 2 3.8e-05 1.9e-05
> org-get-todo-face
> 1 2.2e-05 2.2e-05
> cal-tex-number-weeks
> 1 1.9e-05 1.9e-05
> diary-ordinal-suffix
> 3 1.300...e-05 4.333...e-06
> org-key
> 2 6e-06 3e-06
> org-face-from-face-or-color
> 1 4e-06 4e-06
> _______________________________________________
> Emacs-orgmode mailing list
> Please use `Reply All' to send replies to the list.
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
- Carsten
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Speed up org-diary
2010-03-29 12:20 ` Carsten Dominik
@ 2010-03-29 14:17 ` Matthew Lundin
0 siblings, 0 replies; 3+ messages in thread
From: Matthew Lundin @ 2010-03-29 14:17 UTC (permalink / raw)
To: Carsten Dominik; +Cc: Org Mode
Hi Carsten,
Carsten Dominik <carsten.dominik@gmail.com> writes:
> that is a good catch. org-diary is a total orphan for me,
> I have not looked at this function for 5 years - it was written
> when I was still thinking to use Org-files through the Emacs diary.
Thanks for applying the patch. Yes, I think one of the FAQs nicely
cautions against using org-diary (i.e., "think twice before using it!").
My only use for it at the moment is to pass org data to the cal-tex
functions. I certainly wouldn't recommend using org-diary to mark
calendar dates!
> I have made one change - I have given it 3 seconds instead of 1,
> I think this is a better value.
Thanks for making this change. I can see that 3 seconds is a better
value, especially since I set the value of org-diary-last-run-time
before the rest of the function runs.
Best,
Matt
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-03-29 14:16 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-28 18:12 [PATCH] Speed up org-diary Matt Lundin
2010-03-29 12:20 ` Carsten Dominik
2010-03-29 14:17 ` Matthew Lundin
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).