Skip to content

Commit f4e5f96

Browse files
BridgeARlpinca
authored andcommitted
buffer: improve write(U)Int functions
This improves the performance of some write functions by around 5-15%. PR-URL: #19289 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent d59e249 commit f4e5f96

File tree

2 files changed

+55
-32
lines changed

2 files changed

+55
-32
lines changed

benchmark/buffers/buffer-write.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const INT32 = 0x7fffffff;
3434
const INT48 = 0x7fffffffffff;
3535
const UINT8 = 0xff;
3636
const UINT16 = 0xffff;
37+
const UINT32 = 0xffffffff;
3738

3839
const mod = {
3940
writeInt8: INT8,
@@ -44,8 +45,8 @@ const mod = {
4445
writeUInt8: UINT8,
4546
writeUInt16BE: UINT16,
4647
writeUInt16LE: UINT16,
47-
writeUInt32BE: INT32,
48-
writeUInt32LE: INT32,
48+
writeUInt32BE: UINT32,
49+
writeUInt32LE: UINT32,
4950
writeUIntLE: INT8,
5051
writeUIntBE: INT16,
5152
writeIntLE: INT32,

lib/internal/buffer.js

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -481,9 +481,12 @@ function writeU_Int48LE(buf, value, offset, min, max) {
481481

482482
const newVal = Math.floor(value * 2 ** -32);
483483
buf[offset++] = value;
484-
buf[offset++] = (value >>> 8);
485-
buf[offset++] = (value >>> 16);
486-
buf[offset++] = (value >>> 24);
484+
value = value >>> 8;
485+
buf[offset++] = value;
486+
value = value >>> 8;
487+
buf[offset++] = value;
488+
value = value >>> 8;
489+
buf[offset++] = value;
487490
buf[offset++] = newVal;
488491
buf[offset++] = (newVal >>> 8);
489492
return offset;
@@ -495,9 +498,12 @@ function writeU_Int40LE(buf, value, offset, min, max) {
495498

496499
const newVal = value;
497500
buf[offset++] = value;
498-
buf[offset++] = (value >>> 8);
499-
buf[offset++] = (value >>> 16);
500-
buf[offset++] = (value >>> 24);
501+
value = value >>> 8;
502+
buf[offset++] = value;
503+
value = value >>> 8;
504+
buf[offset++] = value;
505+
value = value >>> 8;
506+
buf[offset++] = value;
501507
buf[offset++] = Math.floor(newVal * 2 ** -32);
502508
return offset;
503509
}
@@ -507,9 +513,12 @@ function writeU_Int32LE(buf, value, offset, min, max) {
507513
checkInt(value, min, max, buf, offset, 3);
508514

509515
buf[offset++] = value;
510-
buf[offset++] = (value >>> 8);
511-
buf[offset++] = (value >>> 16);
512-
buf[offset++] = (value >>> 24);
516+
value = value >>> 8;
517+
buf[offset++] = value;
518+
value = value >>> 8;
519+
buf[offset++] = value;
520+
value = value >>> 8;
521+
buf[offset++] = value;
513522
return offset;
514523
}
515524

@@ -522,8 +531,10 @@ function writeU_Int24LE(buf, value, offset, min, max) {
522531
checkInt(value, min, max, buf, offset, 2);
523532

524533
buf[offset++] = value;
525-
buf[offset++] = (value >>> 8);
526-
buf[offset++] = (value >>> 16);
534+
value = value >>> 8;
535+
buf[offset++] = value;
536+
value = value >>> 8;
537+
buf[offset++] = value;
527538
return offset;
528539
}
529540

@@ -582,34 +593,43 @@ function writeU_Int48BE(buf, value, offset, min, max) {
582593
const newVal = Math.floor(value * 2 ** -32);
583594
buf[offset++] = (newVal >>> 8);
584595
buf[offset++] = newVal;
585-
buf[offset++] = (value >>> 24);
586-
buf[offset++] = (value >>> 16);
587-
buf[offset++] = (value >>> 8);
588-
buf[offset++] = value;
589-
return offset;
596+
buf[offset + 3] = value;
597+
value = value >>> 8;
598+
buf[offset + 2] = value;
599+
value = value >>> 8;
600+
buf[offset + 1] = value;
601+
value = value >>> 8;
602+
buf[offset] = value;
603+
return offset + 4;
590604
}
591605

592606
function writeU_Int40BE(buf, value, offset, min, max) {
593607
value = +value;
594608
checkInt(value, min, max, buf, offset, 4);
595609

596610
buf[offset++] = Math.floor(value * 2 ** -32);
597-
buf[offset++] = (value >>> 24);
598-
buf[offset++] = (value >>> 16);
599-
buf[offset++] = (value >>> 8);
600-
buf[offset++] = value;
601-
return offset;
611+
buf[offset + 3] = value;
612+
value = value >>> 8;
613+
buf[offset + 2] = value;
614+
value = value >>> 8;
615+
buf[offset + 1] = value;
616+
value = value >>> 8;
617+
buf[offset] = value;
618+
return offset + 4;
602619
}
603620

604621
function writeU_Int32BE(buf, value, offset, min, max) {
605622
value = +value;
606623
checkInt(value, min, max, buf, offset, 3);
607624

608-
buf[offset++] = (value >>> 24);
609-
buf[offset++] = (value >>> 16);
610-
buf[offset++] = (value >>> 8);
611-
buf[offset++] = value;
612-
return offset;
625+
buf[offset + 3] = value;
626+
value = value >>> 8;
627+
buf[offset + 2] = value;
628+
value = value >>> 8;
629+
buf[offset + 1] = value;
630+
value = value >>> 8;
631+
buf[offset] = value;
632+
return offset + 4;
613633
}
614634

615635
function writeUInt32BE(value, offset) {
@@ -620,10 +640,12 @@ function writeU_Int24BE(buf, value, offset, min, max) {
620640
value = +value;
621641
checkInt(value, min, max, buf, offset, 2);
622642

623-
buf[offset++] = (value >>> 16);
624-
buf[offset++] = (value >>> 8);
625-
buf[offset++] = value;
626-
return offset;
643+
buf[offset + 2] = value;
644+
value = value >>> 8;
645+
buf[offset + 1] = value;
646+
value = value >>> 8;
647+
buf[offset] = value;
648+
return offset + 3;
627649
}
628650

629651
function writeU_Int16BE(buf, value, offset, min, max) {

0 commit comments

Comments
 (0)