From mboxrd@z Thu Jan 1 00:00:00 1970 From: Carsten Dominik Subject: Re: [PATCH] Speed up org-diary Date: Mon, 29 Mar 2010 14:20:52 +0200 Message-ID: <4EBD8D44-D5F4-4FCD-B548-796D4538EC90@gmail.com> References: <874ok071tf.fsf@fastmail.fm> Mime-Version: 1.0 (Apple Message framework v936) Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NwDxz-0000tP-Fe for emacs-orgmode@gnu.org; Mon, 29 Mar 2010 08:21:15 -0400 Received: from [140.186.70.92] (port=51195 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NwDxw-0000si-Nc for emacs-orgmode@gnu.org; Mon, 29 Mar 2010 08:21:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1NwDxj-0008Oj-Bg for emacs-orgmode@gnu.org; Mon, 29 Mar 2010 08:21:12 -0400 Received: from ey-out-1920.google.com ([74.125.78.144]:15171) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1NwDxf-0008O3-Lt for emacs-orgmode@gnu.org; Mon, 29 Mar 2010 08:20:59 -0400 Received: by ey-out-1920.google.com with SMTP id 4so980629eyg.34 for ; Mon, 29 Mar 2010 05:20:55 -0700 (PDT) In-Reply-To: <874ok071tf.fsf@fastmail.fm> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org 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