-
-
Notifications
You must be signed in to change notification settings - Fork 619
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
perf(utils/buffer): use promise all for better performance #3031
perf(utils/buffer): use promise all for better performance #3031
Conversation
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #3031 +/- ##
==========================================
- Coverage 95.83% 95.83% -0.01%
==========================================
Files 137 137
Lines 13399 13398 -1
Branches 2250 2266 +16
==========================================
- Hits 12841 12840 -1
Misses 558 558 ☔ View full report in Codecov by Sentry. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
Hi @yasuaki640 The implementation and measuring performance are both great. I'll merge this now. Thanks! |
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [hono](https://hono.dev/) ([source](https://togithub.com/honojs/hono)) | [`4.4.7` -> `4.5.1`](https://renovatebot.com/diffs/npm/hono/4.4.7/4.5.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/hono/4.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/hono/4.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/hono/4.4.7/4.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/hono/4.4.7/4.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>honojs/hono (hono)</summary> ### [`v4.5.1`](https://togithub.com/honojs/hono/releases/tag/v4.5.1) [Compare Source](https://togithub.com/honojs/hono/compare/v4.5.0...v4.5.1) #### What's Changed - chore: remove rimraf and use bun shell by [@​nakasyou](https://togithub.com/nakasyou) in [https://github.com/honojs/hono/pull/3146](https://togithub.com/honojs/hono/pull/3146) - chore: moving the setup file of vitest by [@​EdamAme-x](https://togithub.com/EdamAme-x) in [https://github.com/honojs/hono/pull/3157](https://togithub.com/honojs/hono/pull/3157) - fix(middleware/jwt): Changed the jwt-secret type to SignatureKey by [@​JulesVerner](https://togithub.com/JulesVerner) in [https://github.com/honojs/hono/pull/3167](https://togithub.com/honojs/hono/pull/3167) - feat(bearer-auth): Allow empty bearer-auth middleware prefixes by [@​prevostc](https://togithub.com/prevostc) in [https://github.com/honojs/hono/pull/3161](https://togithub.com/honojs/hono/pull/3161) - chore(factory): remove `@experimental` from `createApp` by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3164](https://togithub.com/honojs/hono/pull/3164) - fix(client): support array values for `query` in `ws` by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3169](https://togithub.com/honojs/hono/pull/3169) - fix(validator): ignore content-type mismatches by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3165](https://togithub.com/honojs/hono/pull/3165) #### New Contributors - [@​JulesVerner](https://togithub.com/JulesVerner) made their first contribution in [https://github.com/honojs/hono/pull/3167](https://togithub.com/honojs/hono/pull/3167) - [@​prevostc](https://togithub.com/prevostc) made their first contribution in [https://github.com/honojs/hono/pull/3161](https://togithub.com/honojs/hono/pull/3161) **Full Changelog**: honojs/hono@v4.5.0...v4.5.1 ### [`v4.5.0`](https://togithub.com/honojs/hono/compare/v4.4.13...v4.5.0) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.13...v4.5.0) ### [`v4.4.13`](https://togithub.com/honojs/hono/releases/tag/v4.4.13) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.12...v4.4.13) ##### What's Changed - chore: update benchmark by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3102](https://togithub.com/honojs/hono/pull/3102) - chore: replace tsx with Bun by [@​nakasyou](https://togithub.com/nakasyou) in [https://github.com/honojs/hono/pull/3103](https://togithub.com/honojs/hono/pull/3103) - refactor(http-status): remove unnecessary line of types and use common types by [@​EdamAme-x](https://togithub.com/EdamAme-x) in [https://github.com/honojs/hono/pull/3110](https://togithub.com/honojs/hono/pull/3110) - fix(jsx): redefine scope attribute as enum type by [@​yasuaki640](https://togithub.com/yasuaki640) in [https://github.com/honojs/hono/pull/3118](https://togithub.com/honojs/hono/pull/3118) - fix(types): allow `string[] | File[]` for RPC form value by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3117](https://togithub.com/honojs/hono/pull/3117) - fix(validator-types): type Alignment with Web Standards by [@​EdamAme-x](https://togithub.com/EdamAme-x) in [https://github.com/honojs/hono/pull/3120](https://togithub.com/honojs/hono/pull/3120) - fix(types): `app.use(path, mw)` return correct schema type by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3128](https://togithub.com/honojs/hono/pull/3128) **Full Changelog**: honojs/hono@v4.4.12...v4.4.13 ### [`v4.4.12`](https://togithub.com/honojs/hono/releases/tag/v4.4.12) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.11...v4.4.12) #### What's Changed - fix(aws-lambda): set cookies with comma is bugged by [@​NamesMT](https://togithub.com/NamesMT) in [https://github.com/honojs/hono/pull/3084](https://togithub.com/honojs/hono/pull/3084) - fix(types): infer `path` when chaining after `use` by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3087](https://togithub.com/honojs/hono/pull/3087) - chore: update outdated links in JSDoc by [@​ryuapp](https://togithub.com/ryuapp) in [https://github.com/honojs/hono/pull/3089](https://togithub.com/honojs/hono/pull/3089) - fix(jsx): changes behavior when `download` attribute is set to a boolean value. by [@​oon00b](https://togithub.com/oon00b) in [https://github.com/honojs/hono/pull/3094](https://togithub.com/honojs/hono/pull/3094) - chore: add the triage label by [@​mvares](https://togithub.com/mvares) in [https://github.com/honojs/hono/pull/3092](https://togithub.com/honojs/hono/pull/3092) - feat(types): improve JSONParsed by [@​m-shaka](https://togithub.com/m-shaka) in [https://github.com/honojs/hono/pull/3074](https://togithub.com/honojs/hono/pull/3074) - fix(helper/streaming): remove slow types by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3100](https://togithub.com/honojs/hono/pull/3100) - chore(utils/jwt): add `@module` docs by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3101](https://togithub.com/honojs/hono/pull/3101) #### New Contributors - [@​oon00b](https://togithub.com/oon00b) made their first contribution in [https://github.com/honojs/hono/pull/3094](https://togithub.com/honojs/hono/pull/3094) **Full Changelog**: honojs/hono@v4.4.11...v4.4.12 ### [`v4.4.11`](https://togithub.com/honojs/hono/releases/tag/v4.4.11) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.10...v4.4.11) #### What's Changed - refactor: remove unnecessary async keyword from router tests by [@​K-tecchan](https://togithub.com/K-tecchan) in [https://github.com/honojs/hono/pull/3061](https://togithub.com/honojs/hono/pull/3061) - fix(validator): don't return a FormData if formData is cached by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3067](https://togithub.com/honojs/hono/pull/3067) - fix(client): Add Query Parameter Support to WebSocket Client in `hono/client` by [@​naporin0624](https://togithub.com/naporin0624) in [https://github.com/honojs/hono/pull/3066](https://togithub.com/honojs/hono/pull/3066) - refactor(types): move `HandlerInterface`'s `(path, handler)`s overloads down by [@​NamesMT](https://togithub.com/NamesMT) in [https://github.com/honojs/hono/pull/3072](https://togithub.com/honojs/hono/pull/3072) - test(helper/dev): fix typo of test case name by [@​yasuaki640](https://togithub.com/yasuaki640) in [https://github.com/honojs/hono/pull/3073](https://togithub.com/honojs/hono/pull/3073) - fix(stream): Fixed a problem that onAbort() is called even if request is normally closed in deno by [@​usualoma](https://togithub.com/usualoma) in [https://github.com/honojs/hono/pull/3079](https://togithub.com/honojs/hono/pull/3079) #### New Contributors - [@​K-tecchan](https://togithub.com/K-tecchan) made their first contribution in [https://github.com/honojs/hono/pull/3061](https://togithub.com/honojs/hono/pull/3061) **Full Changelog**: honojs/hono@v4.4.10...v4.4.11 ### [`v4.4.10`](https://togithub.com/honojs/hono/releases/tag/v4.4.10) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.9...v4.4.10) #### What's Changed - chore(jsr): export JWT utils by [@​ryuapp](https://togithub.com/ryuapp) in [https://github.com/honojs/hono/pull/3056](https://togithub.com/honojs/hono/pull/3056) - fix(streaming): call stream.abort() explicitly when request is aborted by [@​usualoma](https://togithub.com/usualoma) in [https://github.com/honojs/hono/pull/3042](https://togithub.com/honojs/hono/pull/3042) - fix(client): set Path as the default of Original by [@​m-shaka](https://togithub.com/m-shaka) in [https://github.com/honojs/hono/pull/3058](https://togithub.com/honojs/hono/pull/3058) #### New Contributors - [@​m-shaka](https://togithub.com/m-shaka) made their first contribution in [https://github.com/honojs/hono/pull/3058](https://togithub.com/honojs/hono/pull/3058) **Full Changelog**: honojs/hono@v4.4.9...v4.4.10 ### [`v4.4.9`](https://togithub.com/honojs/hono/releases/tag/v4.4.9) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.8...v4.4.9) #### What's Changed - perf(context): improve initializing `Context` by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3046](https://togithub.com/honojs/hono/pull/3046) - fix(types): correct inferring env when routes channing by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3051](https://togithub.com/honojs/hono/pull/3051) - docs: update the description of `package.json` and README by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3052](https://togithub.com/honojs/hono/pull/3052) - fix(timing): prevent duplicate applications by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3054](https://togithub.com/honojs/hono/pull/3054) **Full Changelog**: honojs/hono@v4.4.8...v4.4.9 ### [`v4.4.8`](https://togithub.com/honojs/hono/releases/tag/v4.4.8) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.7...v4.4.8) #### What's Changed - fix(jsx): add an explicit type by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3007](https://togithub.com/honojs/hono/pull/3007) - ci: use `env` for codecov GitHub Actions by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3010](https://togithub.com/honojs/hono/pull/3010) - chore: Fix typos in JSDoc by [@​NicoPlyley](https://togithub.com/NicoPlyley) in [https://github.com/honojs/hono/pull/3002](https://togithub.com/honojs/hono/pull/3002) - fix: change to allow use of websocket options by [@​EdamAme-x](https://togithub.com/EdamAme-x) in [https://github.com/honojs/hono/pull/2999](https://togithub.com/honojs/hono/pull/2999) - perf: parseAccept without spread operator by [@​Jayllyz](https://togithub.com/Jayllyz) in [https://github.com/honojs/hono/pull/3003](https://togithub.com/honojs/hono/pull/3003) - test: add tests for buffer.ts by [@​yasuaki640](https://togithub.com/yasuaki640) in [https://github.com/honojs/hono/pull/3004](https://togithub.com/honojs/hono/pull/3004) - chore: upload bun test coverage to CodeCov by [@​exoego](https://togithub.com/exoego) in [https://github.com/honojs/hono/pull/3022](https://togithub.com/honojs/hono/pull/3022) - refactor: remove unneeded import statements by [@​EdamAme-x](https://togithub.com/EdamAme-x) in [https://github.com/honojs/hono/pull/3014](https://togithub.com/honojs/hono/pull/3014) - perf(utils/buffer): use promise all for better performance by [@​yasuaki640](https://togithub.com/yasuaki640) in [https://github.com/honojs/hono/pull/3031](https://togithub.com/honojs/hono/pull/3031) **Full Changelog**: honojs/hono@v4.4.7...v4.4.8 </details> --- ### Configuration 📅 **Schedule**: Branch creation - "before 4am on Monday" in timezone America/Chicago, Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View the [repository job log](https://developer.mend.io/github/autoblocksai/cli). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjUuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQzOC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Changed to use Promise.all in the
timignSafeEqual
function to improve performance.Measurement Results and Discussion
Here we share benchmark results for
timingSafeEqual
and (using Promise.all)timingSafeEqual2
.https://github.com/yasuaki640/timingSafeEqual-bench/actions/runs/9646432337/job/26602824121
(Click on the Run Benchmarks section to see the benchmark results )
We observed a 1.6 ~ 2x performance improvement (except for the last case) for the test cases present in buffer.test.ts.
The only performance degradation was in the following case
hono/src/utils/buffer.test.ts
Line 72 in a9d5313
(The timingSafeEqual-bench repository has the following measurements)
https://github.com/yasuaki640/timingSafeEqual-bench/blob/ab3f59b0edc28e1607bbea139490023e88cdb2f1/timingSafeEqual.bench.ts#L232-L242
Probably due to the overhead of Promise.all itself.
However, to begin with, the mean execution time of this case is two orders of magnitude smaller than the other cases, and we are passing a (extremely short processing time) test function such as
() => undefined.
Therefore, we believe that using Promise.all is more beneficial than the degradation of this case, noting the performance improvement in all other cases.
The author should do the following, if applicable
bun run format:fix && bun run lint:fix
to format the code