Skip to content

buffer: improve allocation and from(arrayLike) performance

Checklist
  • make -j4 test (UNIX), or vcbuild test (Windows) passes
  • tests and/or benchmarks are included
  • commit message follows commit guidelines
Affected core subsystem(s)
  • buffer
Description of change

Improve Buffer allocation performance (up to ~11%) by making assertSize() inlineable and improve Buffer.from(arrayLike) performance (~50%) by replacing the usage of the in operator when checking for a length property.

Relevant benchmark results:

Buffer allocation:

                                                                   improvement significant      p.value
buffers/buffer-creation.js n=1024 len=10 type="buffer()"                3.67 %         *** 1.907380e-31
buffers/buffer-creation.js n=1024 len=10 type="fast-alloc-fill"         4.34 %         *** 3.497544e-11
buffers/buffer-creation.js n=1024 len=10 type="fast-alloc"              9.94 %         *** 7.596522e-44
buffers/buffer-creation.js n=1024 len=10 type="fast-allocUnsafe"        5.05 %         *** 2.696345e-51
buffers/buffer-creation.js n=1024 len=10 type="slow-allocUnsafe"        3.49 %         *** 1.076653e-07
buffers/buffer-creation.js n=1024 len=10 type="slow"                   11.22 %         *** 5.188153e-61
buffers/buffer-creation.js n=1024 len=1024 type="buffer()"              1.42 %          ** 1.348395e-03
buffers/buffer-creation.js n=1024 len=1024 type="fast-alloc-fill"       2.52 %         *** 1.446582e-06
buffers/buffer-creation.js n=1024 len=1024 type="fast-alloc"            5.38 %         *** 1.283277e-27
buffers/buffer-creation.js n=1024 len=1024 type="fast-allocUnsafe"      2.18 %         *** 2.896226e-06
buffers/buffer-creation.js n=1024 len=1024 type="slow-allocUnsafe"      3.41 %         *** 6.929603e-10
buffers/buffer-creation.js n=1024 len=1024 type="slow"                  9.38 %         *** 1.607505e-56
buffers/buffer-creation.js n=1024 len=2048 type="buffer()"              2.13 %         *** 2.849077e-05
buffers/buffer-creation.js n=1024 len=2048 type="fast-alloc-fill"       2.39 %         *** 1.291052e-07
buffers/buffer-creation.js n=1024 len=2048 type="fast-alloc"            3.96 %         *** 2.701098e-22
buffers/buffer-creation.js n=1024 len=2048 type="fast-allocUnsafe"      1.57 %         *** 5.975363e-04
buffers/buffer-creation.js n=1024 len=2048 type="slow-allocUnsafe"      4.54 %         *** 3.838296e-15
buffers/buffer-creation.js n=1024 len=2048 type="slow"                  8.52 %         *** 6.733714e-46
buffers/buffer-creation.js n=1024 len=4096 type="buffer()"              3.62 %         *** 1.399411e-10
buffers/buffer-creation.js n=1024 len=4096 type="fast-alloc-fill"       1.85 %         *** 2.706257e-05
buffers/buffer-creation.js n=1024 len=4096 type="fast-alloc"            1.30 %         *** 1.625928e-04
buffers/buffer-creation.js n=1024 len=4096 type="fast-allocUnsafe"      4.14 %         *** 4.122709e-15
buffers/buffer-creation.js n=1024 len=4096 type="slow-allocUnsafe"      3.78 %         *** 5.601502e-13
buffers/buffer-creation.js n=1024 len=4096 type="slow"                  8.09 %         *** 6.466906e-46
buffers/buffer-creation.js n=1024 len=8192 type="buffer()"              2.54 %         *** 1.426874e-05
buffers/buffer-creation.js n=1024 len=8192 type="fast-alloc-fill"       1.16 %          ** 1.392665e-03
buffers/buffer-creation.js n=1024 len=8192 type="fast-alloc"            0.83 %          ** 2.391328e-03
buffers/buffer-creation.js n=1024 len=8192 type="fast-allocUnsafe"      5.33 %         *** 1.811794e-19
buffers/buffer-creation.js n=1024 len=8192 type="slow-allocUnsafe"      4.85 %         *** 1.764478e-16
buffers/buffer-creation.js n=1024 len=8192 type="slow"                  8.18 %         *** 1.006915e-42

Buffer.from(arrayLike):

                                                       improvement significant      p.value
buffers/buffer-from.js n=10024 len=10 source="object"       48.85 %         *** 4.055606e-41
buffers/buffer-from.js n=10024 len=2048 source="object"     49.44 %         *** 2.809991e-51

/cc @nodejs/buffer CI: https://ci.nodejs.org/job/node-test-pull-request/5580/

Merge request reports

Loading