On 2020/04/28 07:20:26, hanwenn wrote:
> On 2020/04/28 06:49:58, hahnjo wrote:
> >
https://codereview.appspot.com/547980044/diff/572060043/lily/skyline.cc
> > File lily/skyline.cc (right):
> > 
> >
>
https://codereview.appspot.com/547980044/diff/572060043/lily/skyline.cc#newcode175
> > lily/skyline.cc:175: Building front_;
> > On 2020/04/27 21:30:18, hanwenn wrote:
> > > On 2020/04/27 07:01:28, hahnjo wrote:
> > > > In any case, this causes copies on every call to next(). If you
need to
> > retain
> > > > this data structure, is there a reason not to use a pointer to
the current
> > > > element? AFAICS you don't modify the underlying vector when
using a
> > > > BuildingQueue
> > > 
> > > see the split_off() function.
> > 
> > That could be made a function taking an iterator as argument, or am
I missing
> > something? AFAICS it's making a copy of the current element, then
modifies
> both
> > versions, and possibly advances the iterator.
> 
> Sure.
> 
> The thing I am getting at is that we spend a lot of CPU cycles for
doing shift
> and raise, looping over all the elements to do trivial computations
over them.
> Doing such modifications also requires making a copy of the entire
thing.
> 
> If we structure this as
> 
>  
>   class Immutable_skyline : smob {
>     vector<Building>  buildings_;
>   }
> 
>   class Mutable_skyline : smob {
>      Immutable_skyline *immutable_; // potentially shared between many
> Mutable_skylines_
>      Offset  off_
>   };
> 
> we can keep work the offset handling into BuildingQueue (applying the
offset to
> each building we process in the merge). This is also better for cache
locality.

So that's a possible improvement in the future, right?
In any case, currently BuildingQueue copies to front_ while iterating
over the Buildings, even if not modifying it in all cases. That
certainly doesn't sound right.

https://codereview.appspot.com/547980044/

Reply via email to