Integrated: 8283346: Optimize observable ArrayList creation in FXCollections

Marius Hanl mhanl at openjdk.org
Sat Jul 2 12:40:32 UTC 2022


On Thu, 17 Mar 2022 21:10:14 GMT, Marius Hanl <mhanl at openjdk.org> wrote:

> This simple PR optimizes the observable `ArrayList` creation by using the ArrayList constructor/array size so that the underlying array will be initialized at the correct size which will speed up the creation as the array does not need to grow as a result of the `addAll` call.
> 
> I also added tests which will succeed before and after to verify that nothing got broken by this change.
> Also I made a benchmark test. Results:
> 
> | Benchmark | Mode| Cnt | Score | Error | Units
> | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- |
> | ListBenchmark OLD  | thrpt | 25 | 722,842 | ± 26,93 | ops/s
> | ListBenchmark NEW | thrpt  | 25 | 29262,274 | ± 2088,712 | ops/s
> 
> Edit: I also made a synthetic benchmark by measuring the same code below 100 times with `System.nanoTime`.
> ListBenchmark OLD (avg): 21-23ms
> ListBenchmark NEW (avg): 2 ms
> 
> <details><summary>Benchmark code</summary>
> 
> 
> import javafx.collections.FXCollections;
> import javafx.collections.ObservableList;
> import org.openjdk.jmh.annotations.Benchmark;
> import org.openjdk.jmh.annotations.Scope;
> import org.openjdk.jmh.annotations.Setup;
> import org.openjdk.jmh.annotations.State;
> import org.openjdk.jmh.annotations.TearDown;
> 
> import java.util.ArrayList;
> import java.util.List;
> 
> @State(Scope.Benchmark)
> public class ListBenchmark {
> 
>     List<String> strings;
> 
>     @Setup
>     public void setup() {
>         strings = new ArrayList<>();
>         for(int i = 0; i< 100000;i++) {
>             strings.add("abc: " + i);
>         }
>     }
> 
>     @TearDown
>     public void tearDown() {
>         strings = null;
>     }
> 
>     @Benchmark
>     public ObservableList<String> init() {
>         return FXCollections.observableArrayList(strings);
>     }
> }
> 
> 
> </details>

This pull request has now been integrated.

Changeset: b3eca1f6
Author:    Marius Hanl <mhanl at openjdk.org>
Committer: Kevin Rushforth <kcr at openjdk.org>
URL:       https://git.openjdk.org/jfx/commit/b3eca1f64977343c06e6035fab385935055b6d6b
Stats:     49 lines in 2 files changed: 41 ins; 4 del; 4 mod

8283346: Optimize observable ArrayList creation in FXCollections

Reviewed-by: mstrauss, nlisker, kcr

-------------

PR: https://git.openjdk.org/jfx/pull/758


More information about the openjfx-dev mailing list