{"id":393431,"date":"2024-06-29T11:00:28","date_gmt":"2024-06-29T11:00:28","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=393431"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=393431","title":{"rendered":"<span>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Node.js Performance \u0432 2023 \u0433\u043e\u0434\u0443<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0430 \u0434\u0432\u043e\u0440\u0435 2023 \u0433\u043e\u0434, \u0438 <a href=\"https:\/\/nodejs.org\/en\/blog\/release\/v20.0.0\"><u>\u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 Node.js v20<\/u><\/a>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435, \u0438 \u0446\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0443\u0447\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Node.js.<\/p>\n<p>\u0412\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0443\u043c\u0430 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0435 \u0448\u0430\u0433\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432.<\/p>\n<p>\u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 &#8212; \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Node.js. \u041e\u043d\u0430 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u0445 \u044d\u0442\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043d\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u044f \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430\u043c\u0438 JavaScript.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 Node.js \u0432\u0435\u0440\u0441\u0438\u0439 16.20.0, 18.16.0 \u0438 20.0.0 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b\u0438 \u0441\u044c\u044e\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u043d\u0430 \u0442\u0440\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b:<\/p>\n<ol>\n<li>\n<p>Node.js Internal Benchmark (\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a)<\/p>\n<\/li>\n<\/ol>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438 \u043e\u0442\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440 \u0441\u044c\u044e\u0442\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 Node.js, \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043e\u0431\u0440\u0430\u0437\u0446\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Node.js, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 16 \u041c\u0411 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e fs.readfile. \u042d\u0442\u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044f\u043c, \u0442\u0430\u043a\u0438\u043c \u043a\u0430\u043a fs \u0438 streams. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u044e\u044c\u0442\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 Node.js, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a <a href=\"https:\/\/github.com\/nodejs\/node\/tree\/main\/benchmark\"><u>\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 Node.js<\/u><\/a>.<\/p>\n<ol start=\"2\">\n<li>\n<p><a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/\"><u>nodejs-bench-operations<\/u><\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\"><u>nodejs-bench-operations<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Node.js, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0442\u0440\u0438 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043b\u0438\u043d\u0435\u0439\u043a\u0438 \u0432\u0435\u0440\u0441\u0438\u0439. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Node.js v16.20.0 \u0438 v18.16.0, \u0438\u043b\u0438 v19.8.0 \u0438 v19.9.0, \u0441 \u0446\u0435\u043b\u044c\u044e \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0439 \u0432 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435 Node.js. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u044b \u0432 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435 Node.js, \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u044d\u0442\u0438\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u0446\u0435\u043d\u043d\u044b\u043c (\u0438 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u043c\u0443 \u0437\u0432\u0435\u0437\u0434\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c).<\/p>\n<ol start=\"3\">\n<li>\n<p>HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u044b (\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438)<\/p>\n<\/li>\n<\/ol>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b\u0439 HTTP \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430\u043c, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f JSON, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0441\u044b\u043b\u043e\u043a express \u0438 fastify. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c &#8212; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Node.js Internal Benchmark \u0438 <a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\"><u>nodejs-bench-operations<\/u><\/a>, \u043a \u043e\u0431\u044b\u0447\u043d\u044b\u043c HTTP-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c.<\/p>\n<h3>\u041e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0430\u044f \u0441\u0440\u0435\u0434\u0430<\/h3>\n<p>\u0414\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f <a href=\"https:\/\/aws.amazon.com\/ec2\/dedicated-hosts\/\"><u>\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0445\u043e\u0441\u0442 AWS<\/u><\/a> \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c:<\/p>\n<ul>\n<li>\n<p>c6i.xlarge (Ice Lake) 3,5 \u0413\u0413\u0446 &#8212; \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>4 vCPU<\/p>\n<\/li>\n<li>\n<p>8 \u0413\u0411 \u043f\u0430\u043c\u044f\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>Canonical, Ubuntu, 22.04 LTS, amd64 jammy<\/p>\n<\/li>\n<li>\n<p>1 \u0413\u0431 SSD \u0442\u0438\u043f \u0434\u0438\u0441\u043a\u0430<\/p>\n<\/li>\n<\/ul>\n<h3>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a Node.js<\/h3>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0435 \u0431\u044b\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438\/\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0435\u043d:<\/p>\n<ul>\n<li>\n<p>fs \u2014 \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 Node.js<\/p>\n<\/li>\n<li>\n<p>events \u2014 \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 Node.js EventEmitter \/ EventTarget<\/p>\n<\/li>\n<li>\n<p>http \u2014 Node.js HTTP \u0441\u0435\u0440\u0432\u0435\u0440 + \u043f\u0430\u0440\u0441\u0435\u0440<\/p>\n<\/li>\n<li>\n<p>misc \u2014 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Node.js \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c child_processes \u0438 worker_threads + trace_events<\/p>\n<\/li>\n<li>\n<p>module \u2014 Node.js module.require<\/p>\n<\/li>\n<li>\n<p>streams \u2014 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 Node.js \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435<\/p>\n<\/li>\n<li>\n<p>url \u2014 \u043f\u0430\u0440\u0441\u0435\u0440 URL Node.js<\/p>\n<\/li>\n<li>\n<p>buffers \u2014 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438 Node.js<\/p>\n<\/li>\n<li>\n<p>util \u2014 Node.js \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0449\u0438\u043a\/\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0442\u0435\u043a\u0441\u0442\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"https:\/\/github.com\/RafaelGSS\/node\/tree\/state-of-nodejs\"><u>RafaelGSS\/node#state-of-nodejs<\/u><\/a>, \u0430 \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u044b\u043b\u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u044b \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: <a href=\"https:\/\/github.com\/RafaelGSS\/state-of-nodejs-performance-2023\"><u>State of Node.js Performance 2023.<\/u><\/a><\/p>\n<h3>\u041c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 Node.js<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0432\u0430\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u044b\u043b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u043b\u043e\u0433\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/blog.rafaelgss.dev\/preparing-and-evaluating-benchmarks\"><strong><u>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0438 \u043e\u0446\u0435\u043d\u043a\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432<\/u><\/strong><\/a>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Node.js, \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 (30) \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043d\u0430 Node.js 16, 18 \u0438 20. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f:<\/p>\n<ol>\n<li>\n<p><em>\u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 (improvement) <\/em>\u2014 <strong>\u043f\u0440\u043e\u0446\u0435\u043d\u0442 <\/strong>\u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439<\/p>\n<\/li>\n<li>\n<p><em>\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c (confidence)<\/em> \u2014 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043d\u0430\u043c, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b:<\/p>\n<pre><code>                                                                              confidence improvement accuracy (*)   (**)  (***) fs\/readfile.js concurrent=1 len=16777216 encoding='ascii' duration=5                 ***     67.59 %       \u00b13.80% \u00b15.12% \u00b16.79% fs\/readfile.js concurrent=1 len=16777216 encoding='utf-8' duration=5                 ***     11.97 %       \u00b11.09% \u00b11.46% \u00b11.93% fs\/writefile-promises.js concurrent=1 size=1024 encodingType='utf' duration=5                 0.36 %       \u00b10.56% \u00b10.75% \u00b10.97%  Be aware that when doing many comparisons the risk of a false-positive result increases. In this case, there are 10 comparisons, you can thus expect the following amount of false-positive results:   0.50 false positives, when considering a   5% risk acceptance (*, **, ***),   0.10 false positives, when considering a   1% risk acceptance (**, ***),   0.01 false positives, when considering a 0.1% risk acceptance (***)<\/code><\/pre>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0438\u0441\u043a \u0432 0,1%, \u0447\u0442\u043e fs.readfile \u043d\u0435 \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0441\u044f \u0441 Node.js 16 \u0434\u043e Node.js 18 (\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c ***). \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ul>\n<li>\n<p><code>fs\/readfile.js<\/code> \u2014 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0444\u0430\u0439\u043b<\/p>\n<\/li>\n<li>\n<p><code>concurrent=1 len=16777216 encoding='ascii' duration=5<\/code> \u2014 \u043e\u043f\u0446\u0438\u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430. \u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0446\u0438\u0439, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435 <strong>1<\/strong> \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 <strong>16777216<\/strong> \u0431\u0430\u0439\u0442\u0430\u043c\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 <strong>5<\/strong> \u0441\u0435\u043a\u0443\u043d\u0434 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <strong>ASCII<\/strong> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438, \u0441\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Student%27s_t-test#Equal_or_unequal_sample_sizes%2C_unequal_variances_%28sX1_%3E_2sX2_or_sX2_%3E_2sX1%29\"><u>\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439\/\u043d\u0435\u043f\u0430\u0440\u043d\u044b\u0439 2-\u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 t-\u0442\u0435\u0441\u0442<\/u><\/a> \u0441 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u043e\u0439, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430 \u0434\u043b\u044f \u043e\u0431\u0435\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439. \u0415\u0441\u043b\u0438 p-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 0.05, \u0432 \u043f\u043e\u043b\u0435 &#171;\u0414\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c&#187; \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u0430. \u2014 <a href=\"https:\/\/github.com\/nodejs\/node\/blob\/main\/doc\/contributing\/writing-and-running-benchmarks.md#comparing-nodejs-versions\"><u>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432<\/u><\/a><\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/h3>\n<ol>\n<li>\n<p>\u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0444\u043e\u0440\u043a\u0430 Node.js<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0432\u0435\u0442\u043a\u0443 state-of-nodejs<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b Node.js 16, 18 \u0438 20<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0441\u043a\u0440\u0438\u043f\u0442 <a href=\"https:\/\/github.com\/RafaelGSS\/state-of-nodejs-performance-2023\/blob\/main\/nodejs-internal-benchmark\/benchmark.sh\"><u>benchmark.sh<\/u><\/a><\/p>\n<\/li>\n<\/ol>\n<pre><code>#1 git clone git@github.com:RafaelGSS\/node.git #2 cd node &amp;&amp; git checkout state-of-nodejs #3 nvm install v20.0.0 cp $(which node) .\/node20 nvm install v18.16.0 cp $(which node) .\/node18 nvm install v16.20.0 cp $(which node) .\/node16 #4 .\/benchmark.sh<\/code><\/pre>\n<h3>\u0424\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/h3>\n<p>\u041f\u0440\u0438 \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0435 Node.js \u0441 16 \u0434\u043e 18 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 67% \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 API fs.readfile \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u043e\u0439 ascii \u0438 \u043d\u0430 12% \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 utf-8.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0b6\/4b7\/f98\/0b64b7f982b7d4cbc174ba7d3f47612c.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0b6\/4b7\/f98\/0b64b7f982b7d4cbc174ba7d3f47612c.png\"\/><\/figure>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u0440\u0438 \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0435 Node.js \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 16 \u0434\u043e 18 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 API fs.readfile \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u043e\u0439 ascii \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u043e\u043a\u043e\u043b\u043e <strong>67%<\/strong>, \u0430 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 utf-8 &#8212; \u043e\u043a\u043e\u043b\u043e <strong>12%<\/strong>. \u0424\u0430\u0439\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430, \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043d\u0438\u043f\u043f\u0435\u0442\u0430:<\/p>\n<pre><code class=\"cpp\">const data = Buffer.alloc(16 * 1024 * 1024, 'x'); fs.writeFileSync(filename, data);<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 fs.readfile \u0441 ascii \u043d\u0430 Node.js 20 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u0430\u0441\u044c \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f \u0432 <strong>27%<\/strong>. \u041e\u0431 \u044d\u0442\u043e\u0439 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438 \u0431\u044b\u043b\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Node.js Performance, \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, fs.opendir, fs.realpath \u0438 fs.readdir \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 Node.js 18 \u0434\u043e Node.js 20. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 Node.js 18 \u0438 20 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430:<\/p>\n<pre><code>                                                                              confidence improvement accuracy (*)   (**)  (***) fs\/bench-opendir.js bufferSize=1024 mode='async' dir='test\/parallel' n=100           ***      3.48 %       \u00b10.22% \u00b10.30% \u00b10.39% fs\/bench-opendir.js bufferSize=32 mode='async' dir='test\/parallel' n=100             ***      7.86 %       \u00b10.29% \u00b10.39% \u00b10.50% fs\/bench-readdir.js withFileTypes='false' dir='test\/parallel' n=10                   ***      8.69 %       \u00b10.22% \u00b10.30% \u00b10.39% fs\/bench-realpath.js pathType='relative' n=10000                                     ***      5.13 %       \u00b10.97% \u00b11.29% \u00b11.69% fs\/readfile.js concurrent=1 len=16777216 encoding='ascii' duration=5                 ***    -27.30 %       \u00b14.27% \u00b15.75% \u00b17.63% fs\/readfile.js concurrent=1 len=16777216 encoding='utf-8' duration=5                 ***      3.25 %       \u00b10.61% \u00b10.81% \u00b11.06%    0.10 false positives, when considering a   5% risk acceptance (*, **, ***),   0.02 false positives, when considering a   1% risk acceptance (**, ***),   0.00 false positives, when considering a 0.1% risk acceptance (***)<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Node.js 16, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u043c\u0435\u0436\u0434\u0443 Node.js 16 \u0438 Node.js 20<\/p>\n<pre><code>                                                                              confidence improvement accuracy (*)    (**)   (***) fs\/bench-opendir.js bufferSize=1024 mode='async' dir='test\/parallel' n=100           ***      2.79 %       \u00b10.26%  \u00b10.35%  \u00b10.46% fs\/bench-opendir.js bufferSize=32 mode='async' dir='test\/parallel' n=100             ***      5.41 %       \u00b10.27%  \u00b10.35%  \u00b10.46% fs\/bench-readdir.js withFileTypes='false' dir='test\/parallel' n=10                   ***      2.19 %       \u00b10.26%  \u00b10.35%  \u00b10.45% fs\/bench-realpath.js pathType='relative' n=10000                                     ***      6.86 %       \u00b10.94%  \u00b11.26%  \u00b11.64% fs\/readfile.js concurrent=1 len=16777216 encoding='ascii' duration=5                 ***     21.96 %       \u00b17.96% \u00b110.63% \u00b113.92% fs\/readfile.js concurrent=1 len=16777216 encoding='utf-8' duration=5                 ***     15.55 %       \u00b11.09%  \u00b11.46%  \u00b11.92%<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ecb\/c9a\/129\/ecbc9a129a8eece12871aa37ad5fbf74.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ecb\/c9a\/129\/ecbc9a129a8eece12871aa37ad5fbf74.png\"\/><\/figure>\n<h3>\u0421\u043e\u0431\u044b\u0442\u0438\u044f<\/h3>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>EventTarget<\/code> \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0432 \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0432\u043a\u043b\u044e\u0447\u0430\u043b \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>EventTarget.prototype.dispatchEvent(new Event('foo'))<\/code>.<\/p>\n<p>\u0410\u043f\u0433\u0440\u0435\u0439\u0434 \u0441 Node.js 16 \u0434\u043e Node.js 18 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 <strong>15%<\/strong>. \u041d\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0441\u043a\u0430\u0447\u043e\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0441 Node.js 18 \u043d\u0430 Node.js 20, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043e <strong>200%<\/strong> \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6f9\/08c\/bc7\/6f908cbc7eda46557b65f9b4618d967c.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6f9\/08c\/bc7\/6f908cbc7eda46557b65f9b4618d967c.png\"\/><\/figure>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>EventTarget<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c Web API \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0444\u0438\u0447\u0430\u0445, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a <code>AbortSignal<\/code> \u0438 <code>worker_threads<\/code>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u0444\u0438\u0447, \u0432\u043a\u043b\u044e\u0447\u0430\u044f fetch \u0438 <code>AbortController<\/code>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, API <code>EventEmitter.prototype.emit<\/code> \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 <strong>11,5%<\/strong> \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 Node.js 16 \u0441 Node.js 20. \u041f\u043e\u043b\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0438\u0436\u0435 \u0434\u043b\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0438:<\/p>\n<pre><code>                                                                 confidence improvement accuracy (*)   (**)  (***) events\/ee-emit.js listeners=5 argc=2 n=2000000                          ***     11.49 %       \u00b11.37% \u00b11.83% \u00b12.38% events\/ee-once.js argc=0 n=20000000                                     ***     -4.35 %       \u00b10.47% \u00b10.62% \u00b10.81% events\/eventtarget-add-remove.js nListener=10 n=1000000                 ***      3.80 %       \u00b10.83% \u00b11.11% \u00b11.46% events\/eventtarget-add-remove.js nListener=5 n=1000000                  ***      6.41 %       \u00b11.54% \u00b12.05% \u00b12.67% events\/eventtarget.js listeners=1 n=1000000                             ***    259.34 %       \u00b12.83% \u00b13.81% \u00b15.05% events\/eventtarget.js listeners=10 n=1000000                            ***    176.98 %       \u00b11.97% \u00b12.65% \u00b13.52% events\/eventtarget.js listeners=5 n=1000000                             ***    219.14 %       \u00b12.20% \u00b12.97% \u00b13.94%<\/code><\/pre>\n<h3>HTTP<\/h3>\n<p>HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Node.js. \u042d\u0442\u043e \u043d\u0435 \u043c\u0438\u0444, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Node.js \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u044e\u0431\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a <em>semver-major<\/em> [\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438] \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0443\u0441\u0438\u043b\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u2014 \u044d\u0442\u043e http.Server, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 4 \u0447\u0430\u043d\u043a\u0430\u043c\u0438 \u043f\u043e 256 \u0431\u0430\u0439\u0442 \u043a\u0430\u0436\u0434\u044b\u0439, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c\u0438 &#8216;C&#8217;, \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435:<\/p>\n<pre><code class=\"javascript\">http.createServer((req, res) => {     const n_chunks = 4;     const body = 'C'.repeat();     const len = body.length; res.writeHead(200, { 'Content-Type': 'text\/plain',     'Content-Length': len.toString() });     for (i = 0, n = (n_chunks - 1); i &lt; n; ++i)       res.write(body.slice(i * step, i * step + step));     res.end(body.slice((n_chunks - 1) * step)); }) \/\/ See: https:\/\/github.com\/nodejs\/node\/blob\/main\/benchmark\/fixtures\/simple-http-server.js<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Node.js 16 \u0438 Node.js 18 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 8%. \u041e\u0434\u043d\u0430\u043a\u043e \u0430\u043f\u0433\u0440\u0435\u0439\u0434 \u0441 Node.js 18 \u043d\u0430 Node.js 20 \u043f\u0440\u0438\u0432\u0435\u043b \u043a \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u043d\u0430 <strong>96,13%<\/strong>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/49e\/b14\/000\/49eb14000ef5390ee8cc39c4451b2160.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/49e\/b14\/000\/49eb14000ef5390ee8cc39c4451b2160.png\"\/><\/figure>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a-\u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/github.com\/nodejs\/node\/blob\/main\/benchmark\/_test-double-benchmarker.js\"><u>test-double-http<\/u><\/a>. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 Node.js \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 HTTP GET-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432:<\/p>\n<pre><code class=\"javascript\">function run() {   if (http.get) { \/\/ HTTP or HTTPS     if (options) {       http.get(url, options, request);     } else {       http.get(url, request);     }   } else { \/\/ HTTP\/2     const client = http.connect(url);     client.on('error', () => {});     request(client.request(), client);   } }  run();<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433\u0430, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a autocannon \u0438\u043b\u0438 wrk, \u043c\u044b \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u2014 \u0441 <strong>96%<\/strong> \u0434\u043e <strong>9%<\/strong>. <a href=\"https:\/\/github.com\/nodejs\/performance\/issues\/80\"><u>\u042d\u0442\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433\u0430 \u0438\u043c\u0435\u043b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0438<\/u><\/a>. \u041e\u0434\u043d\u0430\u043a\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0430\u0441\u044c, \u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441.<\/p>\n<h4>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438 \u043c\u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 96%\/9% \u0432 \u043c\u043e\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 Express\/Fastify?<\/h4>\n<p>\u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u043d\u0435\u0442. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 HTTP API \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0440\u0438\u0447\u0438\u043d, \u043f\u043e\u0447\u0435\u043c\u0443 Fastify&#8230; \u0431\u044b\u0441\u0442\u0440\u044b\u0439! \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043e\u0442\u0447\u0435\u0442\u0435 \u0431\u044b\u043b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 (3. HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u044b).<\/p>\n<h3>\u0420\u0430\u0437\u043d\u043e\u0435<\/h3>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u0430\u0448\u0438\u043c \u0442\u0435\u0441\u0442\u0430\u043c, \u0441\u043a\u0440\u0438\u043f\u0442 startup.js \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 Node.js, \u043f\u0440\u0438\u0447\u0435\u043c \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Node.js \u0432\u0435\u0440\u0441\u0438\u0438 18 \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 20 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 27%. \u041e\u043d\u043e \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0435\u0442 \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 Node.js \u0432\u0435\u0440\u0441\u0438\u0438 16, \u0433\u0434\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u043d\u0430 34,75%!<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0431\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0442\u0430\u043b\u043e \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u043c \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u0432 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u043e\u0431\u0449\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Node.js \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u0430\u0441\u043f\u0435\u043a\u0442\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043e \u0447\u0435\u043c \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430\u0448\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u0430: <a href=\"https:\/\/github.com\/nodejs\/node\/issues\/35711\"><u>https:\/\/github.com\/nodejs\/node\/issues\/35711<\/u><\/a>.<\/p>\n<p>\u0421\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0434\u0435\u0442 \u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u0443 \u0431\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c, \u043d\u043e \u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Node.js, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u0412 \u0446\u0435\u043b\u043e\u043c, \u044d\u0442\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 \u0441\u0442\u0440\u0435\u043c\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Node.js \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<pre><code>$ node-benchmark-compare compare-misc-16-18.csv                                                                                      confidence improvement accuracy (*)   (**)  (***) misc\/startup.js count=30 mode='process' script='benchmark\/fixtures\/require-builtins'        ***     12.99 %       \u00b10.14% \u00b10.19% \u00b10.25% misc\/startup.js count=30 mode='process' script='test\/fixtures\/semicolon'                    ***      5.88 %       \u00b10.15% \u00b10.20% \u00b10.26% misc\/startup.js count=30 mode='worker' script='benchmark\/fixtures\/require-builtins'         ***      5.26 %       \u00b10.14% \u00b10.19% \u00b10.25% misc\/startup.js count=30 mode='worker' script='test\/fixtures\/semicolon'                     ***      3.84 %       \u00b10.15% \u00b10.21% \u00b10.27%  $ node-benchmark-compare compare-misc-18-20.csv                                                                                      confidence improvement accuracy (*)   (**)  (***) misc\/startup.js count=30 mode='process' script='benchmark\/fixtures\/require-builtins'        ***     -4.80 %       \u00b10.13% \u00b10.18% \u00b10.23% misc\/startup.js count=30 mode='process' script='test\/fixtures\/semicolon'                    ***     27.27 %       \u00b10.22% \u00b10.29% \u00b10.38% misc\/startup.js count=30 mode='worker' script='benchmark\/fixtures\/require-builtins'         ***      7.23 %       \u00b10.21% \u00b10.28% \u00b10.37% misc\/startup.js count=30 mode='worker' script='test\/fixtures\/semicolon'                     ***     31.26 %       \u00b10.33% \u00b10.44% \u00b10.58%<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442. \u041c\u044b \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u044f, \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e [mode] (\u0440\u0435\u0436\u0438\u043c) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e [script] (\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439), \u0433\u0434\u0435 [mode] \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c:<\/p>\n<ul>\n<li>\n<p><code>process<\/code> \u2014 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 Node.js<\/p>\n<\/li>\n<li>\n<p><code>worker<\/code> \u2014 worker_thread (\u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u043e\u0442\u043e\u043a) Node.js.<\/p>\n<\/li>\n<\/ul>\n<p>\u0410 [script] \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430:<\/p>\n<ul>\n<li>\n<p><code>benchmark\/fixtures\/require-builtins<\/code> \u2014 \u0441\u043a\u0440\u0438\u043f\u0442, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0432\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 Node.js<\/p>\n<\/li>\n<li>\n<p><code>test\/fixtures\/semicolon<\/code> \u2014 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 ; (\u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439).<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0435\u0433\u043a\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/github.com\/sharkdp\/hyperfine\"><u>hyperfine<\/u><\/a> \u0438\u043b\u0438 time:<\/p>\n<pre><code>$ hyperfine --warmup 3 '.\/node16 .\/nodejs-internal-benchmark\/semicolon.js' Benchmark 1: .\/node16 .\/nodejs-internal-benchmark\/semicolon.js   Time (mean \u00b1 \u03c3):      24.7 ms \u00b1   0.3 ms    [User: 19.7 ms, System: 5.2 ms]   Range (min \u2026 max):    24.1 ms \u2026  25.6 ms    121 runs  $ hyperfine --warmup 3 '.\/node18 .\/nodejs-internal-benchmark\/semicolon.js' Benchmark 1: .\/node18 .\/nodejs-internal-benchmark\/semicolon.js   Time (mean \u00b1 \u03c3):      24.1 ms \u00b1   0.3 ms    [User: 18.1 ms, System: 6.3 ms]   Range (min \u2026 max):    23.6 ms \u2026  25.3 ms    123 runs  $ hyperfine --warmup 3 '.\/node20 .\/nodejs-internal-benchmark\/semicolon.js' Benchmark 1: .\/node20 .\/nodejs-internal-benchmark\/semicolon.js   Time (mean \u00b1 \u03c3):      18.4 ms \u00b1   0.3 ms    [User: 13.0 ms, System: 5.9 ms]   Range (min \u2026 max):    18.0 ms \u2026  19.7 ms    160 runs<\/code><\/pre>\n<p>? Warmup (\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f \u0443\u0447\u0435\u0442\u0430 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c <code>trace_events<\/code> \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0442\u0435\u0440\u043f\u0435\u043b \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438: \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 Node.js \u0432\u0435\u0440\u0441\u0438\u0438 16 \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 20 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e <strong>7%<\/strong>. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 Node.js \u0432\u0435\u0440\u0441\u0438\u0438 18 \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 20 \u044d\u0442\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0438\u0436\u0435 \u2014 <strong>2,39%<\/strong>.<\/p>\n<h3>\u041c\u043e\u0434\u0443\u043b\u044c<\/h3>\n<p><code>require()<\/code> (\u0438\u043b\u0438 module.require) \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u044b\u043b \u0432\u0438\u043d\u043e\u0432\u043d\u0438\u043a\u043e\u043c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Node.js. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u041c\u0435\u0436\u0434\u0443 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 Node.js 18 \u0438 20 \u043c\u044b \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 <strong>4,20%<\/strong> \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 .js, <strong>6,58%<\/strong> \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 .json \u0438 <strong>9,50%<\/strong> \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u2014 \u0432\u0441\u0435 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u043c\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0443.<\/p>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f <code>require()<\/code> \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 Node.js. \u0421\u043e\u043a\u0440\u0430\u0442\u0438\u0432 \u0432\u0440\u0435\u043c\u044f \u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/201\/a93\/1d0\/201a931d0b639fe15a27aaae5a06a1c6.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/201\/a93\/1d0\/201a931d0b639fe15a27aaae5a06a1c6.png\"\/><\/figure>\n<h3>\u041f\u043e\u0442\u043e\u043a\u0438<\/h3>\n<p>\u041f\u043e\u0442\u043e\u043a\u0438 (streams) \u2014 \u044d\u0442\u043e \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043c\u043e\u0449\u043d\u0430\u044f \u0438 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f Node.js. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 Node.js 16 \u0438 18 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438, \u0441\u0442\u0430\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435. \u041a \u043d\u0438\u043c \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 Duplex, Readable, Transform \u0438 Writable, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043e\u0434 .pipe() \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 Readable \u2192 Writable.<\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u0433\u0440\u0430\u0444\u0438\u043a \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0443 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/75d\/e7c\/139\/75de7c139edc141b94027793a94f90c1.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/75d\/e7c\/139\/75de7c139edc141b94027793a94f90c1.png\"\/><\/figure>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0432 Node.js 20 \u044d\u0442\u0430 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f pipe \u0431\u044b\u043b\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0430:<\/p>\n<pre><code>$ node-benchmark-compare compare-streams-18-20.csv                                                        confidence improvement accuracy (*)   (**)  (***) streams\/creation.js kind='duplex' n=50000000                  ***     12.76 %       \u00b14.30% \u00b15.73% \u00b17.47% streams\/creation.js kind='readable' n=50000000                ***      3.48 %       \u00b11.16% \u00b11.55% \u00b12.05% streams\/creation.js kind='transform' n=50000000                **     -7.59 %       \u00b15.27% \u00b17.02% \u00b19.16% streams\/creation.js kind='writable' n=50000000                ***      4.20 %       \u00b10.87% \u00b11.16% \u00b11.53% streams\/destroy.js kind='duplex' n=1000000                    ***     -6.33 %       \u00b11.08% \u00b11.43% \u00b11.87% streams\/destroy.js kind='readable' n=1000000                  ***     -1.94 %       \u00b10.70% \u00b10.93% \u00b11.21% streams\/destroy.js kind='transform' n=1000000                 ***     -7.44 %       \u00b10.93% \u00b11.24% \u00b11.62% streams\/destroy.js kind='writable' n=1000000                           0.20 %       \u00b11.89% \u00b12.52% \u00b13.29% streams\/pipe.js n=5000000                                     ***     87.18 %       \u00b12.58% \u00b13.46% \u00b14.56%<\/code><\/pre>\n<p>\u0418 \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (\u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, Transform) \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0440\u0443\u044e\u0442 \u0432 Node.js 20. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 Node.js 16 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u043c\u0435\u0435\u0442 \u0441\u0430\u043c\u044b\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u2014 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0439\u0442\u0435 \u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u0430\u043a \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 &#171;\u043f\u043e\u0442\u043e\u043a\u0438 Node.js \u0432 v18 \u0438 v20 \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435!&#187;. \u042d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043a\u0430\u043a \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c, \u0442\u0430\u043a \u0438 \u043d\u0435\u0442 \u043d\u0430 \u0432\u0430\u0448\u0443 \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u043d\u0430\u0438\u0432\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0432 <a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v20.md#streamwritable\"><u>nodejs-bench-operations<\/u><\/a>, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043d\u0438\u043f\u043f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u043d\u0430 Node.js 20, \u0447\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u0438:<\/p>\n<pre><code class=\"javascript\">suite.add('streams.Writable writing 1e3 * \"some data\"', function () {   const writable = new Writable({     write (chunk, enc, cb) {       cb()     }   })    let i = 0   while(i &lt; 1e3) {     writable.write('some data')     ++i   } })<\/code><\/pre>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b instantiation (\u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435) \u0438 destroy (\u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435) \u0438\u0433\u0440\u0430\u044e\u0442 \u0432\u0430\u0436\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 Node.js. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u043a\u0430\u0436\u0435\u0442 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u044d\u0442\u0430 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f <a href=\"https:\/\/blog.rafaelgss.dev\/state-of-nodejs-performance-2023#:~:text=However%2C%20this%20regression%20is%20being%20monitored%20closely%20in%20the%20Node.js%20Performance%20WG.\"><u>\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f<\/u><\/a> \u0432 <a href=\"https:\/\/github.com\/nodejs\/performance\"><u>Node.js Performance WG<\/u><\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/865\/9be\/310\/8659be31018651a5cc0943fd997b482c.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/865\/9be\/310\/8659be31018651a5cc0943fd997b482c.png\"\/><\/figure>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 (~6,14%) \u043d\u0430 Node.js 20.<\/p>\n<h3>URL<\/h3>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Node.js 18, \u0432 \u043d\u0435\u0435 \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u0441\u0435\u0440\u0430 URL \u2014 <a href=\"https:\/\/github.com\/ada-url\/ada\"><u>Ada<\/u><\/a>. \u042d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c Node.js \u043f\u0440\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 URL \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c <strong>400%<\/strong>. \u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0435 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440, \u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u044d\u0442\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041d\u0430\u0431\u043e\u0440 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 URL \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u0435\u043b\u0438\u043a. \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 URL WHATWG.<\/p>\n<p><code>url.parse()<\/code> \u0438 <code>url.resolve()<\/code> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c\u0438 \u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u043c\u0438 API. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0438\u0441\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Node.js, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 \u0438\u0445. \u0426\u0438\u0442\u0438\u0440\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e Node.js:<\/p>\n<p><code>url.parse()<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u044f\u0433\u043a\u0438\u0439, \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0441\u0442\u0440\u043e\u043a URL. \u041e\u043d \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d \u0442\u0430\u043a\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043a\u0430\u043a <a href=\"https:\/\/hackerone.com\/reports\/678487\"><u>\u043f\u043e\u0434\u043c\u0435\u043d\u0430 \u0438\u043c\u0435\u043d\u0438 \u0445\u043e\u0441\u0442\u0430<\/u><\/a> \u0438 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u043c\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u0439. \u041d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0438\u043c \u043f\u0440\u0438 \u043d\u0435\u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. CVE \u043d\u0435 \u0432\u044b\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 <code>url.parse()<\/code>. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <a href=\"https:\/\/nodejs.org\/api\/url.html#the-whatwg-url-api\"><u>WHATWG URL<\/u><\/a> API.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 url.parse \u0438 url.resolve, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 <a href=\"https:\/\/github.com\/RafaelGSS\/state-of-nodejs-performance-2023#url-results\"><u>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c State of Node.js Performance 2023<\/u><\/a>.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u043e\u0432\u043e\u0433\u043e whatwg-url-parse:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8c0\/649\/20f\/8c064920f2a14413e333f0d66b09b477.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8c0\/649\/20f\/8c064920f2a14413e333f0d66b09b477.png\"\/><\/figure>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a URL-\u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430.<\/p>\n<pre><code class=\"javascript\">const urls = {   long: 'http:\/\/nodejs.org:89\/docs\/latest\/api\/foo\/bar\/qua\/13949281\/0f28b\/' +         '\/5d49\/b3020\/url.html#test?payload1=true&amp;payload2=false&amp;test=1' +         '&amp;benchmark=3&amp;foo=38.38.011.293&amp;bar=1234834910480&amp;test=19299&amp;3992&amp;' +         'key=f5c65e1e98fe07e648249ad41e1cfdb0',   short: 'https:\/\/nodejs.org\/en\/blog\/',   idn: 'http:\/\/\u4f60\u597d\u4f60\u597d.\u5728\u7ebf',   auth: 'https:\/\/user:pass@example.com\/path?search=1',   file: 'file:\/\/\/foo\/bar\/test\/node.js',   ws: 'ws:\/\/localhost:9229\/f46db715-70df-43ad-a359-7f9949f39868',   javascript: 'javascript:alert(\"node is awesome\");',   percent: 'https:\/\/%E4%BD%A0\/foo',   dot: 'https:\/\/example.org\/.\/a\/..\/b\/.\/c', }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0430 Ada 2.0 \u0432 Node.js 20 \u043c\u043e\u0436\u043d\u043e \u0441 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 Node.js 18 \u0441 Node.js 20 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a3b\/79b\/fb6\/a3b79bfb619348f0f9732bc984f69ceb.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a3b\/79b\/fb6\/a3b79bfb619348f0f9732bc984f69ceb.png\"\/><\/figure>\n<p>\u0410 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a-\u0444\u0430\u0439\u043b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442:<\/p>\n<pre><code class=\"javascript\">function useWHATWGWithoutBase(data) {   const len = data.length;   let result = new URL(data[0]);  \/\/ Avoid dead code elimination   bench.start();   for (let i = 0; i &lt; len; ++i) {     result = new URL(data[i]);   }   bench.end(len);   return result; }  function useWHATWGWithBase(data) {   const len = data.length;   let result = new URL(data[0][0], data[0][1]);  \/\/ Avoid dead code elimination   bench.start();   for (let i = 0; i &lt; len; ++i) {     const item = data[i];     result = new URL(item[0], item[1]);   }   bench.end(len);   return result; }<\/code><\/pre>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u044b \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438\/\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 URL. \u0421\u0442\u043e\u0438\u0442 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0431\u0430\u0437\u044b (<em>withBase=&#8217;true&#8217;<\/em>), \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0434\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 (new URL(data)). \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0432 <a href=\"https:\/\/github.com\/RafaelGSS\/state-of-nodejs-performance-2023#url-results\"><u>\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/u><\/a>.<\/p>\n<h3>\u0411\u0443\u0444\u0435\u0440\u044b<\/h3>\n<p>\u0412 Node.js \u0431\u0443\u0444\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0411\u0443\u0444\u0435\u0440\u044b \u2014 \u044d\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u0412 \u0446\u0435\u043b\u043e\u043c, \u0431\u0443\u0444\u0435\u0440\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u043e\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439 Node.js \u0438 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445 \u0438\u0437 \u0432\u0430\u0441, \u043a\u0442\u043e \u043f\u0440\u044f\u043c\u043e \u0438\u043b\u0438 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0431\u0443\u0444\u0435\u0440\u044b Node.js, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 (\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u043f\u0440\u043e\u0445\u043e\u0434\u0446\u0435\u0432 Node.js 20).<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 <code>Buffer.from()<\/code> Node.js 20 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b \u0434\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438 \u0438\u0437 Node.js 18:<\/p>\n<ul>\n<li>\n<p>Buffer.concat()<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a7c\/5ff\/f31\/a7c5fff3163ec428b1836ec7e721bb76.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a7c\/5ff\/f31\/a7c5fff3163ec428b1836ec7e721bb76.png\"\/><\/figure>\n<p>Node.js \u0432\u0435\u0440\u0441\u0438\u0438 20 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 18, \u0438 \u044d\u0442\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u0436\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 16:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fcc\/b71\/464\/fccb71464f6fdbfa76e0607a1c09900c.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fcc\/b71\/464\/fccb71464f6fdbfa76e0607a1c09900c.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/176\/0d7\/1b7\/1760d71b7facc02438b6f4e1dab35cca.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/176\/0d7\/1b7\/1760d71b7facc02438b6f4e1dab35cca.png\"\/><\/figure>\n<ul>\n<li>\n<p>Buffer.toJSON()<\/p>\n<\/li>\n<\/ul>\n<p>\u0421 Node.js 16 \u0434\u043e Node.js 18 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Buffer.toJSON \u043d\u0430 <strong>88%<\/strong>:<\/p>\n<pre><code>$ node-benchmark-compare compare-buffers-16-18.csv                                                                             confidence improvement accuracy (*)    (**)   (***) buffers\/buffer-tojson.js len=256 n=10000                                           ***    -81.12 %       \u00b11.25%  \u00b11.69%  \u00b12.24% buffers\/buffer-tojson.js len=4096 n=10000                                          ***    -88.39 %       \u00b10.69%  \u00b10.93%  \u00b11.23%<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u0430 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f \u0431\u044b\u043b\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0430 \u0432 Node.js 20 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438!<\/p>\n<pre><code>$ node-benchmark-compare compare-buffers-18-20.csv                                                                             confidence improvement accuracy (*)    (**)   (***) buffers\/buffer-tojson.js len=256 n=10000                                           ***    482.81 %       \u00b17.02% \u00b19.42% \u00b112.42% buffers\/buffer-tojson.js len=4096 n=10000                                          ***    763.34 %       \u00b15.22% \u00b17.04%  \u00b19.34%<\/code><\/pre>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e Node.js 20 \u2014 \u0441\u0430\u043c\u0430\u044f \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Node.js \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438.<\/p>\n<p>\u041f\u043e\u043b\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 Node.js 20 \u0438 Node.js 18 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0438\u0436\u0435:<\/p>\n<pre><code>$ node-benchmark-compare compare-buffers-18-20.csv                                                                             confidence improvement accuracy (*)   (**)   (***) buffers\/buffer-base64-decode.js size=8388608 n=32                                  ***      1.66 %       \u00b10.10% \u00b10.14%  \u00b10.18% buffers\/buffer-base64-encode.js n=32 len=67108864                                  ***     -0.44 %       \u00b10.17% \u00b10.23%  \u00b10.30% buffers\/buffer-compare.js n=1000000 size=16                                        ***     -3.14 %       \u00b10.82% \u00b11.09%  \u00b11.41% buffers\/buffer-compare.js n=1000000 size=16386                                     ***    -15.56 %       \u00b15.97% \u00b17.95% \u00b110.35% buffers\/buffer-compare.js n=1000000 size=4096                                              -2.63 %       \u00b13.09% \u00b14.11%  \u00b15.35% buffers\/buffer-compare.js n=1000000 size=512                                       ***     -6.15 %       \u00b11.28% \u00b11.71%  \u00b12.24% buffers\/buffer-concat.js n=800000 withTotalLength=0 pieceSize=1 pieces=16          ***    300.67 %       \u00b10.71% \u00b10.95%  \u00b11.24% buffers\/buffer-concat.js n=800000 withTotalLength=0 pieceSize=1 pieces=4           ***    212.56 %       \u00b14.81% \u00b16.47%  \u00b18.58% buffers\/buffer-concat.js n=800000 withTotalLength=0 pieceSize=16 pieces=16         ***    287.63 %       \u00b12.47% \u00b13.32%  \u00b14.40% buffers\/buffer-concat.js n=800000 withTotalLength=0 pieceSize=16 pieces=4          ***    216.54 %       \u00b11.24% \u00b11.66%  \u00b12.17% buffers\/buffer-concat.js n=800000 withTotalLength=0 pieceSize=256 pieces=16        ***     38.44 %       \u00b11.04% \u00b11.38%  \u00b11.80% buffers\/buffer-concat.js n=800000 withTotalLength=0 pieceSize=256 pieces=4         ***     91.52 %       \u00b13.26% \u00b14.38%  \u00b15.80% buffers\/buffer-concat.js n=800000 withTotalLength=1 pieceSize=1 pieces=16          ***    192.63 %       \u00b10.56% \u00b10.74%  \u00b10.97% buffers\/buffer-concat.js n=800000 withTotalLength=1 pieceSize=1 pieces=4           ***    157.80 %       \u00b11.52% \u00b12.02%  \u00b12.64% buffers\/buffer-concat.js n=800000 withTotalLength=1 pieceSize=16 pieces=16         ***    188.71 %       \u00b12.33% \u00b13.12%  \u00b14.10% buffers\/buffer-concat.js n=800000 withTotalLength=1 pieceSize=16 pieces=4          ***    151.18 %       \u00b11.13% \u00b11.50%  \u00b11.96% buffers\/buffer-concat.js n=800000 withTotalLength=1 pieceSize=256 pieces=16        ***     20.83 %       \u00b11.29% \u00b11.72%  \u00b12.25% buffers\/buffer-concat.js n=800000 withTotalLength=1 pieceSize=256 pieces=4         ***     59.13 %       \u00b13.18% \u00b14.28%  \u00b15.65% buffers\/buffer-from.js n=800000 len=100 source='array'                             ***      3.91 %       \u00b10.50% \u00b10.66%  \u00b10.87% buffers\/buffer-from.js n=800000 len=100 source='arraybuffer-middle'                ***     11.94 %       \u00b10.65% \u00b10.86%  \u00b11.13% buffers\/buffer-from.js n=800000 len=100 source='arraybuffer'                       ***     12.49 %       \u00b10.77% \u00b11.03%  \u00b11.36% buffers\/buffer-from.js n=800000 len=100 source='buffer'                            ***      7.46 %       \u00b11.21% \u00b11.62%  \u00b12.12% buffers\/buffer-from.js n=800000 len=100 source='object'                            ***     12.70 %       \u00b10.84% \u00b11.12%  \u00b11.47% buffers\/buffer-from.js n=800000 len=100 source='string-base64'                     ***      2.91 %       \u00b11.40% \u00b11.88%  \u00b12.46% buffers\/buffer-from.js n=800000 len=100 source='string-utf8'                       ***     12.97 %       \u00b10.77% \u00b11.02%  \u00b11.33% buffers\/buffer-from.js n=800000 len=100 source='string'                            ***     16.61 %       \u00b10.71% \u00b10.95%  \u00b11.25% buffers\/buffer-from.js n=800000 len=100 source='uint16array'                       ***      5.64 %       \u00b10.84% \u00b11.13%  \u00b11.48% buffers\/buffer-from.js n=800000 len=100 source='uint8array'                        ***      6.75 %       \u00b10.95% \u00b11.28%  \u00b11.68% buffers\/buffer-from.js n=800000 len=2048 source='array'                                     0.03 %       \u00b10.33% \u00b10.43%  \u00b10.56% buffers\/buffer-from.js n=800000 len=2048 source='arraybuffer-middle'               ***     11.73 %       \u00b10.55% \u00b10.74%  \u00b10.96% buffers\/buffer-from.js n=800000 len=2048 source='arraybuffer'                      ***     12.85 %       \u00b10.55% \u00b10.73%  \u00b10.96% buffers\/buffer-from.js n=800000 len=2048 source='buffer'                           ***      7.66 %       \u00b11.28% \u00b11.70%  \u00b12.21% buffers\/buffer-from.js n=800000 len=2048 source='object'                           ***     11.96 %       \u00b10.90% \u00b11.20%  \u00b11.57% buffers\/buffer-from.js n=800000 len=2048 source='string-base64'                    ***      4.10 %       \u00b10.46% \u00b10.61%  \u00b10.79% buffers\/buffer-from.js n=800000 len=2048 source='string-utf8'                      ***     -1.30 %       \u00b10.71% \u00b10.96%  \u00b11.27% buffers\/buffer-from.js n=800000 len=2048 source='string'                           ***     -2.23 %       \u00b10.93% \u00b11.25%  \u00b11.64% buffers\/buffer-from.js n=800000 len=2048 source='uint16array'                      ***      6.89 %       \u00b11.44% \u00b11.91%  \u00b12.49% buffers\/buffer-from.js n=800000 len=2048 source='uint8array'                       ***      7.74 %       \u00b11.36% \u00b11.81%  \u00b12.37% buffers\/buffer-tojson.js len=0 n=10000                                             ***    -11.63 %       \u00b12.34% \u00b13.11%  \u00b14.06% buffers\/buffer-tojson.js len=256 n=10000                                           ***    482.81 %       \u00b17.02% \u00b19.42% \u00b112.42% buffers\/buffer-tojson.js len=4096 n=10000                                          ***    763.34 %       \u00b15.22% \u00b17.04%  \u00b19.34%<\/code><\/pre>\n<h3>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430<\/h3>\n<p>TextDecoder \u0438 TextEncoder \u2014 \u044d\u0442\u043e \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 JavaScript, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Web API \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0431-\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u0445 \u0438 Node.js. \u0412\u043c\u0435\u0441\u0442\u0435 TextDecoder \u0438 TextEncoder \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 JavaScript, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<p>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0432 Node.js 18. \u0421 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/simdutf\/simdutf\"><strong><u>simdutf<\/u><\/strong><\/a> \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 UTF-8 \u0432 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0438\u0441\u044c \u043d\u0430 <strong>364%<\/strong> (\u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u043a\u0430\u0447\u043e\u043a) \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Node.js 16.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e66\/170\/de8\/e66170de8e5581e29b47f301e8c54a09.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e66\/170\/de8\/e66170de8e5581e29b47f301e8c54a09.png\"\/><\/figure>\n<p>\u042d\u0442\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u0438 \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u043c\u0438 \u0432 Node.js 20: \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0440\u043e\u0441\u043b\u0430 \u043d\u0430 <strong>25%<\/strong> \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Node.js 18. \u041f\u043e\u043b\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/RafaelGSS\/state-of-nodejs-performance-2023#util\"><u>state-of-nodejs-performance-2023<\/u><\/a>.<\/p>\n<p>\u041f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 Node.js 18. \u041e\u0442 Node.js 16 \u0434\u043e Node.js 18, TextEncoder.encodeInto \u0434\u043e\u0441\u0442\u0438\u0433 <strong>93,67%<\/strong> \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0438 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ascii \u0441 \u0434\u043b\u0438\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 256):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/592\/0ce\/b71\/5920ceb712d846adc9f68b3dde22b26d.png\" width=\"1600\" height=\"1600\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/592\/0ce\/b71\/5920ceb712d846adc9f68b3dde22b26d.png\"\/><\/figure>\n<h3>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433\u0430 \u0432 Node.js<\/h3>\n<p>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433\u0430 \u0432 Node.js \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438 \u0443 \u043c\u0435\u043d\u044f \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u0441\u0442\u0432\u043e. \u041a\u0430\u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 Node.js \u0438 \u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0432 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u044f \u043d\u0430\u0445\u043e\u0436\u0443 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u0438 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0442\u0435\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0434\u0432\u0438\u0436\u043a\u043e\u043c V8. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u044f \u0447\u0430\u0441\u0442\u043e \u043b\u044e\u0431\u043b\u044e \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\u043c\u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043b\u044e\u0434\u044c\u043c\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0439 \u0438 \u0441\u0435\u043c\u0438\u043d\u0430\u0440\u043e\u0432, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 <a href=\"https:\/\/www.nearform.com\/\"><u>NearForm<\/u><\/a>, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0441\u0432\u044f\u0437\u0430\u043d. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043c\u043e\u0438\u0445 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0445 \u043d\u0430 \u0434\u0430\u043d\u043d\u0443\u044e \u0442\u0435\u043c\u0443, <a href=\"https:\/\/rafaelgss.dev\/\"><u>\u043f\u0435\u0440\u0435\u0439\u0434\u044f \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435<\/u><\/a>.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 \u044d\u0442\u0438\u0445 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 ops\/sec, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u0430 \u043e\u0434\u043d\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0430\u0448\u0435\u0433\u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0447\u0438\u0442\u0430\u043b\u0438 \u043c\u043e\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e (<a href=\"https:\/\/blog.rafaelgss.dev\/preparing-and-evaluating-benchmarks\"><u>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0438 \u043e\u0446\u0435\u043d\u043a\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432<\/u><\/a>), \u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b &#171;\u041e\u0446\u0435\u043d\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432&#187;, \u0433\u0434\u0435 \u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 ops\/sec \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u2014 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0432\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443.<\/p>\n<h3>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b<\/h3>\n<p>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0442\u0440\u043e\u043a \u0432 \u0447\u0438\u0441\u043b\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e + \u0438\u043b\u0438 parseInt(x, 10). \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 + \u0431\u044b\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c parseInt(x, 10) \u0432 \u0440\u0430\u043d\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 Node.js, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0438\u0436\u0435:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>name<\/p>\n<\/th>\n<th>\n<p>ops\/sec<\/p>\n<\/th>\n<th>\n<p>samples<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using parseInt(x, 10) &#8212; small number (2 len)<\/p>\n<\/td>\n<td>\n<p align=\"left\">283,768,532<\/p>\n<\/td>\n<td>\n<p align=\"left\">91<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using parseInt(x, 10) &#8212; big number (10 len)<\/p>\n<\/td>\n<td>\n<p align=\"left\">21,307,115<\/p>\n<\/td>\n<td>\n<p align=\"left\">100<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using + &#8212; small number (2 len)<\/p>\n<\/td>\n<td>\n<p align=\"left\">849,906,952<\/p>\n<\/td>\n<td>\n<p align=\"left\">100<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using + &#8212; big number (10 len)<\/p>\n<\/td>\n<td>\n<p align=\"left\">849,173,336<\/p>\n<\/td>\n<td>\n<p align=\"left\">97<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v18.md#parsing-integer\"><u>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/u><\/a><\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0441 \u0432\u044b\u0445\u043e\u0434\u043e\u043c Node.js 20 \u0438 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 V8 (11.4) \u043e\u0431\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u043c\u0438, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u043d\u0438\u0436\u0435:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>name<\/p>\n<\/th>\n<th>\n<p>ops\/sec<\/p>\n<\/th>\n<th>\n<p>samples<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using parseInt(x, 10) &#8212; small number (2 len)<\/p>\n<\/td>\n<td>\n<p align=\"left\">856,413,575<\/p>\n<\/td>\n<td>\n<p align=\"left\">98<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using parseInt(x, 10) &#8212; big number (10 len)<\/p>\n<\/td>\n<td>\n<p align=\"left\">856,754,259<\/p>\n<\/td>\n<td>\n<p align=\"left\">96<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using + &#8212; small number (2 len)<\/p>\n<\/td>\n<td>\n<p align=\"left\">857,364,191<\/p>\n<\/td>\n<td>\n<p align=\"left\">98<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using + &#8212; big number (10 len)<\/p>\n<\/td>\n<td>\n<p align=\"left\">857,511,971<\/p>\n<\/td>\n<td>\n<p align=\"left\">96<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v20.md#parsing-integer\"><u>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/u><\/a><\/p>\n<h3>Super \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 This<\/h3>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432, \u0438\u0437\u043c\u0435\u043d\u0438\u0432\u0448\u0438\u0445\u0441\u044f \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Node.js 20, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 this \u0438\u043b\u0438 super \u0432 \u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0438\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/p>\n<pre><code class=\"javascript\">class Base {   foo () {     return 10 * 1e2   } }  class SuperClass extends Base {   bar () {     const tmp = 20 * 23     return super.foo() + tmp   } }  class ThisClass extends Base {   bar () {     const tmp = 20 * 23     return this.foo() + tmp   } }<\/code><\/pre>\n<p>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 super \u0438 this \u0432 Node.js 18 \u0434\u0430\u0432\u0430\u043b\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 (ops\/sec):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>name<\/p>\n<\/th>\n<th>\n<p>ops\/sec<\/p>\n<\/th>\n<th>\n<p>samples<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using super<\/p>\n<\/td>\n<td>\n<p align=\"left\">159,426,608<\/p>\n<\/td>\n<td>\n<p align=\"left\">96<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using this<\/p>\n<\/td>\n<td>\n<p align=\"left\">160,092,440<\/p>\n<\/td>\n<td>\n<p align=\"left\">91<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v18.md#super-vs-this\"><u>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/u><\/a><\/p>\n<p>\u041d\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u043e\u0438\u043c\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c\u0438 \u0438 \u043d\u0430 Node.js 20. \u042d\u0442\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435\u043c:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>name<\/p>\n<\/th>\n<th>\n<p>ops\/sec<\/p>\n<\/th>\n<th>\n<p>samples<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using super<\/p>\n<\/td>\n<td>\n<p align=\"left\">850,760,436<\/p>\n<\/td>\n<td>\n<p align=\"left\">97<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Using this<\/p>\n<\/td>\n<td>\n<p align=\"left\">853,619,840<\/p>\n<\/td>\n<td>\n<p align=\"left\">99<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v20.md#super-vs-this\"><u>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/u><\/a><\/p>\n<p>\u041f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 this \u043d\u0430 Node.js 20 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Node.js 18. \u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u0437\u0430\u043c\u0435\u0442\u0435\u043d: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 this \u043d\u0430 Node.js 20 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0438\u0445 <em>853 619 840 \u043e\u043f\/\u0441<\/em> \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 <em>160 092 440 \u043e\u043f\/\u0441<\/em> \u043d\u0430 Node.js 18, \u0447\u0442\u043e \u043d\u0430 <strong>433%<\/strong> \u043b\u0443\u0447\u0448\u0435! \u041f\u043e-\u0432\u0438\u0434\u0438\u043c\u043e\u043c\u0443, \u0443 \u043d\u0435\u0433\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c, \u043a\u0430\u043a \u0438 \u0443 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430: <code>obj.property1<\/code>. \u0422\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043e\u0431\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u044d\u0442\u043e \u0432\u0440\u044f\u0434 \u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e.<\/p>\n<h3>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c<\/h3>\n<p>\u0412 JavaScript \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u0435\u043d \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435. \u041a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u0435\u0439 \u043d\u043e\u0432\u043e\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 nodejs-bench-operations \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u043e\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u0435\u0442 \u043d\u0430 \u0438\u0445 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432 Node.js 20 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0441\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 <code>writable: true<\/code> \u0438 <code>enumerable\/configurable: false<\/code>.<\/p>\n<pre><code class=\"javascript\">const myObj = {};  Object.defineProperty(myObj, 'test', {   writable: true,   value: 'Hello',   enumerable: false,   configurable: false, });  myObj.test \/\/ How fast is the property access?<\/code><\/pre>\n<p>\u041d\u0430 Node.js 18 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 (myObj.test) \u043f\u0440\u043e\u0434\u0443\u0446\u0438\u0440\u043e\u0432\u0430\u043b <em>166 422 265 \u043e\u043f\/\u0441<\/em>. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u0442\u0435\u0445 \u0436\u0435 \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u0445 Node.js 20 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 <em>857 316 403 \u043e\u043f\/\u0441<\/em>! \u042d\u0442\u0443 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430:<\/p>\n<ul>\n<li>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0433\u0435\u0442\u0442\u0435\u0440\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v18.md#property-getter-access\"><u>v18<\/u><\/a> \/ <a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v20.md#property-getter-access\"><u>v20<\/u><\/a><\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u0442\u0442\u0435\u0440\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v18.md#property-setter-access\"><u>v18<\/u><\/a> \/ <a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v20.md#property-setter-access\"><u>v20<\/u><\/a><\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0444\u043e\u0440\u043c\u044b <a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v18.md\"><u>v18<\/u><\/a> \/ <a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v20.md#property-access-after-shape-transition\"><u>v20<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<h3>Array.prototype.at<\/h3>\n<p><a href=\"http:\/\/Array.prototype.at\">Array.prototype.at<\/a>(-1) \u2014 \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0432\u0432\u0435\u0434\u0435\u043d \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 ECMAScript 2021. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043d\u0435 \u0437\u043d\u0430\u044f \u0435\u0433\u043e \u0434\u043b\u0438\u043d\u044b \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044e\u0437\u043a\u0435\u0439\u0441\u0430\u0445. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u0435\u0442\u043e\u0434 at() \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u0438 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438, \u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u043a <code>array[array.length - 1]<\/code>.<\/p>\n<p>\u041d\u0430 Node.js 18 \u044d\u0442\u043e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u044b\u043b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 <code>Array[length-1]<\/code>:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"352\" width=\"352\">\n<p>name<\/p>\n<\/th>\n<th data-colwidth=\"158\" width=\"158\">\n<p>ops\/sec<\/p>\n<\/th>\n<th>\n<p>samples<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"352\" width=\"352\">\n<p align=\"left\">Length = 100 &#8212; Array.at<\/p>\n<\/td>\n<td data-colwidth=\"158\" width=\"158\">\n<p align=\"left\">26,652,680<\/p>\n<\/td>\n<td>\n<p align=\"left\">99<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"352\" width=\"352\">\n<p align=\"left\">Length = 10_000 &#8212; Array.at<\/p>\n<\/td>\n<td data-colwidth=\"158\" width=\"158\">\n<p align=\"left\">26,317,564<\/p>\n<\/td>\n<td>\n<p align=\"left\">97<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"352\" width=\"352\">\n<p align=\"left\">Length = 1_000_000 &#8212; Array.at<\/p>\n<\/td>\n<td data-colwidth=\"158\" width=\"158\">\n<p align=\"left\">27,187,821<\/p>\n<\/td>\n<td>\n<p align=\"left\">98<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"352\" width=\"352\">\n<p align=\"left\">Length = 100 &#8212; Array[length &#8212; 1]<\/p>\n<\/td>\n<td data-colwidth=\"158\" width=\"158\">\n<p align=\"left\">848,118,011<\/p>\n<\/td>\n<td>\n<p align=\"left\">98<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"352\" width=\"352\">\n<p align=\"left\">Length = 10_000 &#8212; Array[length &#8212; 1]<\/p>\n<\/td>\n<td data-colwidth=\"158\" width=\"158\">\n<p align=\"left\">847,958,319<\/p>\n<\/td>\n<td>\n<p align=\"left\">100<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"352\" width=\"352\">\n<p align=\"left\">Length = 1_000_000 &#8212; Array[length &#8212; 1]<\/p>\n<\/td>\n<td data-colwidth=\"158\" width=\"158\">\n<p align=\"left\">847,796,498<\/p>\n<\/td>\n<td>\n<p align=\"left\">101<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v18.md#get-the-last-item-of-an-array\"><u>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/u><\/a><\/p>\n<p><a href=\"https:\/\/twitter.com\/_rafaelgss\/status\/1619076762088120321\"><u>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Node.js 19<\/u><\/a>, <a href=\"http:\/\/Array.prototype.at\">Array.prototype.at<\/a> \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u0441\u0442\u0430\u0440\u043e\u043c\u043e\u0434\u043d\u043e\u043c\u0443 Array[length-1], \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0438\u0436\u0435:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"436\" width=\"436\">\n<p>name<\/p>\n<\/th>\n<th>\n<p>ops\/sec<\/p>\n<\/th>\n<th>\n<p>samples<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"436\" width=\"436\">\n<p align=\"left\">Length = 100 &#8212; Array.at<\/p>\n<\/td>\n<td>\n<p align=\"left\">852,980,778<\/p>\n<\/td>\n<td>\n<p align=\"left\">99<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"436\" width=\"436\">\n<p align=\"left\">Length = 10_000 &#8212; Array.at<\/p>\n<\/td>\n<td>\n<p align=\"left\">854,299,272<\/p>\n<\/td>\n<td>\n<p align=\"left\">99<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"436\" width=\"436\">\n<p align=\"left\">Length = 1_000_000 &#8212; Array.at<\/p>\n<\/td>\n<td>\n<p align=\"left\">853,374,694<\/p>\n<\/td>\n<td>\n<p align=\"left\">98<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"436\" width=\"436\">\n<p align=\"left\">Length = 100 &#8212; Array[length &#8212; 1]<\/p>\n<\/td>\n<td>\n<p align=\"left\">854,589,197<\/p>\n<\/td>\n<td>\n<p align=\"left\">95<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"436\" width=\"436\">\n<p align=\"left\">Length = 10_000 &#8212; Array[length &#8212; 1]<\/p>\n<\/td>\n<td>\n<p align=\"left\">856,122,244<\/p>\n<\/td>\n<td>\n<p align=\"left\">95<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"436\" width=\"436\">\n<p align=\"left\">Length = 1_000_000 &#8212; Array[length &#8212; 1]<\/p>\n<\/td>\n<td>\n<p align=\"left\">856,557,974<\/p>\n<\/td>\n<td>\n<p align=\"left\">99<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v20.md#get-the-last-item-of-an-array\"><u>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/u><\/a><\/p>\n<h3>String.prototype.includes<\/h3>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043b\u044e\u0434\u0435\u0439 \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e <em>RegExp <\/em>\u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u0438\u0445 \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442 \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f application\/json. \u0418 \u0445\u043e\u0442\u044f \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0431\u043e:<\/p>\n<ul>\n<li>\n<p><code>\/application\/json\/.test(text)<\/code> \u2014 RegEx<\/p>\n<\/li>\n<\/ul>\n<p>\u0438\u043b\u0438<\/p>\n<ul>\n<li>\n<p><code>text.includes('application\/json')<\/code> \u2014 String.prototype.includes<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u0432\u0430\u0441 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e <code>String.prototype.includes<\/code> \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439, \u043a\u0430\u043a RegExp \u043d\u0430 Node.js 16.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"477\" width=\"477\">\n<p>name<\/p>\n<\/th>\n<th>\n<p>ops\/sec<\/p>\n<\/th>\n<th>\n<p>samples<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"477\" width=\"477\">\n<p align=\"left\">Using includes<\/p>\n<\/td>\n<td>\n<p align=\"left\">16,056,204<\/p>\n<\/td>\n<td>\n<p align=\"left\">97<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"477\" width=\"477\">\n<p align=\"left\">Using indexof<\/p>\n<\/td>\n<td>\n<p align=\"left\">850,710,330<\/p>\n<\/td>\n<td>\n<p align=\"left\">100<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"477\" width=\"477\">\n<p align=\"left\">Using RegExp.test<\/p>\n<\/td>\n<td>\n<p align=\"left\">15,227,370<\/p>\n<\/td>\n<td>\n<p align=\"left\">98<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"477\" width=\"477\">\n<p align=\"left\">Using RegExp.text with cached regex pattern<\/p>\n<\/td>\n<td>\n<p align=\"left\">15,808,350<\/p>\n<\/td>\n<td>\n<p align=\"left\">97<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"477\" width=\"477\">\n<p align=\"left\">Using new RegExp.test<\/p>\n<\/td>\n<td>\n<p align=\"left\">4,945,475<\/p>\n<\/td>\n<td>\n<p align=\"left\">98<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"477\" width=\"477\">\n<p align=\"left\">Using new RegExp.test with cached regex pattern<\/p>\n<\/td>\n<td>\n<p align=\"left\">5,944,679<\/p>\n<\/td>\n<td>\n<p align=\"left\">100<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v16.md#string-searching\"><u>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/u><\/a><\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Node.js 18, \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e <em>\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e<\/em>.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"434\" width=\"434\">\n<p>name<\/p>\n<\/th>\n<th>\n<p>ops\/sec<\/p>\n<\/th>\n<th>\n<p>samples<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"434\" width=\"434\">\n<p align=\"left\">Using includes<\/p>\n<\/td>\n<td>\n<p align=\"left\">856,127,951<\/p>\n<\/td>\n<td>\n<p align=\"left\">101<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"434\" width=\"434\">\n<p align=\"left\">Using indexof<\/p>\n<\/td>\n<td>\n<p align=\"left\">856,709,023<\/p>\n<\/td>\n<td>\n<p align=\"left\">98<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"434\" width=\"434\">\n<p align=\"left\">Using RegExp.test<\/p>\n<\/td>\n<td>\n<p align=\"left\">16,623,756<\/p>\n<\/td>\n<td>\n<p align=\"left\">98<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"434\" width=\"434\">\n<p align=\"left\">Using RegExp.text with cached regex pattern<\/p>\n<\/td>\n<td>\n<p align=\"left\">16,952,701<\/p>\n<\/td>\n<td>\n<p align=\"left\">99<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"434\" width=\"434\">\n<p align=\"left\">Using new RegExp.test<\/p>\n<\/td>\n<td>\n<p align=\"left\">4,704,351<\/p>\n<\/td>\n<td>\n<p align=\"left\">95<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"434\" width=\"434\">\n<p align=\"left\">Using new RegExp.test with cached regex pattern<\/p>\n<\/td>\n<td>\n<p align=\"left\">5,660,755<\/p>\n<\/td>\n<td>\n<p align=\"left\">95<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/blob\/main\/RESULTS-v18.md#string-searching\"><u>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/u><\/a><\/p>\n<h3>Crypto.verify<\/h3>\n<p>\u0412 Node.js \u043c\u043e\u0434\u0443\u043b\u044c crypto \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439, \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432 \u044d\u0442\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>crypto.verify()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>crypto.sign()<\/code>.<\/p>\n<p>Node.js 14 (*\u041e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 OpenSSL 1.x. \u0412 Node.js 16 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/QUIC\"><u>\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b QUIC<\/u><\/a>, \u043d\u043e \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c OpenSSL \u0432\u0435\u0440\u0441\u0438\u0438 1. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 Node.js 18 \u043c\u044b \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0438 OpenSSL \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 3.x (\u043f\u043e\u0432\u0435\u0440\u0445 QUIC), \u0438 \u043f\u043e\u0441\u043b\u0435 Node.js 18 <a href=\"https:\/\/github.com\/nodejs\/performance\/issues\/72\"><u>\u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043d\u0438\u0437\u0438\u043b\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441 30 \u0442\u044b\u0441. \u043e\u043f\/\u0441 \u0434\u043e 6~7 \u0442\u044b\u0441. \u043e\u043f\/\u0441. <a href=\"https:\/\/twitter.com\/_rafaelgss\/status\/1646498181675458560\"><u>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432 \u0442\u0432\u0438\u0442\u0435<\/u><\/a>, \u0432\u0435\u0441\u044c\u043c\u0430 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 OpenSSL. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u043d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0437\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0438 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0432\u043e\u0434\u0443, \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u0435\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c: <a href=\"https:\/\/github.com\/nodejs\/performance\/issues\/72\"><u>https:\/\/github.com\/nodejs\/performance\/issues\/72<\/u><\/a>.<\/p>\n<h3>\u0418\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u044b \u043f\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Node.js<\/h3>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 Node.js \u0432\u0441\u0435\u0433\u0434\u0430 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u043b\u0430 \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0435\u0435 API \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u044b\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<p>\u0421 \u0446\u0435\u043b\u044c\u044e \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Node.js \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435\u0434\u0430\u0432\u043d\u043e <a href=\"https:\/\/github.com\/nodejs\/node\/blob\/HEAD\/doc\/contributing\/strategic-initiatives.md\"><u>\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u0443 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c &#171;Performance&#187; (&#171;\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c&#187;)<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u043e\u0437\u0433\u043b\u0430\u0432\u043b\u044f\u0435\u0442 <a href=\"https:\/\/www.yagiz.co\/\"><u>\u042f\u0433\u0438\u0437 \u041d\u0438\u0437\u0438\u043f\u043b\u0438 (Yagiz Nizipli)<\/u><\/a>. \u041e\u043d\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 Node.js \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b.<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u044b Performance, \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432 Node.js. \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/nodejs\/node\/issues\/35711\"><u>\u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u0430 &#8216;Startup Snapshot&#8217;<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u043e\u0437\u0433\u043b\u0430\u0432\u043b\u044f\u0435\u0442 <a href=\"https:\/\/joyeecheung.github.io\/blog\/\"><u>\u0414\u0436\u043e\u0439\u0438 \u0427\u0443\u043d\u0433 (Joyee Cheung)<\/u><\/a>. \u041e\u043d\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Node.js, \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u044d\u0442\u0430 \u0442\u0435\u043c\u0430, \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043c \u043a\u0430\u0436\u0434\u044b\u0435 \u0434\u0432\u0435 \u043d\u0435\u0434\u0435\u043b\u0438, \u0438 \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u043d\u0430\u043b\u0435 #nodejs-core-performance \u043d\u0430 <a href=\"https:\/\/openjs-foundation.slack.com\/\"><u>OpenJS Foundation Slack<\/u><\/a>.<\/p>\n<h3>\u0422\u043e, \u0437\u0430 \u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c<\/h3>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u043e\u0432 (PR), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043a\u0430\u0436\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c Node.js \u2014 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043f\u0438\u0448\u0443 \u043d\u0438\u0436\u0435\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0441\u0442 (\u043e\u043d \u0435\u0449\u0435 \u043d\u0435 \u0441\u043c\u0435\u0440\u0434\u0436\u0435\u043d):<\/p>\n<ul>\n<li>\n<p>\u041e\u0448\u0438\u0431\u043a\u0438 Node.js \u2014 <a href=\"https:\/\/github.com\/nodejs\/node\/pull\/46648\"><u>https:\/\/github.com\/nodejs\/node\/pull\/46648<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u0432 Node.js \u043e\u0431\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0440\u043e\u0433\u043e. \u042d\u0442\u043e \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 Node.js. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 <a href=\"https:\/\/github.com\/nodejs\/undici\/issues\/1203#issuecomment-1100969210\"><u>\u044f \u043f\u0440\u043e\u0432\u0435\u043b \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 fetch \u0432 Node.js<\/u><\/a> (undici) \u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0437\u043e\u043b \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Node.js WebStreams \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u0440\u043e\u0432\u0435\u0434\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 Node.js, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u043e\u0431\u0449\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0440\u0438\u0441\u043a \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442.<\/p>\n<ul>\n<li>\n<p>\u0421\u0436\u0430\u0442\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u2014 <a href=\"https:\/\/github.com\/nodejs\/build\/issues\/3204\"><u>https:\/\/github.com\/nodejs\/build\/issues\/3204<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0436\u0430\u0442\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u2014 \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043c\u043d\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u0425\u043e\u0442\u044f \u044d\u0442\u043e \u043d\u0435 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u0435\u0435 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0437\u0430 \u0441\u0447\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u043a\u044d\u0448\u0443 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446. \u042d\u0442\u043e, \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, <a href=\"https:\/\/github.com\/nodejs\/TSC\/issues\/790#issuecomment-1427005737\"><u>\u043c\u043e\u0436\u0435\u0442 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u0435<\/u><\/a>.<\/p>\n<ul>\n<li>\n<p>\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 <code>--max-semi-space-size -<\/code> <a href=\"https:\/\/github.com\/nodejs\/node\/pull\/47277\"><u>https:\/\/github.com\/nodejs\/node\/pull\/47277<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/nodejs\/node\/issues\/42511\"><u>\u0412 \u043c\u0430\u0440\u0442\u0435 2022 \u0433\u043e\u0434\u0430 \u0431\u044b\u043b \u043f\u043e\u0434\u043d\u044f\u0442 \u0432\u043e\u043f\u0440\u043e\u0441<\/u><\/a>, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c V8 <code>max_semi_space_size<\/code> \u0441 \u0446\u0435\u043b\u044c\u044e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u043c\u0443\u0441\u043e\u0440\u0430 (\u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, Scavenge) \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0431\u0449\u0443\u044e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0435 \u0432\u0435\u0431-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f. \u041c\u044b \u043f\u043e\u043a\u0430 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u0435, \u0438 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0438\u043b\u0438 \u043d\u0435\u0442 \u0432 Node.js 21.<\/p>\n<ul>\n<li>\n<p>\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>highWaterMark<\/code> \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 Node.js Readable\/Writable &#8212; <a href=\"https:\/\/github.com\/nodejs\/node\/pull\/46608\"><u>https:\/\/github.com\/nodejs\/node\/pull\/46608<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e\u0442 PR \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f <code>highWaterMark<\/code> \u0432 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 Node.js. \u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 Node.js \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0439 PR \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f semver-major \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0432 Node.js 21. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430, \u0436\u0434\u0438\u0442\u0435: &#8216;State of Node.js Performance 2023 \u2014 P2&#8217; \u0432 \u043a\u043e\u043d\u0446\u0435 \u0433\u043e\u0434\u0430.<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438 \u0432 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 Node.js \u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u043c\u043e\u0434\u0443\u043b\u0435, Node.js 20 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0445\u0432\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438. \u0417\u0430\u043c\u0435\u0442\u043d\u044b\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u0430\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 JavaScript, \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 URL, \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u043e\u0432\/\u0442\u0435\u043a\u0441\u0442\u0430, \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\/\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0438 EventTarget, \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0438\u0445.<\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Node.js (<a href=\"https:\/\/github.com\/nodejs\/performance\"><u>nodejs\/performance<\/u><\/a>) \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043b\u0430 \u0441\u0444\u0435\u0440\u0443 \u0441\u0432\u043e\u0435\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044e \u0432\u043a\u043b\u0430\u0434\u0430 \u0432 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439. \u042d\u0442\u0430 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e Node.js \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u043b\u0438\u044f\u0442\u044c \u0438\u043b\u0438 \u043d\u0435\u0442 \u043d\u0430 \u0432\u0430\u0448 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u044e\u0437\u043a\u0435\u0439\u0441. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u0432 <a href=\"https:\/\/github.com\/RafaelGSS\/state-of-nodejs-performance-2023\"><u>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 state-of-nodejs-performance<\/u><\/a> \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0430\u0448\u0438\u043c \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c.<\/p>\n<hr\/>\n<p>\u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0434\u0432\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0443\u0440\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0439\u0434\u0443\u0442 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u0434\u043d\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0443\u0440\u0441\u043e\u0432 OTUS:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 Rest API \u0441 Express:<\/strong> \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u0449\u0438\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f API; \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c REST, \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f API; \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. <a href=\"https:\/\/otus.pw\/FkJ4\/\">\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u043a<\/a><\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u044b HTML: <\/strong>\u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043e\u0441\u043d\u043e\u0432\u044b \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. <a href=\"https:\/\/otus.pw\/YbLB\/\">\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u043a<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/739270\/\"> https:\/\/habr.com\/ru\/articles\/739270\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0430 \u0434\u0432\u043e\u0440\u0435 2023 \u0433\u043e\u0434, \u0438 <a href=\"https:\/\/nodejs.org\/en\/blog\/release\/v20.0.0\"><u>\u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 Node.js v20<\/u><\/a>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435, \u0438 \u0446\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0443\u0447\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Node.js.<\/p>\n<p>\u0412\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0443\u043c\u0430 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0435 \u0448\u0430\u0433\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432.<\/p>\n<p>\u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 &#8212; \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Node.js. \u041e\u043d\u0430 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u0445 \u044d\u0442\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043d\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u044f \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430\u043c\u0438 JavaScript.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 Node.js \u0432\u0435\u0440\u0441\u0438\u0439 16.20.0, 18.16.0 \u0438 20.0.0 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b\u0438 \u0441\u044c\u044e\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u043d\u0430 \u0442\u0440\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b:<\/p>\n<ol>\n<li>\n<p>Node.js Internal Benchmark (\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a)<\/p>\n<\/li>\n<\/ol>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438 \u043e\u0442\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440 \u0441\u044c\u044e\u0442\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 Node.js, \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043e\u0431\u0440\u0430\u0437\u0446\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Node.js, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 16 \u041c\u0411 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e fs.readfile. \u042d\u0442\u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044f\u043c, \u0442\u0430\u043a\u0438\u043c \u043a\u0430\u043a fs \u0438 streams. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u044e\u044c\u0442\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 Node.js, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a <a href=\"https:\/\/github.com\/nodejs\/node\/tree\/main\/benchmark\"><u>\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 Node.js<\/u><\/a>.<\/p>\n<ol start=\"2\">\n<li>\n<p><a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\/\"><u>nodejs-bench-operations<\/u><\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\"><u>nodejs-bench-operations<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Node.js, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0442\u0440\u0438 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043b\u0438\u043d\u0435\u0439\u043a\u0438 \u0432\u0435\u0440\u0441\u0438\u0439. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Node.js v16.20.0 \u0438 v18.16.0, \u0438\u043b\u0438 v19.8.0 \u0438 v19.9.0, \u0441 \u0446\u0435\u043b\u044c\u044e \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0439 \u0432 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435 Node.js. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u044b \u0432 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435 Node.js, \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u044d\u0442\u0438\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u0446\u0435\u043d\u043d\u044b\u043c (\u0438 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u043c\u0443 \u0437\u0432\u0435\u0437\u0434\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c).<\/p>\n<ol start=\"3\">\n<li>\n<p>HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u044b (\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438)<\/p>\n<\/li>\n<\/ol>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b\u0439 HTTP \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430\u043c, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f JSON, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0441\u044b\u043b\u043e\u043a express \u0438 fastify. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c &#8212; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Node.js Internal Benchmark \u0438 <a href=\"https:\/\/github.com\/RafaelGSS\/nodejs-bench-operations\"><u>nodejs-bench-operations<\/u><\/a>, \u043a \u043e\u0431\u044b\u0447\u043d\u044b\u043c HTTP-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c.<\/p>\n<h3>\u041e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0430\u044f \u0441\u0440\u0435\u0434\u0430<\/h3>\n<p>\u0414\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f <a href=\"https:\/\/aws.amazon.com\/ec2\/dedicated-hosts\/\"><u>\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0445\u043e\u0441\u0442 AWS<\/u><\/a> \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c:<\/p>\n<ul>\n<li>\n<p>c6i.xlarge (Ice Lake) 3,5 \u0413\u0413\u0446 &#8212; \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>4 vCPU<\/p>\n<\/li>\n<li>\n<p>8 \u0413\u0411 \u043f\u0430\u043c\u044f\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>Canonical, Ubuntu, 22.04 LTS, amd64 jammy<\/p>\n<\/li>\n<li>\n<p>1 \u0413\u0431 SSD \u0442\u0438\u043f \u0434\u0438\u0441\u043a\u0430<\/p>\n<\/li>\n<\/ul>\n<h3>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a Node.js<\/h3>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0435 \u0431\u044b\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438\/\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0435\u043d:<\/p>\n<ul>\n<li>\n<p>fs \u2014 \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 Node.js<\/p>\n<\/li>\n<li>\n<p>events \u2014 \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 Node.js EventEmitter \/ EventTarget<\/p>\n<\/li>\n<li>\n<p>http \u2014 Node.js HTTP \u0441\u0435\u0440\u0432\u0435\u0440 + \u043f\u0430\u0440\u0441\u0435\u0440<\/p>\n<\/li>\n<li>\n<p>misc \u2014 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Node.js \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c child_processes \u0438 worker_threads + trace_events<\/p>\n<\/li>\n<li>\n<p>module \u2014 Node.js module.require<\/p>\n<\/li>\n<li>\n<p>streams \u2014 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 Node.js \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435<\/p>\n<\/li>\n<li>\n<p>url \u2014 \u043f\u0430\u0440\u0441\u0435\u0440 URL Node.js<\/p>\n<\/li>\n<li>\n<p>buffers \u2014 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438 Node.js<\/p>\n<\/li>\n<li>\n<p>util \u2014 Node.js \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0449\u0438\u043a\/\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0442\u0435\u043a\u0441\u0442\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"https:\/\/github.com\/RafaelGSS\/node\/tree\/state-of-nodejs\"><u>RafaelGSS\/node#state-of-nodejs<\/u><\/a>, \u0430 \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u044b\u043b\u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u044b \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: <a href=\"https:\/\/github.com\/RafaelGSS\/state-of-nodejs-performance-2023\"><u>State of Node.js Performance 2023.<\/u><\/a><\/p>\n<h3>\u041c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 Node.js<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0432\u0430\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u044b\u043b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u043b\u043e\u0433\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/blog.rafaelgss.dev\/preparing-and-evaluating-benchmarks\"><strong><u>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0438 \u043e\u0446\u0435\u043d\u043a\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432<\/u><\/strong><\/a>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Node.js, \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 (30) \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043d\u0430 Node.js 16, 18 \u0438 20. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f:<\/p>\n<ol>\n<li>\n<p><em>\u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 (improvement) <\/em>\u2014 <strong>\u043f\u0440\u043e\u0446\u0435\u043d\u0442 <\/strong>\u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439<\/p>\n<\/li>\n<li>\n<p><em>\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c (confidence)<\/em> \u2014 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043d\u0430\u043c, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b:<\/p>\n<pre><code>                                                                              confidence improvement accuracy (*)   (**)  (***) fs\/readfile.js concurrent=1 len=16777216 encoding='ascii' duration=5                 ***     67.59 %       \u00b13.80% \u00b15.12% \u00b16.79% fs\/readfile.js concurrent=1 len=16777216 encoding='utf-8' duration=5                 ***     11.97 %       \u00b11.09% \u00b11.46% \u00b11.93% fs\/writefile-promises.js concurrent=1 size=1024 encodingType='utf' duration=5                 0.36 %       \u00b10.56% \u00b10.75% \u00b10.97%  Be aware that when doing many comparisons the risk of a false-positive result increases. In this case, there are 10 comparisons, you can thus expect the following amount of false-positive results:   0.50 false positives, when considering a   5% risk acceptance (*, **, ***),   0.10 false positives, when considering a   1% risk acceptance (**, ***),   0.01 false positives, when considering a 0.1% risk acceptance (***)<\/code><\/pre>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0438\u0441\u043a \u0432 0,1%, \u0447\u0442\u043e fs.readfile \u043d\u0435 \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0441\u044f \u0441 Node.js 16 \u0434\u043e Node.js 18 (\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c ***). \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ul>\n<li>\n<p><code>fs\/readfile.js<\/code> \u2014 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0444\u0430\u0439\u043b<\/p>\n<\/li>\n<li>\n<p><code>concurrent=1 len=16777216 encoding='ascii' duration=5<\/code> \u2014 \u043e\u043f\u0446\u0438\u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430. \u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0446\u0438\u0439, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435 <strong>1<\/strong> \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 <strong>16777216<\/strong> \u0431\u0430\u0439\u0442\u0430\u043c\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 <strong>5<\/strong> \u0441\u0435\u043a\u0443\u043d\u0434 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <strong>ASCII<\/strong> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438, \u0441\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Student%27s_t-test#Equal_or_unequal_sample_sizes%2C_unequal_variances_%28sX1_%3E_2sX2_or_sX2_%3E_2sX1%29\"><u>\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439\/\u043d\u0435\u043f\u0430\u0440\u043d\u044b\u0439 2-\u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 t-\u0442\u0435\u0441\u0442<\/u><\/a> \u0441 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u043e\u0439, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430 \u0434\u043b\u044f \u043e\u0431\u0435\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439. \u0415\u0441\u043b\u0438 p-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 0.05, \u0432 \u043f\u043e\u043b\u0435 &#171;\u0414\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c&#187; \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u0430. \u2014 <a href=\"https:\/\/github.com\/nodejs\/node\/blob\/main\/doc\/contributing\/writing-and-running-benchmarks.md#comparing-nodejs-versions\"><u>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432<\/u><\/a><\/p>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430<\/h3>\n<ol>\n<li>\n<p>\u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0444\u043e\u0440\u043a\u0430 Node.js<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0432\u0435\u0442\u043a\u0443 state-of-nodejs<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b Node.js 16, 18 \u0438 20<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0441\u043a\u0440\u0438\u043f\u0442 <a href=\"https:\/\/github.com\/RafaelGSS\/state-of-nodejs-performance-2023\/blob\/main\/nodejs-internal-benchmark\/benchmark.sh\"><u>benchmark.sh<\/u><\/a><\/p>\n<\/li>\n<\/ol>\n<pre><code>#1 git clone git@github.com:RafaelGSS\/node.git #2 cd node &amp;&amp; git checkout state-of-nodejs #3 nvm install v20.0.0 cp $(which node) .\/node20 nvm install v18.16.0 cp $(which node) .\/node18 nvm install v16.20.0 cp $(which node) .\/node16 #4 .\/benchmark.sh<\/code><\/pre>\n<h3>\u0424\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/h3>\n<p>\u041f\u0440\u0438 \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0435 Node.js \u0441 16 \u0434\u043e 18 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 67% \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 API fs.readfile \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u043e\u0439 ascii \u0438 \u043d\u0430 12% \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 utf-8.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u0440\u0438 \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0435 Node.js \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 16 \u0434\u043e 18 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 API fs.readfile \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u043e\u0439 ascii \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u043e\u043a\u043e\u043b\u043e <strong>67%<\/strong>, \u0430 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 utf-8 &#8212; \u043e\u043a\u043e\u043b\u043e <strong>12%<\/strong>. \u0424\u0430\u0439\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430, \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043d\u0438\u043f\u043f\u0435\u0442\u0430:<\/p>\n<pre><code class=\"cpp\">const data = Buffer.alloc(16 * 1024 * 1024, 'x'); fs.writeFileSync(filename, data);<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 fs.readfile \u0441 ascii \u043d\u0430 Node.js 20 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u0430\u0441\u044c \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f \u0432 <strong>27%<\/strong>. \u041e\u0431 \u044d\u0442\u043e\u0439 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438 \u0431\u044b\u043b\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Node.js Performance, \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, fs.opendir, fs.realpath \u0438 fs.readdir \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 Node.js 18 \u0434\u043e Node.js 20. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 Node.js 18 \u0438 20 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430:<\/p>\n<pre><code>                                                                              confidence improvement accuracy (*)   (**)  (***) fs\/bench-opendir.js bufferSize=1024 mode='async' dir='test\/parallel' n=100           ***      3.48 %       \u00b10.22% \u00b10.30% \u00b10.39% fs\/bench-opendir.js bufferSize=32 mode='async' dir='test\/parallel' n=100             ***      7.86 %       \u00b10.29% \u00b10.39% \u00b10.50% fs\/bench-readdir.js withFileTypes='false' dir='test\/parallel' n=10                   ***      8.69 %       \u00b10.22% \u00b10.30% \u00b10.39% fs\/bench-realpath.js pathType='relative' n=10000                                     ***      5.13 %       \u00b10.97% \u00b11.29% \u00b11.69% fs\/readfile.js concurrent=1 len=16777216 encoding='ascii' duration=5                 ***    -27.30 %       \u00b14.27% \u00b15.75% \u00b17.63% fs\/readfile.js concurrent=1 len=16777216 encoding='utf-8' duration=5                 ***      3.25 %       \u00b10.61% \u00b10.81% \u00b11.06%    0.10 false positives, when considering a   5% risk acceptance (*, **, ***),   0.02 false positives, when considering a   1% risk acceptance (**, ***),   0.00 false positives, when considering a 0.1% risk acceptance (***)<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Node.js 16, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u043c\u0435\u0436\u0434\u0443 Node.js 16 \u0438 Node.js 20<\/p>\n<pre><code>                                                                              confidence improvement accuracy (*)    (**)   (***) fs\/bench-opendir.js bufferSize=1024 mode='async' dir='test\/parallel' n=100           ***      2.79 %       \u00b10.26%  \u00b10.35%  \u00b10.46% fs\/bench-opendir.js bufferSize=32 mode='async' dir='test\/parallel' n=100             ***      5.41 %       \u00b10.27%  \u00b10.35%  \u00b10.46% fs\/bench-readdir.js withFileTypes='false' dir='test\/parallel' n=10                   ***      2.19 %       \u00b10.26%  \u00b10.35%  \u00b10.45% fs\/bench-realpath.js pathType='relative' n=10000                                     ***      6.86 %       \u00b10.94%  \u00b11.26%  \u00b11.64% fs\/readfile.js concurrent=1 len=16777216 encoding='ascii' duration=5                 ***     21.96 %       \u00b17.96% \u00b110.63% \u00b113.92% fs\/readfile.js concurrent=1 len=16777216 encoding='utf-8' duration=5                 ***     15.55 %       \u00b11.09%  \u00b11.46%  \u00b11.92%<\/code><\/pre>\n<figure class=\"full-width\"><\/figure>\n<h3>\u0421\u043e\u0431\u044b\u0442\u0438\u044f<\/h3>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>EventTarget<\/code> \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0432 \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0432\u043a\u043b\u044e\u0447\u0430\u043b \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>EventTarget.prototype.dispatchEvent(new Event('foo'))<\/code>.<\/p>\n<p>\u0410\u043f\u0433\u0440\u0435\u0439\u0434 \u0441 Node.js 16 \u0434\u043e Node.js 18 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 <strong>15%<\/strong>. \u041d\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0441\u043a\u0430\u0447\u043e\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0441 Node.js 18 \u043d\u0430 Node.js 20, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043e <strong>200%<\/strong> \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>EventTarget<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c Web API \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0444\u0438\u0447\u0430\u0445, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a <code>AbortSignal<\/code> \u0438 <code>worker_threads<\/code>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u0444\u0438\u0447, \u0432\u043a\u043b\u044e\u0447\u0430\u044f fetch \u0438 <code>AbortController<\/code>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, API <code>EventEmitter.prototype.emit<\/code> \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 <strong>11,5%<\/strong> \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 Node.js 16 \u0441 Node.js 20. \u041f\u043e\u043b\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0438\u0436\u0435 \u0434\u043b\u044f \u0441\u043f\u0440\u0430\u0432\u043a\u0438:<\/p>\n<pre><code>                                                <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-393431","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/393431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=393431"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/393431\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=393431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=393431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=393431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}