On Mon, Feb 20, 2012 at 12:07 AM, m...@apollinemike.com <
m...@apollinemike.com> wrote:

>
> On Feb 20, 2012, at 1:58 AM, Joe Neeman wrote:
>
> >
> >
> > I think you're going about things in the wrong order. I think that the
> first goal should be to make the code clear and correct. (In fact, if your
> code were "done" but slow, you could push it to master but with skylining
> disabled for most grobs by default. That way, people could test it and give
> feedback. They could even enable skylining on more grobs if they didn't
> mind the performance hit.)
>
> This idea was kicked around the list in various vicissitudes, but it
> seemed that the majority of people favored LilyPond making the best result
> possible out of the box.
>

That's fine, but it doesn't mean that it has to be that way when you first
push it to master. It's up to you, of course, but I prefer not to keep my
own branches unsynced from master for a long time...


> > Then you should profile and benchmark it to figure out which parts need
> to be faster (use ./configure --enable-profiling). For example, do you know
> that making special cases for beams and key signatures actually helps?
> >
>
> I've only used `time' on large scores to get an idea, as with small scores
> it's difficult to tell.  I did a few runs again this morning and have
> gotten rid of the exception for key signatures (it does not help at all).
>  I think that beams help, but I'm honestly not even sure...it fluctuates a
> lot and I'm having trouble getting a clean read.  I am going to delete all
> of the exceptions (save slurs, which does help).
>

Have you profiled it? That will let you see which function(s) are adding
the extra time.


> > Having said that, there are two places that I can think of which *might*
> speed things up:
> >  - you return a lot of vector<Box> in stencil-intergrate.cc. This might
> mean that a lot of things get copied (not sure about this -- c++11 is
> supposed to help here). It might speed things up if you pass around const
> vector<Box>& instead.
>
> I did this.  I'm not sure if it results in better performance, but it
> can't hurt & looks cleaner.
>
> >  - the skylines you generate are a lot more complicated than they need
> to be. For example, you approximate beams with 11 horizontal segments. If
> you were to implement my suggestion about turning line segments into
> skylines, you could represent a beam with 1 sloped segment.
> >
>
> This is true.  I have a test case with 1200 hairpins (12 staves, 100
> hairpins a piece) and this brings the compilation time down from about
> 19.9' to 19.5' on average.  So there's definitely a performance increase.
>  The issue I'm having is figuring out a good way to implement this so that
> it maintains a meaningful notion of what "horizon padding" is.  For
> example, if two skylines are merged with different horizon paddings, do
> they retain the horizon paddings of the old grobs (harder to code) or take
> the horizon padding of the new grob (easier to code)?  Or both - do they
> retain the old and tack on the new?  These ideas are currently ill defined
> but would need to be solidified.  I'm an advocate of the horizon padding of
> the new grob (or prob) only ever kicking in and forgetting the previous
> ones, operating under the assumption that if someone wants to hardcode an
> earlier horizon padding upstream for a given skyline, it'd be better to
> tack the padding onto the boxes that make the skyline and not the skyline
> itself.  Thoughts?
>

New grob sounds good.

Cheers,
Joe
_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to