From 9089d84d2bcc7733821ea3edb153af38974d34db Mon Sep 17 00:00:00 2001 From: alemoles Date: Tue, 21 Feb 2023 13:20:33 -0300 Subject: [PATCH] BAEL-5912 Introduction to RoaringBitmap (#13326) --- .../core-java-collections-5/README.md | 7 ++ .../core-java-collections-5/pom.xml | 58 +++++++++++++ .../roaringbitmap/BitSetsBenchmark.java | 82 +++++++++++++++++++ .../roaringbitmap/BitSetsBenchmarkRunner.java | 9 ++ .../RoaringBitmapBenchmarkUnitTest.java | 45 ++++++++++ core-java-modules/pom.xml | 1 + 6 files changed, 202 insertions(+) create mode 100644 core-java-modules/core-java-collections-5/README.md create mode 100644 core-java-modules/core-java-collections-5/pom.xml create mode 100644 core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmark.java create mode 100644 core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmarkRunner.java create mode 100644 core-java-modules/core-java-collections-5/src/test/java/com/baeldung/roaringbitmap/RoaringBitmapBenchmarkUnitTest.java diff --git a/core-java-modules/core-java-collections-5/README.md b/core-java-modules/core-java-collections-5/README.md new file mode 100644 index 0000000000..cf479ec507 --- /dev/null +++ b/core-java-modules/core-java-collections-5/README.md @@ -0,0 +1,7 @@ +========= + +## Core Java Collections Cookbooks and Examples + +### Relevant Articles: + +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-4) \ No newline at end of file diff --git a/core-java-modules/core-java-collections-5/pom.xml b/core-java-modules/core-java-collections-5/pom.xml new file mode 100644 index 0000000000..67c9f7120c --- /dev/null +++ b/core-java-modules/core-java-collections-5/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + core-java-collections-5 + 0.0.1-SNAPSHOT + core-java-collections-5 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + org.junit.platform + junit-platform-runner + ${junit-platform.version} + test + + + org.junit.jupiter + junit-jupiter + ${junit.version} + test + + + org.junit.vintage + junit-vintage-engine + ${junit.version} + test + + + org.roaringbitmap + RoaringBitmap + ${roaringbitmap.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + + + 5.9.2 + 0.9.38 + 1.36 + + diff --git a/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmark.java b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmark.java new file mode 100644 index 0000000000..4968afb752 --- /dev/null +++ b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmark.java @@ -0,0 +1,82 @@ +package com.baeldung.roaringbitmap; + +import java.util.BitSet; + +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.roaringbitmap.RoaringBitmap; + +@State(Scope.Thread) +public class BitSetsBenchmark { + private RoaringBitmap rb1; + private BitSet bs1; + private RoaringBitmap rb2; + private BitSet bs2; + private final static int SIZE = 10_000_000; + + @Setup + public void setup() { + rb1 = new RoaringBitmap(); + bs1 = new BitSet(SIZE); + rb2 = new RoaringBitmap(); + bs2 = new BitSet(SIZE); + for (int i = 0; i < SIZE / 2; i++) { + rb1.add(i); + bs1.set(i); + } + for (int i = SIZE / 2; i < SIZE; i++) { + rb2.add(i); + bs2.set(i); + } + } + + @Benchmark + public RoaringBitmap roaringBitmapUnion() { + return RoaringBitmap.or(rb1, rb2); + } + + @Benchmark + public BitSet bitSetUnion() { + BitSet result = (BitSet) bs1.clone(); + result.or(bs2); + return result; + } + + @Benchmark + public RoaringBitmap roaringBitmapIntersection() { + return RoaringBitmap.and(rb1, rb2); + } + + @Benchmark + public BitSet bitSetIntersection() { + BitSet result = (BitSet) bs1.clone(); + result.and(bs2); + return result; + } + + @Benchmark + public RoaringBitmap roaringBitmapDifference() { + return RoaringBitmap.andNot(rb1, rb2); + } + + @Benchmark + public BitSet bitSetDifference() { + BitSet result = (BitSet) bs1.clone(); + result.andNot(bs2); + return result; + } + + @Benchmark + public RoaringBitmap roaringBitmapXOR() { + return RoaringBitmap.xor(rb1, rb2); + } + + @Benchmark + public BitSet bitSetXOR() { + BitSet result = (BitSet) bs1.clone(); + result.xor(bs2); + return result; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmarkRunner.java b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmarkRunner.java new file mode 100644 index 0000000000..49d556df7e --- /dev/null +++ b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/roaringbitmap/BitSetsBenchmarkRunner.java @@ -0,0 +1,9 @@ +package com.baeldung.roaringbitmap; + +import java.io.IOException; + +public class BitSetsBenchmarkRunner { + public static void main(String... args) throws IOException { + org.openjdk.jmh.Main.main(args); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/roaringbitmap/RoaringBitmapBenchmarkUnitTest.java b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/roaringbitmap/RoaringBitmapBenchmarkUnitTest.java new file mode 100644 index 0000000000..07170512d9 --- /dev/null +++ b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/roaringbitmap/RoaringBitmapBenchmarkUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.roaringbitmap; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; +import org.roaringbitmap.RoaringBitmap; + +class RoaringBitmapBenchmarkUnitTest { + @Test + public void givenTwoRoaringBitmap_whenUsingOr_thenWillGetSetsUnion() { + RoaringBitmap expected = RoaringBitmap.bitmapOf(1, 2, 3, 4, 5, 6, 7, 8); + RoaringBitmap A = RoaringBitmap.bitmapOf(1, 2, 3, 4, 5); + RoaringBitmap B = RoaringBitmap.bitmapOf(4, 5, 6, 7, 8); + RoaringBitmap union = RoaringBitmap.or(A, B); + assertEquals(expected, union); + } + + @Test + public void givenTwoRoaringBitmap_whenUsingAnd_thenWillGetSetsIntersection() { + RoaringBitmap expected = RoaringBitmap.bitmapOf(4, 5); + RoaringBitmap A = RoaringBitmap.bitmapOfRange(1, 6); + RoaringBitmap B = RoaringBitmap.bitmapOf(4, 5, 6, 7, 8); + RoaringBitmap intersection = RoaringBitmap.and(A, B); + assertEquals(expected, intersection); + } + + @Test + public void givenTwoRoaringBitmap_whenUsingAndNot_thenWillGetSetsDifference() { + RoaringBitmap expected = RoaringBitmap.bitmapOf(1, 2, 3); + RoaringBitmap A = new RoaringBitmap(); + A.add(1L, 6L); + RoaringBitmap B = RoaringBitmap.bitmapOf(4, 5, 6, 7, 8); + RoaringBitmap difference = RoaringBitmap.andNot(A, B); + assertEquals(expected, difference); + } + + @Test + public void givenTwoRoaringBitmap_whenUsingXOR_thenWillGetSetsSymmetricDifference() { + RoaringBitmap expected = RoaringBitmap.bitmapOf(1, 2, 3, 6, 7, 8); + RoaringBitmap A = RoaringBitmap.bitmapOfRange(1, 6); + RoaringBitmap B = RoaringBitmap.bitmapOfRange(4, 9); + RoaringBitmap xor = RoaringBitmap.xor(A, B); + assertEquals(expected, xor); + } +} \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 1033213cd1..a96489ec6f 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -31,6 +31,7 @@ core-java-collections-2 core-java-collections-3 core-java-collections-4 + core-java-collections-5 core-java-collections-conversions core-java-collections-conversions-2 core-java-collections-set-2