Skip to content
31 changes: 21 additions & 10 deletions eternaleconomy-core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -56,22 +56,29 @@ dependencies {
paperLibrary("eu.okaeri:okaeri-configs-serdes-bukkit:${Versions.OKAERI_CONFIGS}")

paperLibrary("com.github.cryptomorin:XSeries:13.6.0")
paperLibrary("com.github.ben-manes.caffeine:caffeine:3.2.3")

compileOnly("me.clip:placeholderapi:${Versions.PLACEHOLDER_API}")
compileOnly("com.github.ben-manes.caffeine:caffeine:3.2.3")

testImplementation(platform("org.junit:junit-bom:6.0.2"))
testImplementation("org.junit.jupiter:junit-jupiter")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
testImplementation("com.github.ben-manes.caffeine:caffeine:3.2.3")
testImplementation("com.google.guava:guava:33.5.0-jre")

jmh("org.openjdk.jmh:jmh-core:1.37")
jmh("org.openjdk.jmh:jmh-generator-annprocess:1.37")
jmh("org.openjdk.jmh:jmh-generator-bytecode:1.37")
}
jmh("io.papermc.paper:paper-api:${Versions.PAPER_API}")

jmh("com.eternalcode:eternalcode-commons-adventure:${Versions.ETERNALCODE_COMMONS}")
jmh("com.eternalcode:eternalcode-commons-bukkit:${Versions.ETERNALCODE_COMMONS}")
jmh("com.eternalcode:eternalcode-commons-shared:${Versions.ETERNALCODE_COMMONS}")
jmh("com.github.MilkBowl:VaultAPI:${Versions.VAULT_API}")

tasks.test {
useJUnitPlatform()
jmh("eu.okaeri:okaeri-configs-yaml-snakeyaml:${Versions.OKAERI_CONFIGS}")
jmh("eu.okaeri:okaeri-configs-serdes-commons:${Versions.OKAERI_CONFIGS}")
jmh("eu.okaeri:okaeri-configs-serdes-bukkit:${Versions.OKAERI_CONFIGS}")
}

paper {
Expand Down Expand Up @@ -110,16 +117,20 @@ tasks.runServer {
}
}

tasks.shadowJar {
archiveFileName.set("EternalEconomy v${project.version}.jar")
paper {

tasks.shadowJar {
archiveFileName.set("EternalEconomy v${project.version}.jar")

exclude(
"org/intellij/lang/annotations/**",
"org/jetbrains/annotations/**"
)
exclude(
"org/intellij/lang/annotations/**",
"org/jetbrains/annotations/**"
)

// val prefix = "com.eternalcode.economy.libs"
// listOf(
//
// ).forEach { relocate(it, prefix) }
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.eternalcode.economy.SchedulerImpl;
import com.eternalcode.economy.account.database.AccountRepositoryInMemory;
import com.eternalcode.economy.config.implementation.PluginConfig;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
Expand All @@ -22,15 +23,18 @@ public class AccountBenchmark {

private final List<String> searches = new ArrayList<>();
private AccountManager accountManager;
// mimo że nie jest to bezpieczne dla wielu wątków, to w przypadku JMH można to zignorować i tak potrzebujemy losowości
// mimo że nie jest to bezpieczne dla wielu wątków, to w przypadku JMH można to
// zignorować i tak potrzebujemy losowości
private int index = 0;

@Setup
public void setUp() {
accountManager = new AccountManager(new AccountRepositoryInMemory(), new SchedulerImpl());
accountManager = new AccountManager(new AccountRepositoryInMemory(), new PluginConfig(), LOGGER);

// zapełnienie TreeMapy różnymi nazwami zapewnia, że będzie ona miała optymalne wyniki
// tree mapa rozdziela elementy na podstawie ich klucza, więc im bardziej zróżnicowane klucze, tym "lepsze' wyniki
// zapełnienie TreeMapy różnymi nazwami zapewnia, że będzie ona miała optymalne
// wyniki
// tree mapa rozdziela elementy na podstawie ich klucza, więc im bardziej
// zróżnicowane klucze, tym "lepsze' wyniki
for (char first : ALPHABET) {
for (char second : ALPHABET) {
for (char third : ALPHABET) {
Expand All @@ -41,7 +45,8 @@ public void setUp() {
}
}

// pre-generowanie losowych wyszukiwań, które będą wykonywane w benchmarku (nie wpływamy na czas wykonania samego benchmarku)
// pre-generowanie losowych wyszukiwań, które będą wykonywane w benchmarku (nie
// wpływamy na czas wykonania samego benchmarku)
for (char first : ALPHABET) {
searches.add(String.valueOf(first));
for (char second : ALPHABET) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.eternalcode.economy.account;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;

import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.NavigableMap;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Fork(value = 1, warmups = 1)
@Warmup(iterations = 2, time = 1)
@Measurement(iterations = 3, time = 1)
public class AccountManagerBenchmark {

private Map<String, String> hashMap;
private NavigableMap<String, String> skipListMap;
private String searchPrefix;

@Setup(Level.Trial)
public void setup() {
this.hashMap = new ConcurrentHashMap<>();
this.skipListMap = new ConcurrentSkipListMap<>(String.CASE_INSENSITIVE_ORDER);
this.searchPrefix = "Player_50";

// Generate 100,000 accounts
for (int i = 0; i < 100_000; i++) {
String name = "Player_" + i;
this.hashMap.put(name, name);
this.skipListMap.put(name, name);
}
}

@Benchmark
public void testStreamFilter(Blackhole blackhole) {
Collection<String> result = this.hashMap.values().stream()
.filter(name -> name.toLowerCase().startsWith(this.searchPrefix.toLowerCase()))
.collect(Collectors.toList());
blackhole.consume(result);
}

@Benchmark
public void testSubMap(Blackhole blackhole) {
Collection<String> result = Collections.unmodifiableCollection(
this.skipListMap.subMap(this.searchPrefix, true, this.searchPrefix + Character.MAX_VALUE, true)
.values());
blackhole.consume(result);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.eternalcode.economy.format;

import com.eternalcode.economy.config.implementation.PluginConfig;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;

@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS) // Faster operations, so nanos are better
@Fork(value = 1, warmups = 1)
@Warmup(iterations = 2, time = 1)
@Measurement(iterations = 3, time = 1)
public class DecimalFormatterBenchmark {

private DecimalFormatter formatter;
private DecimalFormat decimalFormat;
private double smallValue;
private double largeValue;
private BigDecimal smallBigDecimal;

@Setup
public void setup() {
this.formatter = new DecimalFormatterImpl(new PluginConfig());
this.decimalFormat = new DecimalFormat("#,##0.00");

this.smallValue = 123.456;
this.largeValue = 123456789.123456;

this.smallBigDecimal = BigDecimal.valueOf(this.smallValue);
}

@Benchmark
public void testFormatterSmall(Blackhole blackhole) {
blackhole.consume(this.formatter.format(this.smallValue));
}

@Benchmark
public void testFormatterLarge(Blackhole blackhole) {
blackhole.consume(this.formatter.format(this.largeValue));
}

@Benchmark
public void testDecimalFormatSmall(Blackhole blackhole) {
blackhole.consume(this.decimalFormat.format(this.smallValue));
}

@Benchmark
public void testDecimalFormatLarge(Blackhole blackhole) {
blackhole.consume(this.decimalFormat.format(this.largeValue));
}

@Benchmark
public void testBigDecimalToStringSmall(Blackhole blackhole) {
blackhole.consume(this.smallBigDecimal.toPlainString());
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.eternalcode.economy.leaderboard;

import com.eternalcode.economy.SchedulerImpl;
import com.eternalcode.economy.account.Account;
import com.eternalcode.economy.account.AccountManager;
import com.eternalcode.economy.account.AccountPaymentService;
Expand All @@ -13,6 +12,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.apache.commons.math3.distribution.ParetoDistribution;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
Expand All @@ -39,12 +39,6 @@ public class LeaderboardServiceBenchmark {
private static final int PAGE_SIZE = 100;
private static final int MAX_PAGES = 50;

@Param({"100000", "1000000", "2000000"})
private int accountsCount;

private LeaderboardService leaderboardService;
private List<Account> targetAccounts = new ArrayList<>();

private static final String[] FIRST_NAMES = {
"Alex", "Ben", "Chris", "Dana", "Emma", "Finn", "Grace", "Hannah", "Ian", "Jake",
"Kara", "Liam", "Mia", "Noah", "Olivia", "Paul", "Quinn", "Rose", "Sam", "Tina"
Expand All @@ -54,12 +48,19 @@ public class LeaderboardServiceBenchmark {
"Wolf", "Dragon", "Shadow", "Rider", "Blaze"
};

private final List<Account> targetAccounts = new ArrayList<>();

@Param({"100000", "1000000", "2000000"})
private int accountsCount;
private LeaderboardService leaderboardService;

@Setup(Level.Trial)
public void setUp() {
AccountRepositoryInMemory repository = new AccountRepositoryInMemory();
AccountManager accountManager = new AccountManager(repository, new SchedulerImpl());
AccountPaymentService paymentService = new AccountPaymentService(accountManager, new PluginConfig());
this.leaderboardService = accountManager;
PluginConfig config = new PluginConfig();
AccountManager accountManager = new AccountManager(repository, config, Logger.getLogger("Benchmark"));
AccountPaymentService paymentService = new AccountPaymentService(accountManager, config);
this.leaderboardService = accountManager.getLeaderboardService();

ParetoDistribution pareto = new ParetoDistribution(1.0, 2.0);
ThreadLocalRandom random = ThreadLocalRandom.current();
Expand Down
Loading