From 78bcb67c67f119c7641ed2ea42f87c474bba5e96 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Sat, 20 Apr 2019 16:03:50 +0200 Subject: [PATCH] Parallel execution and added core submodule --- .gitmodules | 3 ++ .../java/objects/lists/StrangeDbList.java | 2 +- .../strangedb/tests/ListContainer.java | 46 ++++++++++++------- .../strangedb/tests/Performance.java | 2 - .../cavallium/strangedb/tests/QueryTests.java | 11 +++-- strangedb-core | 1 + 6 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 .gitmodules create mode 160000 strangedb-core diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..99a163f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "strangedb-core"] + path = strangedb-core + url = ssh://git@git.ignuranza.net:5003/andreacavalli/strangedb-core.git diff --git a/src/main/java/it/cavallium/strangedb/java/objects/lists/StrangeDbList.java b/src/main/java/it/cavallium/strangedb/java/objects/lists/StrangeDbList.java index 5ba40a4..84b90ca 100644 --- a/src/main/java/it/cavallium/strangedb/java/objects/lists/StrangeDbList.java +++ b/src/main/java/it/cavallium/strangedb/java/objects/lists/StrangeDbList.java @@ -63,7 +63,7 @@ public abstract class StrangeDbList extends EnhancedObject implements Element protected void forEachParallelUnsorted_(ConsumerWithIO action) throws IOException { try { int size = size(); - ExecutorService executorService = Executors.newFixedThreadPool(16, (r) -> new Thread(r, "StrangeDbList.forEachParallelUnsorted worker")); + ExecutorService executorService = ForkJoinPool.commonPool(); VariableWrapper exceptionVariableWrapper = new VariableWrapper<>(null); for (int i = 0; i < size; i++) { final int index = i; diff --git a/src/test/java/it/cavallium/strangedb/tests/ListContainer.java b/src/test/java/it/cavallium/strangedb/tests/ListContainer.java index ad27ca7..1283503 100644 --- a/src/test/java/it/cavallium/strangedb/tests/ListContainer.java +++ b/src/test/java/it/cavallium/strangedb/tests/ListContainer.java @@ -8,6 +8,7 @@ import it.cavallium.strangedb.java.objects.lists.EnhancedObjectStrangeDbList; import java.io.IOException; import java.util.Random; +import java.util.concurrent.*; public class ListContainer extends EnhancedObject { @@ -21,23 +22,36 @@ public class ListContainer extends EnhancedObject { super(databaseTools); this.usersList = new EnhancedObjectStrangeDbList<>(databaseTools, User.class); Random random = new Random(); + ExecutorService threadPool = ForkJoinPool.commonPool(); for (int i = 0; i < count; i++) { - User usr; - int randomInt = random.nextInt(2); - switch (randomInt) { - case 0: - usr = new User(databaseTools, "Rossi" + count + "Mario"+count, "the" + count + "_mariorossi99", "Long long big " + count + " giant bio mario rossi 99 abcdefghijklmnopqrstuvwxyz"); - break; - case 1: - usr = new User(databaseTools, QueryTests.constantFirstName, QueryTests.constantUsername, QueryTests.constantBio); - break; - case 2: - usr = new User(databaseTools, QueryTests.constantFirstName, "b" + count + "a", QueryTests.constantBio); - break; - default: - throw new ArrayIndexOutOfBoundsException(); - } - this.usersList.add(usr); + threadPool.execute(() -> { + try { + User usr; + int randomInt = random.nextInt(2); + switch (randomInt) { + case 0: + usr = new User(databaseTools, "Rossi" + count + "Mario" + count, "the" + count + "_mariorossi99", "Long long big " + count + " giant bio mario rossi 99 abcdefghijklmnopqrstuvwxyz"); + break; + case 1: + usr = new User(databaseTools, QueryTests.constantFirstName, QueryTests.constantUsername, QueryTests.constantBio); + break; + case 2: + usr = new User(databaseTools, QueryTests.constantFirstName, "b" + count + "a", QueryTests.constantBio); + break; + default: + throw new ArrayIndexOutOfBoundsException(); + } + this.usersList.add(usr); + } catch (IOException ex) { + throw new CompletionException(ex); + } + }); + } + threadPool.shutdown(); + try { + threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); + } catch (InterruptedException e) { + throw new IOException(e); } } diff --git a/src/test/java/it/cavallium/strangedb/tests/Performance.java b/src/test/java/it/cavallium/strangedb/tests/Performance.java index e34d032..ee3b75c 100644 --- a/src/test/java/it/cavallium/strangedb/tests/Performance.java +++ b/src/test/java/it/cavallium/strangedb/tests/Performance.java @@ -62,7 +62,6 @@ public class Performance { testS("DatabaseCore root creation", 300, Performance::regenDb, () -> db.loadRoot(PreloadedListContainer::new), () -> {}); final VariableWrapper preloadedListContainer = new VariableWrapper<>(null); final VariableWrapper simpleEnhancedObjectContainer = new VariableWrapper<>(null); - /* testS("ObjectStrangeDbList creation", 3000, () -> { regenDb(); preloadedListContainer.var = db.loadRoot(PreloadedListContainer::new); @@ -184,7 +183,6 @@ public class Performance { }, () -> { preloadedListContainer.var.list.size(); }, () -> {}); - */ for (int items = 1000; items <= 100000; items *= 10) { final int itemsF = items; testS("ListQuery: query with " + items + " items", 100 / (items / 1000), () -> { diff --git a/src/test/java/it/cavallium/strangedb/tests/QueryTests.java b/src/test/java/it/cavallium/strangedb/tests/QueryTests.java index 9d4aaad..76b24cf 100644 --- a/src/test/java/it/cavallium/strangedb/tests/QueryTests.java +++ b/src/test/java/it/cavallium/strangedb/tests/QueryTests.java @@ -1,6 +1,7 @@ package it.cavallium.strangedb.tests; import it.cavallium.strangedb.java.database.DatabaseJava; +import it.cavallium.strangedb.java.objects.lists.ElementsArrayList; import it.cavallium.strangedb.java.objects.lists.ListQuery; import it.cavallium.strangedb.java.objects.lists.ValuePointer; import it.cavallium.strangedb.java.objects.lists.operations.Equals; @@ -31,17 +32,21 @@ public class QueryTests { path2 = Files.createTempFile("db-tests-blocks-", ".db"); path3 = Files.createTempFile("db-tests-references-", ".db"); db = new DatabaseJava(path1, path2, path3); + int i = 0; + db.getObjectsIO().registerClass(UserFullInfo.class, i++); + db.getObjectsIO().registerClass(User.class, i++); + db.getObjectsIO().registerClass(ListContainer.class, i++); } @Test public void shouldCreateListAndQuery() throws IOException { - ListContainer root = db.loadRoot((db) -> new ListContainer(db, 1000)); + ListContainer root = db.loadRoot((db) -> new ListContainer(db, 2000)); ListQuery query = ListQuery.create(ValuePointer.ofField(User.class, "firstName"), Equals.to(constantFirstName)) .and(ValuePointer.ofField(User.class, "username"), Equals.to(constantUsername)) .and(ValuePointer.ofField(User.class, "fullInfo").field(UserFullInfo.class, "bio"), Equals.to(constantBio)); long time1 = System.currentTimeMillis(); - ArrayList elements = root.usersList.query(query).asList(); - System.out.println("Time elapsed: " + (System.currentTimeMillis() - time1)); + ElementsArrayList elements = root.usersList.query(query); + System.out.println("Time elapsed: " + String.format("%.2f", (System.currentTimeMillis() - time1) / 1000d) + " seconds"); System.out.println("Found " + elements.size() + " elements. First 5 items:"); assertNotEquals(elements.size(), 0); for (int i = 0; i < (elements.size() > 10 ? 10 : elements.size()); i++) { diff --git a/strangedb-core b/strangedb-core new file mode 160000 index 0000000..b425e4c --- /dev/null +++ b/strangedb-core @@ -0,0 +1 @@ +Subproject commit b425e4c12901dd277f944bcf1b0b0f245d8d23b5