Skip to content

Commit d986c6c

Browse files
authored
Merge pull request #380 from miniway/directbuf
Refactor MessageBuffer instantiation and add more tests
2 parents ee8c341 + 4ce46a3 commit d986c6c

File tree

2 files changed

+160
-69
lines changed

2 files changed

+160
-69
lines changed

msgpack-core/src/main/java/org/msgpack/core/buffer/MessageBuffer.java

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public static MessageBuffer allocate(int size)
198198
}
199199

200200
/**
201-
* Wraps a ByteBuffer into a MessageBuffer.
201+
* Wraps a byte array into a MessageBuffer.
202202
*
203203
* The new MessageBuffer will be backed by the given byte array. Modifications to the new MessageBuffer will cause the byte array to be modified and vice versa.
204204
*
@@ -214,7 +214,7 @@ public static MessageBuffer wrap(byte[] array)
214214
}
215215

216216
/**
217-
* Wraps a ByteBuffer into a MessageBuffer.
217+
* Wraps a byte array into a MessageBuffer.
218218
*
219219
* The new MessageBuffer will be backed by the given byte array. Modifications to the new MessageBuffer will cause the byte array to be modified and vice versa.
220220
*
@@ -264,28 +264,7 @@ public static MessageBuffer wrap(ByteBuffer bb)
264264
private static MessageBuffer newMessageBuffer(byte[] arr, int off, int len)
265265
{
266266
checkNotNull(arr);
267-
try {
268-
return (MessageBuffer) mbArrConstructor.newInstance(arr, off, len);
269-
}
270-
catch (InstantiationException e) {
271-
// should never happen
272-
throw new IllegalStateException(e);
273-
}
274-
catch (IllegalAccessException e) {
275-
// should never happen unless security manager restricts this reflection
276-
throw new IllegalStateException(e);
277-
}
278-
catch (InvocationTargetException e) {
279-
if (e.getCause() instanceof RuntimeException) {
280-
// underlaying constructor may throw RuntimeException
281-
throw (RuntimeException) e.getCause();
282-
}
283-
else if (e.getCause() instanceof Error) {
284-
throw (Error) e.getCause();
285-
}
286-
// should never happen
287-
throw new IllegalStateException(e.getCause());
288-
}
267+
return newInstance(mbArrConstructor, arr, off, len);
289268
}
290269

291270
/**
@@ -297,10 +276,21 @@ else if (e.getCause() instanceof Error) {
297276
private static MessageBuffer newMessageBuffer(ByteBuffer bb)
298277
{
299278
checkNotNull(bb);
279+
return newInstance(mbBBConstructor, bb);
280+
}
281+
282+
/**
283+
* Creates a new MessageBuffer instance
284+
*
285+
* @param constructor A MessageBuffer constructor
286+
* @return new MessageBuffer instance
287+
*/
288+
private static MessageBuffer newInstance(Constructor<?> constructor, Object... args)
289+
{
300290
try {
301291
// We need to use reflection to create MessageBuffer instances in order to prevent TypeProfile generation for getInt method. TypeProfile will be
302292
// generated to resolve one of the method references when two or more classes overrides the method.
303-
return (MessageBuffer) mbBBConstructor.newInstance(bb);
293+
return (MessageBuffer) constructor.newInstance(args);
304294
}
305295
catch (InstantiationException e) {
306296
// should never happen

msgpack-core/src/test/scala/org/msgpack/core/MessageUnpackerTest.scala

Lines changed: 145 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,22 @@ class MessageUnpackerTest extends MessagePackSpec {
345345

346346
"be faster then msgpack-v6 skip" taggedAs ("cmp-skip") in {
347347

348+
trait Fixture {
349+
val unpacker: MessageUnpacker
350+
def run {
351+
var count = 0
352+
try {
353+
while (unpacker.hasNext) {
354+
unpacker.skipValue()
355+
count += 1
356+
}
357+
}
358+
finally {
359+
unpacker.close()
360+
}
361+
}
362+
}
363+
348364
val data = testData3(10000)
349365
val N = 100
350366

@@ -367,21 +383,29 @@ class MessageUnpackerTest extends MessagePackSpec {
367383
unpacker.close()
368384
}
369385

370-
block("v7") {
371-
val unpacker = Random.shuffle(unpackers(data)).head
372-
var count = 0
373-
try {
374-
while (unpacker.hasNext) {
375-
unpacker.skipValue()
376-
count += 1
377-
}
378-
}
379-
finally
380-
unpacker.close()
386+
block("v7-array") {
387+
new Fixture { override val unpacker = MessagePack.newDefaultUnpacker(data) }.run
388+
}
389+
390+
block("v7-array-buffer") {
391+
new Fixture {
392+
val bb = ByteBuffer.allocate(data.length)
393+
bb.put(data).flip()
394+
override val unpacker = MessagePack.newDefaultUnpacker(bb)
395+
}.run
396+
}
397+
block("v7-direct-buffer") {
398+
new Fixture {
399+
val db = ByteBuffer.allocateDirect(data.length)
400+
db.put(data).flip()
401+
override val unpacker = MessagePack.newDefaultUnpacker(db)
402+
}.run
381403
}
382404
}
383405

384-
t("v7").averageWithoutMinMax should be <= t("v6").averageWithoutMinMax
406+
t("v7-array").averageWithoutMinMax should be <= t("v6").averageWithoutMinMax
407+
t("v7-array-buffer").averageWithoutMinMax should be <= t("v6").averageWithoutMinMax
408+
t("v7-direct-buffer").averageWithoutMinMax should be <= t("v6").averageWithoutMinMax
385409
}
386410

387411
import org.msgpack.`type`.{ValueType => ValueTypeV6}
@@ -448,6 +472,20 @@ class MessageUnpackerTest extends MessagePackSpec {
448472
unpacker.skipValue()
449473
}
450474
}
475+
trait Fixture {
476+
val unpacker : MessageUnpacker
477+
def run {
478+
var count = 0
479+
try {
480+
while (unpacker.hasNext) {
481+
readValue(unpacker)
482+
count += 1
483+
}
484+
}
485+
finally
486+
unpacker.close()
487+
}
488+
}
451489

452490
val data = testData3(10000)
453491
val N = 100
@@ -469,22 +507,29 @@ class MessageUnpackerTest extends MessagePackSpec {
469507
unpacker.close()
470508
}
471509

472-
block("v7") {
473-
val unpacker = Random.shuffle(unpackers(data)).head
474-
var count = 0
475-
try {
476-
while (unpacker.hasNext) {
477-
readValue(unpacker)
478-
count += 1
479-
}
480-
}
481-
finally
482-
unpacker.close()
510+
block("v7-array") {
511+
new Fixture { override val unpacker = MessagePack.newDefaultUnpacker(data) }.run
483512
}
484-
}
485513

486-
t("v7").averageWithoutMinMax should be <= t("v6").averageWithoutMinMax
514+
block("v7-array-buffer") {
515+
new Fixture {
516+
val bb = ByteBuffer.allocate(data.length)
517+
bb.put(data).flip()
518+
override val unpacker = MessagePack.newDefaultUnpacker(bb)
519+
}.run
520+
}
521+
block("v7-direct-buffer") {
522+
new Fixture {
523+
val db = ByteBuffer.allocateDirect(data.length)
524+
db.put(data).flip()
525+
override val unpacker = MessagePack.newDefaultUnpacker(db)
526+
}.run
527+
}
528+
}
487529

530+
t("v7-array").averageWithoutMinMax should be <= t("v6").averageWithoutMinMax
531+
t("v7-array-buffer").averageWithoutMinMax should be <= t("v6").averageWithoutMinMax
532+
t("v7-direct-buffer").averageWithoutMinMax should be <= t("v6").averageWithoutMinMax
488533

489534
}
490535

@@ -500,6 +545,35 @@ class MessageUnpackerTest extends MessagePackSpec {
500545
}
501546
packer.close()
502547

548+
trait Fixture {
549+
val unpacker : MessageUnpacker
550+
val loop : Int
551+
def run {
552+
var i = 0
553+
try {
554+
while (i < loop) {
555+
val len = unpacker.unpackBinaryHeader()
556+
val out = new Array[Byte](len)
557+
unpacker.readPayload(out, 0, len)
558+
i += 1
559+
}
560+
}
561+
finally
562+
unpacker.close()
563+
}
564+
def runRef {
565+
var i = 0
566+
try {
567+
while (i < loop) {
568+
val len = unpacker.unpackBinaryHeader()
569+
val out = unpacker.readPayloadAsReference(len)
570+
i += 1
571+
}
572+
}
573+
finally
574+
unpacker.close()
575+
}
576+
}
503577
val b = bos.toByteArray
504578
time("unpackBinary", repeat = 100) {
505579
block("v6") {
@@ -513,27 +587,54 @@ class MessageUnpackerTest extends MessagePackSpec {
513587
unpacker.close()
514588
}
515589

516-
block("v7") {
517-
val unpacker = Random.shuffle(unpackers(b)).head
518-
var i = 0
519-
while (i < R) {
520-
val len = unpacker.unpackBinaryHeader()
521-
val out = new Array[Byte](len)
522-
unpacker.readPayload(out, 0, len)
523-
i += 1
524-
}
525-
unpacker.close()
590+
block("v7-array") {
591+
new Fixture {
592+
override val unpacker = MessagePack.newDefaultUnpacker(b)
593+
override val loop = R
594+
}.run
526595
}
527596

528-
block("v7-ref") {
529-
val unpacker = Random.shuffle(unpackers(b)).head
530-
var i = 0
531-
while (i < R) {
532-
val len = unpacker.unpackBinaryHeader()
533-
val out = unpacker.readPayloadAsReference(len)
534-
i += 1
535-
}
536-
unpacker.close()
597+
block("v7-array-buffer") {
598+
new Fixture {
599+
val bb = ByteBuffer.allocate(b.length)
600+
bb.put(b).flip()
601+
override val unpacker = MessagePack.newDefaultUnpacker(bb)
602+
override val loop = R
603+
}.run
604+
}
605+
606+
block("v7-direct-buffer") {
607+
new Fixture {
608+
val db = ByteBuffer.allocateDirect(b.length)
609+
db.put(b).flip()
610+
override val unpacker = MessagePack.newDefaultUnpacker(db)
611+
override val loop = R
612+
}.run
613+
}
614+
615+
block("v7-ref-array") {
616+
new Fixture {
617+
override val unpacker = MessagePack.newDefaultUnpacker(b)
618+
override val loop = R
619+
}.run
620+
}
621+
622+
block("v7-ref-array-buffer") {
623+
new Fixture {
624+
val bb = ByteBuffer.allocate(b.length)
625+
bb.put(b).flip()
626+
override val unpacker = MessagePack.newDefaultUnpacker(bb)
627+
override val loop = R
628+
}.run
629+
}
630+
631+
block("v7-ref-direct-buffer") {
632+
new Fixture {
633+
val db = ByteBuffer.allocateDirect(b.length)
634+
db.put(b).flip()
635+
override val unpacker = MessagePack.newDefaultUnpacker(db)
636+
override val loop = R
637+
}.run
537638
}
538639
}
539640
}

0 commit comments

Comments
 (0)