RFR: 8283346: Optimize observable ArrayList creation in FXCollections [v5]
Marius Hanl
mhanl at openjdk.org
Fri Jul 1 08:00:51 UTC 2022
> 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>
Marius Hanl has updated the pull request incrementally with two additional commits since the last revision:
- 8283346: Added null to the test data
- 8283346: Refactoring: Using the ArrayList constructor directly
-------------
Changes:
- all: https://git.openjdk.org/jfx/pull/758/files
- new: https://git.openjdk.org/jfx/pull/758/files/3f288403..28fbd344
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jfx&pr=758&range=04
- incr: https://webrevs.openjdk.org/?repo=jfx&pr=758&range=03-04
Stats: 6 lines in 2 files changed: 0 ins; 1 del; 5 mod
Patch: https://git.openjdk.org/jfx/pull/758.diff
Fetch: git fetch https://git.openjdk.org/jfx pull/758/head:pull/758
PR: https://git.openjdk.org/jfx/pull/758
More information about the openjfx-dev
mailing list