You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@lucene.apache.org by "Nitsan Wakart (Jira)" <ji...@apache.org> on 2020/06/23 08:10:00 UTC

[jira] [Commented] (SOLR-14586) replace the second function parameter in Map#computeIfAbsent with static vars

    [ https://issues.apache.org/jira/browse/SOLR-14586?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17142708#comment-17142708 ] 

Nitsan Wakart commented on SOLR-14586:
--------------------------------------

Lambdas can sometimes be slow, and induce allocation. This depends on the state they capture and inlining and the callsite and all the other cleverness that the JIT compiler brings to the table. There is no reason to believe the code described needs optimizing without evidence. Any attempt at optimization without evidence should be blocked until compelling evidence is presented. The JMH benchmark is proof that there are at least circumstances where this is not an allocation hotspot. The OP should provide an allocation profile (JFR/async-profiler) which shows allocation hotspots related to the change, and show them gone after the change is implemented.

> replace the second function parameter in Map#computeIfAbsent with static vars
> -----------------------------------------------------------------------------
>
>                 Key: SOLR-14586
>                 URL: https://issues.apache.org/jira/browse/SOLR-14586
>             Project: Solr
>          Issue Type: Bug
>      Security Level: Public(Default Security Level. Issues are Public) 
>            Reporter: Noble Paul
>            Assignee: Noble Paul
>            Priority: Minor
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> people misunderstand lambdas
>  let's look at a very innocuous looking piece of code
> {code:java}
> mapObject.computeIfAbsent(key, o -> new HashMap<>());
> {code}
> vs.
> {code:java}
> mapObject.computeIfAbsent(key, Utils.NEW_HASHMAP_FUN)
> {code}
>  
>  The first code fragment is executed as following
> {code:java}
> s.computeIfAbsent(key, new Function() {
>  @Override
>  public Object apply(String key) {
>  return new HashMap<>();
>  }
> }
> {code}
> So, there are two problems with this
>  * A new anonymous inner class is created for that lambda. This one extra class becomes a part of your binary
>  * a new instance of that class is created everytime the {{computeIfAbsent()}} method is invoked, irrespective of whether the value is absent for that key or not. Now imagine that method getting called millions of times and creating millions of such objects for no reason
> OTOH
> when I use {{Utils.NEW_HASHMAP_FUN}}
>  * Only a single anonymous class is created for the entire codebase
>  * Only single instance of that object is created in the VM
> Ideally, we should go all over the codebase and remove such lambdas



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@lucene.apache.org
For additional commands, e-mail: issues-help@lucene.apache.org