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

[jira] [Comment Edited] (SOLR-14586) replace the second function parameter in computeIfAbsent with static vars

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

Andrzej Bialecki edited comment on SOLR-14586 at 6/22/20, 3:05 PM:
-------------------------------------------------------------------

[~mdrob] this lambda was probably inlined - can you check with {{-XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining}} ? I commented on SOLR-14579 that the results also depend on the depth of the call stack (IIRC the default max depth for inlining is 9 levels).

Edit: it would be informative to look at the bytecode generated with {{HashMap::new}}, I suspect it doesn't create any lambda but instead calls invokevirtual directly.


was (Author: ab):
[~mdrob] this lambda was probably inlined - can you check with {{-XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining}} ? I commented on SOLR-14579 that the results also depend on the depth of the call stack (IIRC the default max depth for inlining is 9 levels).

> replace the second function parameter in 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