Quando si crea un fornitore per un oggetto meno costoso rispetto alla creazione dell'oggetto stesso?

1

Objects contiene 2 overload di metodi in cui uno prende un oggetto e l'altro prende un Supplier di quell'oggetto:

public static <T> T requireNonNull​(T obj, String message)
public static <T> T requireNonNull​(T obj, Supplier<String> messageSupplier)

e simili

public static <T> T requireNonNullElse​(T obj, T defaultObj)
public static <T> T requireNonNullElseGet​(T obj, Supplier<? extends T> supplier)

I metodi che prendono un fornitore hanno il vantaggio di posticipare la valutazione del secondo argomento, ma lo svantaggio di creare un'istanza Supplier . Ciò è indicato nei documenti per requireNonNull​(T obj, Supplier<String> messageSupplier) :

Unlike the method requireNonNull(Object, String), this method allows creation of the message to be deferred until after the null check is made. While this may confer a performance advantage in the non-null case, when deciding to call this method care should be taken that the costs of creating the message supplier are less than the cost of just creating the string message directly.

Mentre la vera risposta sarebbe sempre quella di eseguire benchmark, è controproducente farlo per ogni caso e il più delle volte questo non è il collo di bottiglia. Tuttavia, ci imbattiamo in queste situazioni abbastanza spesso e dato che ci viene data la scelta, preferiamo fare quella giusta, nel qual caso "eyeballing" può essere molto utile.

Ad eccezione dei casi in cui il secondo argomento è già valutato (per il quale questa domanda ha poco senso), quando la creazione del secondo argomento sarebbe più costosa di un fornitore? Ci devono essere alcune linee guida su quando la scelta corretta è abbastanza ovvia.

Ricordo che String s è un caso speciale a causa del loro pool.

    
posta user1803551 28.08.2018 - 20:37
fonte

1 risposta

2

Hai già risposto alla tua domanda:

While the real answer would always be to perform benchmarks, it's counterproductive to do so for every case and most of the times this is not the bottleneck.

La vera risposta è eseguire i benchmark per primi dopo aver notato un problema di prestazioni, o in casi d'uso in cui si sono imbattuti in problemi di prestazioni evidenti in passato. Solo dopo aver eseguito il benchmark e scoperto che c'è un problema hai bisogno di questo ulteriore livello di astrazione.

Quindi di nuovo è economico in termini di CPU e RAM per creare solo l'oggetto Supplier per cominciare.

Stranamente, sembra che la decisione di utilizzare il Fornitore inizi, o solo dopo aver eseguito benchmark è la "Ottimizzazione Prematura".

Anche se non si misura la necessità di utilizzare il Fornitore e il carico pigro abilitato, è economico in termini di prestazioni usarlo, quindi è necessario effettuare una chiamata di giudizio in anticipo. Usalo o no, ma non perdere un sacco di tempo cercando di decidere.

    
risposta data 28.08.2018 - 21:23
fonte

Leggi altre domande sui tag