buffer: up to 2x times faster copy of buffers
%TypedArray%.prototype.set
is able to copy data between ArrayBuffer
a lot faster. This allows us to speed up Buffer.copy
and Buffer.concat
by 2x in some cases.
benchmarks
node@master vs node@pr
confidence improvement accuracy (*) (**) (***)
buffers/buffer-copy.js n=1024 size=10 *** 117.07 % ±2.82% ±3.76% ±4.90%
buffers/buffer-copy.js n=1024 size=1024 *** 94.86 % ±3.36% ±4.47% ±5.83%
buffers/buffer-copy.js n=1024 size=2048 *** 53.33 % ±4.03% ±5.38% ±7.06%
buffers/buffer-copy.js n=1024 size=4096 *** 30.17 % ±2.49% ±3.33% ±4.36%
buffers/buffer-copy.js n=1024 size=8192 *** 21.52 % ±2.23% ±2.97% ±3.86%
confidence improvement accuracy (*) (**) (***)
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=16 pieces=1 *** 4.52 % ±1.73% ±2.31% ±3.03%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=16 pieces=16 *** 144.18 % ±1.97% ±2.63% ±3.46%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=16 pieces=4 *** 104.35 % ±6.67% ±8.97% ±11.88%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=1 pieces=1 *** 5.51 % ±2.37% ±3.18% ±4.18%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=1 pieces=16 *** 143.85 % ±2.21% ±2.95% ±3.86%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=1 pieces=4 *** 101.56 % ±6.18% ±8.31% ±10.99%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=256 pieces=1 *** 5.50 % ±2.97% ±3.99% ±5.27%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=256 pieces=16 *** 45.37 % ±2.16% ±2.89% ±3.81%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=256 pieces=4 *** 66.76 % ±1.69% ±2.25% ±2.94%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=16 pieces=1 *** 5.70 % ±2.81% ±3.78% ±4.99%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=16 pieces=16 *** 160.34 % ±5.80% ±7.81% ±10.34%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=16 pieces=4 *** 116.18 % ±5.38% ±7.23% ±9.55%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=1 pieces=1 *** 5.19 % ±1.82% ±2.44% ±3.20%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=1 pieces=16 *** 160.41 % ±2.37% ±3.17% ±4.15%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=1 pieces=4 *** 108.86 % ±7.55% ±10.16% ±13.47%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=256 pieces=1 *** 5.46 % ±3.00% ±4.02% ±5.30%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=256 pieces=16 *** 47.44 % ±1.57% ±2.10% ±2.75%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=256 pieces=4 *** 70.00 % ±1.66% ±2.22% ±2.89%
node@v10 vs node@v10-pr
confidence improvement accuracy (*) (**) (***)
buffers/buffer-copy.js n=1024 size=10 *** 187.01 % ±5.37% ±7.21% ±9.54%
buffers/buffer-copy.js n=1024 size=1024 *** 129.87 % ±3.41% ±4.57% ±6.01%
buffers/buffer-copy.js n=1024 size=2048 *** 78.64 % ±2.57% ±3.42% ±4.45%
buffers/buffer-copy.js n=1024 size=4096 *** 59.96 % ±4.00% ±5.34% ±7.00%
buffers/buffer-copy.js n=1024 size=8192 *** 75.37 % ±1.23% ±1.64% ±2.14%
confidence improvement accuracy (*) (**) (***)
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=16 pieces=1 *** 22.93 % ±1.38% ±1.83% ±2.39%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=16 pieces=16 *** 203.86 % ±3.10% ±4.15% ±5.45%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=16 pieces=4 *** 154.01 % ±2.50% ±3.34% ±4.39%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=1 pieces=1 *** 26.54 % ±1.39% ±1.86% ±2.42%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=1 pieces=16 *** 226.57 % ±2.42% ±3.24% ±4.26%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=1 pieces=4 *** 153.34 % ±2.78% ±3.74% ±4.94%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=256 pieces=1 *** 19.00 % ±1.83% ±2.44% ±3.18%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=256 pieces=16 *** 72.48 % ±1.56% ±2.08% ±2.72%
buffers/buffer-concat.js n=1024 withTotalLength=0 pieceSize=256 pieces=4 *** 89.29 % ±2.61% ±3.50% ±4.62%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=16 pieces=1 *** 22.45 % ±1.68% ±2.24% ±2.92%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=16 pieces=16 *** 214.20 % ±3.17% ±4.25% ±5.58%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=16 pieces=4 *** 155.20 % ±3.64% ±4.88% ±6.43%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=1 pieces=1 *** 23.09 % ±1.88% ±2.51% ±3.27%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=1 pieces=16 *** 232.81 % ±2.64% ±3.53% ±4.63%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=1 pieces=4 *** 165.25 % ±2.23% ±2.99% ±3.92%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=256 pieces=1 *** 21.09 % ±1.66% ±2.22% ±2.88%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=256 pieces=16 *** 71.34 % ±1.11% ±1.47% ±1.92%
buffers/buffer-concat.js n=1024 withTotalLength=1 pieceSize=256 pieces=4 *** 91.33 % ±2.32% ±3.10% ±4.07%
This PR is able to be backported to v10 branch. The main question is what to doing with error messages. Some of previous error messages are less informative.
Checklist
-
make -j4 test
(UNIX), orvcbuild test
(Windows) passes -
tests and/or benchmarks are included -
commit message follows commit guidelines