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

[jira] [Updated] (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:all-tabpanel ]

Noble Paul updated SOLR-14586:
------------------------------
    Description: 
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

> 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
>
> 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