I am all for an easy-to-understand performance model.  But it is merely one quality of many that we are optimizing for, and it is absolutely, positively, *not* the high-order bit for how we expose the feature.  There will be room for outlining the tradeoffs, but there is not room for "we can't allow case X strictly because it would be slower than case Y."  That's performance myopia, and even to the degree it would be acceptable, it is surely premature.  So let's move on.



On 11/2/2021 2:25 PM, Remi Forax wrote:


------------------------------------------------------------------------

    *From: *"Brian Goetz" <brian.go...@oracle.com>
    *To: *"John Rose" <john.r.r...@oracle.com>
    *Cc: *"amber-spec-experts" <amber-spec-experts@openjdk.java.net>
    *Sent: *Mardi 2 Novembre 2021 18:43:29
    *Subject: *Translation musings (was: Are templated string embedded
    expressions "method parameters" or "lambdas"?)

    I think we need to redirect a bit.

        I’m pointing out a different proposition:  *If* you need
        static validation of a string, *then* you need something
        constant about the receiver.  By constant I mean, very
        specifically, “fixed no later than just before the first
        execution of of the string template expression”.  The
        “something constant” might be the type (some subtype of a
        known “ST-Handler”), or it might be a constant value (e.g., a
        static final field value).


    And I'm saying something different:

     - We never *need* static validation of the string.
     - We never *need* an indy-based, multi-step translation.

    Both of these are nice to haves, not must-haves; the goal is to
    extract these when we can have them, not to restrict the feature
    so that we can't use the feature if we can't produce them.

    We are in deep danger of way over-rotating towards the
    translation.  I would go as far as to say that if we always, now
    and for the forever future, just translated with
    "invokeinterface", it would *still* be a successful and popular
    feature.  Do we want to do better when we can?  Of course.  Are we
    willing to restrict the feature to the cases where can do so? 
    Absolutely not.

    It's really easy to get wrapped around the axle over cases like
    String::format, and convince ourselves that this is the 99% use
    case.  But this represents only a slice (yes, an important slice)
    of the benefits we get from this feature. In many cases, the work
    we'll do to translate the template (e.g., a CLASS."public class
    Foo { ... }" policy) or after we translate the template (execute a
    SQL query) completely dominates the performance profile.

    So yes, let's optimize for the best-case translation when we can,
but let's not let that constrain what feature we deliver.

Templated strings can have a awful performance model if we are not careful, and i don't think that relying on the user being careful aka the C++ strategy is a good strategy.

They have been enough lengthy discussions about the performance of String.format() vs StringBuilder, i think it's reasonable to avoid to create new performance pot holes when designing this feature.

So static validation and being indy-based are a little more than just nice to have, they are here to provide an easy to understand performance model.

regards,
Rémi

Reply via email to