I think you guys need to change the topic here - nothing to do with CAD
anymore (which is still an unresolved topic).


On Fri, Jul 26, 2013 at 3:03 PM, Richard Bair <richard.b...@oracle.com>wrote:

> Actually Jasper and Scott just pointed out some problems here. I mistyped
> (should have been return _x; from the getter). But also I didn't handle the
> case of binding, or setting via the property correctly here. So this
> modified pattern doesn't work. I may be remembering it wrong and Alex can
> correct me.
>
> Richard
>
> On Jul 25, 2013, at 9:21 AM, Richard Bair <richard.b...@oracle.com> wrote:
>
> >> Regarding memory requirements of the "full lazy" properties, let me
> state the obvious:
> >> - if the property is not used at all, we have a reference and a double
> instead of just a reference (worse unless in bucket)
> >> - if getters/setters are called, we still have a reference and a double
> instead of full instantiated property (better)
> >> - if a listener is added, we have instantiated property and a double
> instead of just the property (slightly worse)
> >> So it looks like it would make best sense to introduce this for
> properties that are often get/set but usually don't have listeners on them.
> I'm not sure if such set exists and can be identified.
> >
> > Thanks Pavel, this is a good summary. Alex K. and I were looking at a
> pattern for this once and he had another way to do it which was different
> than what I had done in the past. The pattern I used to use was something
> like this:
> >
> >    private double _x;
> >    private DoubleProperty x;
> >
> >    public final void setX(double value) {
> >        if (x == null) {
> >            _x = value;
> >        } else {
> >            x.set(value);
> >    }
> >
> >    public final double getX() {
> >        return x == null ? _x : x.get();
> >    }
> >
> >    public final DoubleProperty xProperty() {
> >        if (x == null) x = new DoubleProperty(this, "x", _x);
> >        return x;
> >    }
> >
> > instead it could be done like this which results in faster getters
> (because you never have to delegate to another method), an almost
> immeasurably slower setter, and slightly little less code:
> >
> >    private double _x;
> >    private DoubleProperty x;
> >
> >    public final void setX(double value) {
> >        _x = value;
> >        if (x != null) x.set(value);
> >    }
> >
> >    public final double getX() {
> >        return x;
> >    }
> >
> >    public final DoubleProperty xProperty() {
> >        if (x == null) x = new DoubleProperty(this, "x", _x);
> >        return x;
> >    }
> >
> >
> > The idea here is to always set the local field, so that we can always
> just return the value immediately in the getter. Where I think this may
> make a difference is on the smaller end systems (mobile / embedded) because
> from previous analysis we saw that none of our getters were getting inlined
> -- we actually paid the price of each method call overhead, because since
> we were reading from the property objects and the property objects were a
> couple methods worth of work for each getter call, the VM wouldn't inline
> the generated code into the call sites. By using this pattern in places
> that are commonly read, we would probably get these getters all inlined
> again and avoid all the method call overhead entirely.
> >
> > Richard
>
>

Reply via email to