aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorkarthikeyan97 <skarthikeyan046@gmail.com>2024-01-24 00:51:52 +0530
committerGitHub <noreply@github.com>2024-01-23 20:21:52 +0100
commit292edc629f8092112ec75f2950e80e289a6dd745 (patch)
tree571e756255ffc266cefdd1723acb4c5c75ae9c41 /src/main/java
parent6c0949969a5df71df85397ce3338f0154e6727ac (diff)
fine tuning performance further (#526)
* final comit changing using mappedbytebuffer changes before using unsafe address using unsafe * using graalvm,correct unsafe mem implementation --------- Co-authored-by: Karthikeyans <karthikeyan.sn@zohocorp.com>
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/dev/morling/onebrc/CalculateAverage_karthikeyan97.java101
1 files changed, 46 insertions, 55 deletions
diff --git a/src/main/java/dev/morling/onebrc/CalculateAverage_karthikeyan97.java b/src/main/java/dev/morling/onebrc/CalculateAverage_karthikeyan97.java
index 7014b12..de151c1 100644
--- a/src/main/java/dev/morling/onebrc/CalculateAverage_karthikeyan97.java
+++ b/src/main/java/dev/morling/onebrc/CalculateAverage_karthikeyan97.java
@@ -125,7 +125,7 @@ public class CalculateAverage_karthikeyan97 {
final long mappedAddress = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, raf.length(), Arena.global()).address();
long length = raf.length();
final long endAddress = mappedAddress + length - 1;
- int cores = length > 1000 ? Runtime.getRuntime().availableProcessors() * 2 : 1;
+ int cores = length > 1000 ? Runtime.getRuntime().availableProcessors() : 1;
long boundary[][] = new long[cores][2];
long segments = length / (cores);
long before = -1;
@@ -145,25 +145,21 @@ public class CalculateAverage_karthikeyan97 {
boundary[cores - 1][0] = before + 1;
boundary[cores - 1][1] = length - 1;
- Field f = Unsafe.class.getDeclaredField("theUnsafe");
- f.setAccessible(true);
- Unsafe unsafe = (Unsafe) f.get(null);
-
- int l3Size = (13 * 1024 * 1024);// unsafe.l3Size();
+ int l3Size = (12 * 1024 * 1024);// unsafe.l3Size();
System.out.println(new TreeMap((Arrays.stream(boundary).parallel().map(i -> {
- FileInputStream fileInputStream = null;
try {
int seglen = (int) (i[1] - i[0] + 1);
- HashMap<modifiedbytearray, MeasurementAggregator> resultmap = new HashMap<>(1000);
+ HashMap<modifiedbytearray, MeasurementAggregator> resultmap = new HashMap<>(4000);
long segstart = mappedAddress + i[0];
int bytesRemaining = seglen;
long num = 0;
- int sign = 1;
boolean isNumber = false;
byte bi;
+ int sign = 1;
modifiedbytearray stationName = null;
int hascode = 5381;
+ // System.out.println("start:" + System.nanoTime() / 1000000);
while (bytesRemaining > 0) {
int bytesptr = 0;
// int bytesread = buffer.remaining() > l3Size ? l3Size : buffer.remaining();
@@ -178,64 +174,59 @@ public class CalculateAverage_karthikeyan97 {
while (bytesptr < actualReadSize) {
bi = readArr[bytesptr++];// UNSAFE.getByte(segstart + bytesReading++);
if (!isNumber) {
- if (bi >= 192) {
- hascode = (hascode << 5) + hascode ^ bi;
- }
- else if (bi == 59) {
- isNumber = true;
- stationName = new modifiedbytearray(readArr, bbstart, bytesptr - 2, hascode & 0xFFFFFFFF);
- bbstart = 0;
- hascode = 5381;
- if (bytesptr >= readSize) {
- break;
- }
- }
- else {
+ while (bi != 59) {
hascode = (hascode << 5) + hascode ^ bi;
+ bi = readArr[bytesptr++];
}
+ isNumber = true;
+ stationName = new modifiedbytearray(readArr, bbstart, bytesptr - 2, hascode & 0xFFFFFFFF);
+ bbstart = 0;
+ hascode = 5381;
}
else {
- switch (bi) {
- case 0x2E:
- break;
- case 0x2D:
+ while (bi != 10) {
+ if (bi == 0x2D) {
sign = -1;
- break;
- case 10:
- hascode = 5381;
- isNumber = false;
- bbstart = bytesptr;
- MeasurementAggregator agg = resultmap.get(stationName);
- num *= sign;
- if (agg == null) {
- agg = new MeasurementAggregator();
- agg.min = num;
- agg.max = num;
- agg.sum = (long) (num);
- agg.count = 1;
- resultmap.put(stationName, agg);
- }
- else {
- if (agg.min >= num) {
- agg.min = num;
- }
- if (agg.max <= num) {
- agg.max = num;
- }
- agg.sum += (long) (num);
- agg.count++;
- }
- num = 0;
- sign = 1;
- break;
- default:
+ }
+ else if (bi != 0x2E) {
num = num * 10 + (bi - 0x30);
+ }
+ bi = readArr[bytesptr++];
+ }
+ hascode = 5381;
+ isNumber = false;
+ bbstart = bytesptr;
+ num *= sign;
+ MeasurementAggregator agg = resultmap.get(stationName);
+ if (agg == null) {
+ agg = new MeasurementAggregator();
+ agg.min = num;
+ agg.max = num;
+ agg.sum = (long) (num);
+ agg.count = 1;
+ resultmap.put(stationName, agg);
+ }
+ else {
+ if (agg.min >= num) {
+ agg.min = num;
+ }
+ if (agg.max <= num) {
+ agg.max = num;
+ }
+ agg.sum += (long) (num);
+ agg.count++;
+ }
+ num = 0;
+ sign = 1;
+ if (bytesptr >= readSize) {
+ break;
}
}
}
bytesRemaining -= bytesptr;
segstart += bytesptr;
}
+ // System.out.println("end:" + System.nanoTime() / 1000000);
/*
* while (bytesReading < (i[1] - i[0] + 1) && buffer.position() < buffer.limit()) {
* buffer.clear();