Title: buffer: optimize Buffer.toString('hex') for small buffers with stack allocation · Issue #194 · nodejs/performance · GitHub
Open Graph Title: buffer: optimize Buffer.toString('hex') for small buffers with stack allocation · Issue #194 · nodejs/performance
X Title: buffer: optimize Buffer.toString('hex') for small buffers with stack allocation · Issue #194 · nodejs/performance
Description: While looking into buffer optimizations (nodejs/node#61871), I noticed that Buffer.toString('hex') heap allocates a temporary buffer for every call even for tiny inputs like a SHA-256 digest I tried using a 512 byte stack buffer for smal...
Open Graph Description: While looking into buffer optimizations (nodejs/node#61871), I noticed that Buffer.toString('hex') heap allocates a temporary buffer for every call even for tiny inputs like a SHA-256 digest I trie...
X Description: While looking into buffer optimizations (nodejs/node#61871), I noticed that Buffer.toString('hex') heap allocates a temporary buffer for every call even for tiny inputs like a SHA-256 diges...
Opengraph URL: https://github.com/nodejs/performance/issues/194
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"buffer: optimize Buffer.toString('hex') for small buffers with stack allocation","articleBody":"While looking into buffer optimizations ([nodejs/node#61871](https://github.com/nodejs/node/pull/61871)), I noticed that `Buffer.toString('hex')` heap allocates a temporary buffer for every call even for tiny inputs like a SHA-256 digest\n\nI tried using a 512 byte stack buffer for small inputs (\u003c=256 bytes / 512 hex chars) and calling **NewFromOneByte** directly, skipping ExternOneByteString entirely. This covers all the common cases SHA-256, SHA-512, UUIDs, HMAC signatures, MongoDB ObjectIds, etc.\n\nLet me know what you guys think of this (runs=60)\n\n```\n confidence improvement accuracy (*) (**) (***)\nbuffers/buffer-tostring.js n=1000000 len=1 args=1 encoding='hex' *** 34.44 % ±1.05% ±1.39% ±1.80%\nbuffers/buffer-tostring.js n=1000000 len=1 args=3 encoding='hex' *** 32.38 % ±2.10% ±2.79% ±3.61%\nbuffers/buffer-tostring.js n=1000000 len=1024 args=1 encoding='hex' *** -1.11 % ±0.62% ±0.82% ±1.07%\nbuffers/buffer-tostring.js n=1000000 len=1024 args=3 encoding='hex' -0.84 % ±0.88% ±1.17% ±1.51%\nbuffers/buffer-tostring.js n=1000000 len=128 args=1 encoding='hex' *** 29.00 % ±1.67% ±2.22% ±2.88%\nbuffers/buffer-tostring.js n=1000000 len=128 args=3 encoding='hex' *** 30.72 % ±0.79% ±1.05% ±1.35%\nbuffers/buffer-tostring.js n=1000000 len=256 args=1 encoding='hex' *** 26.65 % ±0.93% ±1.23% ±1.59%\nbuffers/buffer-tostring.js n=1000000 len=256 args=3 encoding='hex' *** 27.13 % ±1.46% ±1.93% ±2.49%\nbuffers/buffer-tostring.js n=1000000 len=512 args=1 encoding='hex' ** -1.24 % ±0.85% ±1.12% ±1.44%\nbuffers/buffer-tostring.js n=1000000 len=512 args=3 encoding='hex' ** -0.63 % ±0.41% ±0.55% ±0.71%\nbuffers/buffer-tostring.js n=1000000 len=64 args=1 encoding='hex' *** 37.50 % ±1.65% ±2.18% ±2.81%\nbuffers/buffer-tostring.js n=1000000 len=64 args=3 encoding='hex' *** 39.28 % ±1.29% ±1.72% ±2.23%\n\nBe aware that when doing many comparisons the risk of a false-positive\nresult increases. In this case, there are 12 comparisons, you can thus\nexpect the following amount of false-positive results:\n 0.60 false positives, when considering a 5% risk acceptance (*, **, ***),\n 0.12 false positives, when considering a 1% risk acceptance (**, ***),\n 0.01 false positives, when considering a 0.1% risk acceptance (***)\n```\n","author":{"url":"https://github.com/thisalihassan","@type":"Person","name":"thisalihassan"},"datePublished":"2026-03-05T17:56:07.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":5},"url":"https://github.com/194/performance/issues/194"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:e9d047ad-a36a-dd63-27f1-5470f0da6601 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | A474:3FCB4A:5F425:83541:6A4C94A8 |
| html-safe-nonce | af1446c20d5a2c26827fe6da609c075065f6e371ed21dfa1376112faa7bcfcb2 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBNDc0OjNGQ0I0QTo1RjQyNTo4MzU0MTo2QTRDOTRBOCIsInZpc2l0b3JfaWQiOiI1MzMyODg4ODAyNDc2OTg3NTYwIiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 7e95d2b0f2e00876b2c49e0e0e4004e9d6a6c99bf538e6b375fc209d5dd7813b |
| hovercard-subject-tag | issue:4029749698 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/nodejs/performance/194/issue_layout |
| twitter:image | https://opengraph.githubassets.com/7a59c47aa1fde07ebab9964e8bfc58158fd6e102bfb498fb6d471eb7bbd541b4/nodejs/performance/issues/194 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/7a59c47aa1fde07ebab9964e8bfc58158fd6e102bfb498fb6d471eb7bbd541b4/nodejs/performance/issues/194 |
| og:image:alt | While looking into buffer optimizations (nodejs/node#61871), I noticed that Buffer.toString('hex') heap allocates a temporary buffer for every call even for tiny inputs like a SHA-256 digest I trie... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | thisalihassan |
| hostname | github.com |
| expected-hostname | github.com |
| None | 3d11bb817438277de2a940854450e83a7d32b6aeb5014e9e6b00a6423900251c |
| turbo-cache-control | no-preview |
| go-import | github.com/nodejs/performance git https://github.com/nodejs/performance.git |
| octolytics-dimension-user_id | 9950313 |
| octolytics-dimension-user_login | nodejs |
| octolytics-dimension-repository_id | 563495788 |
| octolytics-dimension-repository_nwo | nodejs/performance |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 563495788 |
| octolytics-dimension-repository_network_root_nwo | nodejs/performance |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 7a2dede45637df6b92ddcfe2a557e67d4b5854ae |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width