-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBenchmark.java
More file actions
154 lines (130 loc) · 5.7 KB
/
Copy pathBenchmark.java
File metadata and controls
154 lines (130 loc) · 5.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package fastascii.benchmark;
import fastascii.FastASCIIReader;
import fastascii.FastASCIIScanner;
import fastascii.FastASCIIWriter;
import fastascii.FastUTF8;
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 java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Thread)
@Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(1)
public class Benchmark {
private byte[] smallBuffer;
private byte[] largeBuffer;
private byte[] integerBuffer;
private byte[] ansiBuffer;
private String smallString;
private String largeString;
private String integerString;
private String ansiString;
@Setup
public void setup() {
// Small buffer (typical ANSI code size)
smallBuffer = "Hello World FastASCII!".getBytes(StandardCharsets.UTF_8);
smallString = new String(smallBuffer, StandardCharsets.UTF_8);
// Large buffer (log file size)
largeBuffer = """
[INFO] 2024-01-15 10:30:45,123 main.java.Server - Starting server on port 8080
[INFO] 2024-01-15 10:30:45,124 main.java.Server - Loading configuration from config.yml
[WARN] 2024-01-15 10:30:45,125 main.java.Config - Missing optional setting: max_connections
[INFO] 2024-01-15 10:30:45,126 main.java.Server - Database connection established
[INFO] 2024-01-15 10:30:45,127 main.java.Server - HTTP listener started
[DEBUG] 2024-01-15 10:30:45,128 main.java.Request - Incoming request: GET /api/users
[INFO] 2024-01-15 10:30:45,129 main.java.Request - Request processed in 2ms
[ERROR] 2024-01-15 10:30:45,130 main.java.Auth - Invalid token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
[WARN] 2024-01-15 10:30:45,131 main.java.Auth - Rate limit exceeded for IP: 192.168.1.100
[INFO] 2024-01-15 10:30:45,132 main.java.Server - Server running. Uptime: 0 days, 0 hours, 0 minutes
""".getBytes(StandardCharsets.UTF_8);
largeString = new String(largeBuffer, StandardCharsets.UTF_8);
// Integer parsing
integerBuffer = "1234567890".getBytes(StandardCharsets.UTF_8);
integerString = new String(integerBuffer, StandardCharsets.UTF_8);
// ANSI escape sequence
ansiBuffer = "\u001B[31mError:\u001B[0m Connection failed".getBytes(StandardCharsets.UTF_8);
ansiString = new String(ansiBuffer, StandardCharsets.UTF_8);
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkFastASCIIWriteInt() {
byte[] buffer = new byte[16];
return FastASCIIWriter.writeInt(buffer, 0, 12345);
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkJavaIntToString() {
return Integer.toString(12345).getBytes(StandardCharsets.UTF_8).length;
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkFastASCIIParseUInt() {
return FastASCIIReader.parseUInt(integerBuffer, 0, integerBuffer.length);
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkJavaIntegerParseInt() {
return Integer.parseInt(integerString);
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkFastASCIIFindByte() {
return FastASCIIScanner.find(smallBuffer, 0, smallBuffer.length, (byte) 'F');
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkJavaStringIndexOf() {
return smallString.indexOf('F');
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkFastASCIIFindSubstring() {
return FastASCIIScanner.find(smallBuffer, 0, smallBuffer.length, "Fast".getBytes(StandardCharsets.UTF_8));
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkJavaStringIndexOfSubstring() {
return smallString.indexOf("Fast");
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkFastASCIIWriteUtf8() {
byte[] buffer = new byte[16];
return FastASCIIWriter.writeUtf8(buffer, 0, 0x1F680); // 🚀
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkJavaStringGetBytes() {
return "🚀".getBytes(StandardCharsets.UTF_8).length;
}
@org.openjdk.jmh.annotations.Benchmark
public boolean benchmarkFastASCIIValidateUtf8() {
return FastUTF8.validate(largeBuffer, 0, largeBuffer.length);
}
@org.openjdk.jmh.annotations.Benchmark
public boolean benchmarkJavaUtf8Validation() {
try {
new String(largeBuffer, StandardCharsets.UTF_8);
return true;
} catch (Exception e) {
return false;
}
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkFastASCIIDecodeCodePoint() {
int[] codePoint = new int[1];
return FastUTF8.decodeCodePoint(ansiBuffer, 0, ansiBuffer.length, codePoint);
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkJavaStringCodePointAt() {
return ansiString.codePointAt(0);
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkFastASCIILargeBufferSearch() {
return FastASCIIScanner.find(largeBuffer, 0, largeBuffer.length, (byte) 'E');
}
@org.openjdk.jmh.annotations.Benchmark
public int benchmarkJavaLargeBufferSearch() {
return largeString.indexOf('E');
}
}