Christoph Groth <christ...@grothesque.org> writes:

> Carsten Dominik wrote in 2010:
>
>> I am afraid I don't see any major speed improvements that could make
>> this happen. Yes, one could parse all the files once, build a table
>> in memory and get the entries for each day from there - 
>> but that comes down to a complete rewrite of the parser, maybe even
>> to switching to an internal representation model for Org-mode.
>
>> I don't see that happening, I am afraid.

Wow, you must have done some digging to find that, Christoph.  :)

> Computing the agenda month view takes 20 seconds in my case. That's
> perhaps the most serious problem with orgmode as I (and I suppose
> others as well) use it.  It would be great if this issue could be
> solved after all.
>
> Would it be really so difficult to do?  The actual parsing seems to be
> done in the function org-agenda-get-day-entries as called by
> org-agenda-list.  Inside org-agenda-get-day-entries the crucial bit
> seems to be (org-agenda-today-p date).  If that bit got replaced by
> something that matches more than a single day, wouldn't this mostly do
> the trick?
>
> This is much easier than "rewriting the parser", so it seems that I'm
> overlooking some problems.

I think Carsten is correct that it would require significant new code.
I looked at the code you mentioned, but I think you missed the bigger
structure.  org-agenda-list first builds a list of day numbers from the
span that is set, then it calls org-agenda-get-day-entries for each day
number.

The (org-agenda-today-p date) form in org-agenda-get-day-entries is only
checked when the function is getting TODO items, and then it calls
org-agenda-get-todos to actually get the entries.  And as far as I can
tell, org-agenda-list doesn't set the :todo selector at all, so the
org-agenda-get-todos function isn't called when building a time-based
agenda view; instead it's called for the org-todo-list command.  This
seems to be confirmed by the docstring for org-agenda-entry-types, which
doesn't indicate that :todo is allowed as a type for daily/weekly
agendas.

I'm not as expert as Carsten or any of the current maintainers, but a
possible way to speed up agenda creation for longer time spans would be
to avoid parsing files repeatedly.  IIUC they are parsed once for every
date shown in the agenda.  Instead, if they were parsed once and
returned a list of items that was filtered or grouped once, that would
probably be faster.

But doing that would, as Carsten said, require rewriting a lot of code.
Essentially you'd be creating a new agenda system, so you'd have to
reimplement a lot of existing code.  You could do it in parallel, rather
than replacing existing code, so you wouldn't have to break the existing
agenda system.  But I don't think there's any way to shortcut writing
the new system.  I don't think there's any "low hanging fruit."

Anyway, something based on org-map-entries might be interesting, but
it's hard to say if it would actually be faster in the end.



Reply via email to