Skip to content

Commit 06d17ac

Browse files
committed
faster: manual << → JVM VarHandle
1 parent 1dad6e9 commit 06d17ac

File tree

4 files changed

+43
-28
lines changed

4 files changed

+43
-28
lines changed

src/main/java/com/trivago/fastutilconcurrentwrapper/io/BAIS.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.trivago.fastutilconcurrentwrapper.io;
22

3+
import com.trivago.fastutilconcurrentwrapper.util.JBytes;
34
import it.unimi.dsi.fastutil.io.MeasurableStream;
45
import it.unimi.dsi.fastutil.io.RepositionableStream;
56
import jakarta.validation.constraints.PositiveOrZero;
@@ -175,7 +176,10 @@ public char readChar() {
175176

176177
@Override
177178
public int readInt() {
178-
return read() << 24 | ((read() & 0xFF) << 16) | ((read() & 0xFF) << 8) | (read() & 0xFF);
179+
//return read() << 24 | ((read() & 0xFF) << 16) | ((read() & 0xFF) << 8) | (read() & 0xFF);
180+
int v = JBytes.DirectByteArrayAccess.getInt(buf, pos);
181+
pos += 4;
182+
return v;
179183
}
180184

181185
public int readMedium () {
@@ -193,7 +197,10 @@ public UUID readUUID () {
193197

194198
@Override
195199
public long readLong () {
196-
return (long) readInt() << 32 | (readInt() & 0xFFFF_FFFFL);
200+
//return (long) readInt() << 32 | (readInt() & 0xFFFF_FFFFL);
201+
long v = JBytes.DirectByteArrayAccess.getLong(buf, pos);
202+
pos += 8;
203+
return v;
197204
}
198205

199206
@Override

src/main/java/com/trivago/fastutilconcurrentwrapper/io/BAOS.java

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.trivago.fastutilconcurrentwrapper.io;
22

33
import com.google.errorprone.annotations.CanIgnoreReturnValue;
4+
import com.trivago.fastutilconcurrentwrapper.util.JBytes;
45
import it.unimi.dsi.fastutil.Arrays;
56
import it.unimi.dsi.fastutil.bytes.ByteArrays;
67
import it.unimi.dsi.fastutil.io.MeasurableStream;
@@ -145,6 +146,7 @@ public void resize (@PositiveOrZero int targetCapacity) {
145146
/// @see org.springframework.util.ResizableByteArrayOutputStream#grow(int)
146147
public void grow (@PositiveOrZero int additionalCapacity) {
147148
//Assert.isTrue(additionalCapacity >= 0, "Additional capacity must be 0 or higher");
149+
if (count < position) additionalCapacity = additionalCapacity + position - count;
148150
int needed = count + additionalCapacity;
149151
if (needed > buf.length){// size + new > capacity
150152
int newCapacity = (int)Math.min(Math.max((long)buf.length + (buf.length >> 1), needed), Arrays.MAX_ARRAY_SIZE);
@@ -182,36 +184,36 @@ public void writeTo (OutputStream out) throws IOException {
182184

183185

184186
@Override
185-
public void writeBoolean(boolean v) {
187+
public void writeBoolean(boolean v) {
186188
write(v?1:0);
187189
}
188190

189191
@Override
190-
public void writeByte(int v) {
192+
public void writeByte(int v) {
191193
write(v);
192194
}
193195

194196
@Override
195-
public void writeShort(int v) {
197+
public void writeShort(int v) {
196198
write(v >> 8);
197199
write(v);
198200
}
199201

200202
@Override
201-
public void writeChar(int v) {
203+
public void writeChar(int v) {
202204
write(v >> 8);
203205
write(v);
204206
}
205207

206208
@Override
207-
public void writeInt(int v) {
208-
write(v >> 24);
209-
write(v >> 16);
210-
write(v >> 8);
211-
write(v);
209+
public void writeInt (int v) {
210+
grow(4);
211+
JBytes.DirectByteArrayAccess.setInt(buf, position, v);
212+
position += 4;
213+
if (count < position) count = position;
212214
}
213215

214-
public void writeMedium (int v) {
216+
public void writeMedium (int v) {
215217
write(v >> 16);
216218
write(v >> 8);
217219
write(v);
@@ -223,18 +225,20 @@ public void writeUUID (UUID uuid) {
223225
}
224226

225227
@Override
226-
public void writeLong (long v) {
227-
writeInt((int)(v >> 32));
228-
writeInt((int) v);
228+
public void writeLong (long v) {
229+
grow(8);
230+
JBytes.DirectByteArrayAccess.setLong(buf, position, v);
231+
position += 8;
232+
if (count < position) count = position;
229233
}
230234

231235
@Override
232-
public void writeFloat(float v) {
236+
public void writeFloat(float v) {
233237
writeInt(Float.floatToIntBits(v));
234238
}
235239

236240
@Override
237-
public void writeDouble(double v) {
241+
public void writeDouble(double v) {
238242
writeLong(Double.doubleToLongBits(v));
239243
}
240244

src/test/java/com/trivago/fastutilconcurrentwrapper/io/BAOSTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -890,7 +890,7 @@ void _setArray () {
890890
assertEquals(2, o.position());
891891
assertEquals(2, o.writerIndex());
892892
o.writeLong(0x1234567812345678L);
893-
assertEquals(13, o.capacity());
893+
assertEquals(10, o.capacity());
894894
assertEquals(10, o.size());
895895
assertEquals(10, o.length());
896896
assertEquals(10, o.position());
@@ -926,30 +926,30 @@ void _spring_ResizableByteArrayOutputStream () {
926926

927927
o.grow(20);
928928
assertEquals("0123456789", o.toString());
929-
assertEquals(30, o.capacity());
929+
assertEquals(47, o.capacity());
930930
assertEquals(10, o.size());
931931
assertEquals(10, o.length());
932932
assertEquals(27, o.position());
933933
assertEquals(27, o.writerIndex());
934934

935935
o.grow(100);
936936
assertEquals("0123456789", o.toString());
937-
assertEquals(110, o.capacity());// 10 было занято и 100 сверху
937+
assertEquals(127, o.capacity());// 10 было занято и 100 сверху
938938
assertEquals(10, o.size());
939939

940940
o.grow(10);
941941
assertEquals("0123456789", o.toString());
942-
assertEquals(110, o.capacity());
942+
assertEquals(127, o.capacity());
943943
assertEquals(10, o.size());
944944

945945
o.writerIndex(109);
946946
o.write('x');
947-
assertEquals(110, o.capacity());
947+
assertEquals(127, o.capacity());
948948
assertEquals(110, o.size());
949949
assertEquals(110, o.position());
950950

951-
o.grow(10);
952-
assertEquals(165, o.capacity());// 110 * 1.5 = 165
951+
o.grow(30);
952+
assertEquals(190, o.capacity());// 127 * 1.5 = 190
953953
assertEquals(110, o.size());
954954
}
955955

src/test/java/com/trivago/fastutilconcurrentwrapper/io/FastByteArrayStreamsTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,14 @@ void testEOF () throws UTFDataFormatException {
157157
assertEquals(-1, r.readShort());
158158
assertEquals(0xFFFF, r.readUnsignedShort());
159159
assertEquals(0xFFFF, r.readChar());
160-
assertEquals(-1, r.readInt());
161-
assertEquals(-1, r.readLong());
162-
assertEquals(Float.NaN, r.readFloat());
163-
assertEquals(Double.NaN, r.readDouble());
160+
//assertEquals(-1, r.readInt());
161+
assertThrows(ArrayIndexOutOfBoundsException.class, r::readInt);
162+
//assertEquals(-1, r.readLong());
163+
assertThrows(ArrayIndexOutOfBoundsException.class, r::readLong);
164+
//assertEquals(Float.NaN, r.readFloat());
165+
assertThrows(ArrayIndexOutOfBoundsException.class, r::readFloat);
166+
//assertEquals(Double.NaN, r.readDouble());
167+
assertThrows(ArrayIndexOutOfBoundsException.class, r::readDouble);
164168
assertNull(r.readLine());
165169
assertNull(r.readUTF());
166170
}

0 commit comments

Comments
 (0)