Hi all,

after completing most of the work of reviewing the scholarly.annotate module I realize that it (presumably one small change) is a total performance killer, and I need some help tracking it down.

There are a few things I have changed (had to), and one in particular seemed suspicious to me right away.

The situation is that a three-page score that takes ~ 2.1 seconds without the engraver and with the old state of the engraver now needs 5.8 seconds. And a >20 page score that I recall using around 20-25 seconds now needs 57 - so that's obviously nothing to ignore.

Observations:

 * The obvious stage of slow-down is when the log prints Interpreting
   music...[8][16][24] etc.

To monitor more closely I have inserted (ly:message) commands

 * "Engraver instantiated" in the closure around the engraver's lambda
   expression
 * "Engraver called" between the (lambda (context)) and (make-engraver ...
 * "First acknowledger" in the (acknowledgers) clause (prints only once)
 * "First process-acknowledged" in the (process-acknowledged) clause
   (prints only once)

Now the log output prints:

Parsing...
Engraver instantiated
Interpreting music...
Engraver called
Engraver called
Engraver called
First process-acknowledged
First acknowledger[8][16][24]
Finalize
Finalize
Finalize
Preprocessing graphical objects...

where the bar counter proceeds extremely slowly (about 1 second per entry).

Depending on the number of contexts I have consisted the engraver to the first "Finalize" may be printed *before* the [8], so I'm not really sure how reliable the order of log output really is here. I'm also wondering why "process-acknowledged" is printed before "acknowledger" ...

How could I proceed to further track down the issue? But maybe my own suspicions already help bringing someone on the right track?

I see two changes to the previous code that I think could have such impact, one more and one less.

1) In the music-function (i.e. not in the engraver) I determine an "anchor" if it's sequential music or a chord. In these cases I add a reference to that anchor as a music-property to the music expression. This is because the music expression is chained through several stages, and I need to keep a reference to that anchor.

This means that the music expression sees the anchor element twice, but I *think* this is only a reference so there should be no performance penalty connected, right?

And I find it very unlikely that this is the issue because the performance problem is triggered by merely \consist-ing the engraver, even if it isn't used at all.

2) The engraver works upon grobs that have a certain grob-property attached (an 'input-annotation alist that is attached in the music-function).

In the earlier code that annotation was attached through \once \override, the new code uses (propertyTweak).

In the earlier code I did that test for the property in the (acknowledgers) clause and simply skipped all irrelevant grobs. All grobs with an annotation were collected in a list and that list later processed in (finalize).

In a recent discussion (http://lists.gnu.org/archive/html/lilypond-user/2018-06/msg00218.html) I was directed to move that test to (process-acknowledged) because a) the tweaks weren't available as the grob property earlier and b) this was the place to do that.

In order to achieve that I had to use (acknowledgers) to add *all* grobs to a list and iterate over that list in (process-acknowledged).

I have the impression that *this* is the performance problem: creating a list with references to *all* grobs in the score, regardless of whether they are needed at all. Which would explain why the problem exists even if not a single annotation is present in the score.

 * Does that make sense?
 * How can I test this further?
 * Is there a way to get rid of this list-of-all-grobs (I don't want to
   test what that would do to a 100-page score ...) while still
   catching the grob properties attached through a \tweak?

The code can be seen here: https://github.com/openlilylib/scholarly/blob/editorial-markup-choice-and-annotate/annotate/engraver.ily or by cloning the https://github.com/openlilylib/scholarly repository and checking out the editorial-markup-choice-and-annotate branch (files in annotate/...)-

Any help would be greatly appreciated

Urs

_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to