[
https://issues.apache.org/jira/browse/SOLR-14586?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17142118#comment-17142118
]
Mike Drob commented on SOLR-14586:
----------------------------------
bq. Now imagine that method getting called millions of times and creating
millions of such objects for no reason
Also, JMH disagrees with you on both JDK 8 and JDK 11.
{code}
public class CompIfAbsentBench {
Map<String,Map<String,String>> map = new HashMap<>();
@Benchmark
public Map<String, String> compIfAbsentLambda()
{
return map.computeIfAbsent("a", k -> new HashMap<>());
}
}
{code}
{noformat}
Benchmark Mode Cnt Score
Error Units
CompIfAbsentBench.compIfAbsentLambda avgt 5 4.460 ±
0.029 ns/op
CompIfAbsentBench.compIfAbsentLambda:·gc.alloc.rate avgt 5 ≈ 10⁻⁴
MB/sec
CompIfAbsentBench.compIfAbsentLambda:·gc.alloc.rate.norm avgt 5 ≈ 10⁻⁶
B/op
CompIfAbsentBench.compIfAbsentLambda:·gc.count avgt 5 ≈ 0
counts
{noformat}
> 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: [email protected]
For additional commands, e-mail: [email protected]