{"id":467864,"date":"2025-07-20T21:35:31","date_gmt":"2025-07-20T21:35:31","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=467864"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=467864","title":{"rendered":"<span>\u00ab\u041f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Rust \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439?\u00bb<\/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>\u042f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043c\u0435\u0441\u044f\u0446 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 \u0432 Docker \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0433\u043e\u0442\u043e\u0432 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0443\u0436\u0430\u0441\u043d\u044b\u043c\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<\/p>\n<p>\u041c\u043e\u0439 <a href=\"https:\/\/sharnoff.io\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0435\u0431-\u0441\u0430\u0439\u0442<\/a> (\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u044b\u043b\u0430 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0430 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f) \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c Rust. \u041e\u043d \u0441\u0442\u0430\u043b <em>\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u044b\u043c<\/em>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u044f \u0434\u043e\u043b\u0436\u0435\u043d:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 (\u0441 <code>--target=x86_64-unknown-linux-musl<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0431-\u0441\u0430\u0439\u0442<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043c\u044f\u0433\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 (\u0431\u0443\u0434\u044c \u0442\u043e Docker, Kubernetes \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u043e\u0435), \u0432 \u0434\u0443\u0445\u0435 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u041f\u041e, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u043b\u0435\u0442.<\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 Rust \u0441 Docker \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<h3>\u041e\u0441\u043d\u043e\u0432\u044b: Rust \u0432 Docker<\/h3>\n<h4>Rust \u0432 Docker: \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 Rust \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0443\u044e \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0443:<\/p>\n<pre><code class=\"powershell\">FROM rust:1.87-alpine3.22 AS builder  RUN apk add musl-dev  WORKDIR \/workdir COPY . .  # \"package\" \u0434\u043b\u044f \u043c\u043e\u0435\u0433\u043e \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 - \u044d\u0442\u043e \"web-http-server\". RUN cargo build --package web-http-server --target=x86_64-unknown-linux-musl  # \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b FROM alpine:3.20 COPY --from=builder \/workdir\/target\/x86_64-unknown-linux-musl\/release\/web-http-server \/usr\/bin\/web-http-server  ENTRYPOINT [\"\/usr\/bin\/web-http-server\"]<\/code><\/pre>\n<p><strong>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043b\u044e\u0431\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0441\u0451 \u0441 \u043d\u0443\u043b\u044f<\/strong>.<\/p>\n<p>\u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u0431\u043e\u0440\u043a\u0430 \u0441 \u043d\u0443\u043b\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 4 \u043c\u0438\u043d\u0443\u0442\u044b (\u0432\u043a\u043b\u044e\u0447\u0430\u044f 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043a\u0440\u0435\u0439\u0442\u043e\u0432).<\/p>\n<pre><code class=\"powershell\">$ cargo build --release --target=x86_64-unknown-linux-musl --package web-http-server     Updating crates.io index  Downloading crates ...   Downloaded anstream v0.6.18   Downloaded http-body v1.0.1  ... \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u043a ...     Compiling web-http-server v0.1.0 (\/workdir\/web-http-server)     Finished `release` profile [optimized + debuginfo] target(s) in 3m 51s<\/code><\/pre>\n<p>\u0414\u0430, \u043c\u043e\u0433\u043b\u043e \u0431\u044b\u0442\u044c \u0438 \u0445\u0443\u0436\u0435. \u041d\u043e \u044f-\u0442\u043e \u043f\u0440\u0438\u0432\u044b\u043a \u043a \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0431\u043e\u0440\u043a\u0430\u043c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u042f \u043d\u0435 \u0445\u043e\u0447\u0443 \u0436\u0434\u0430\u0442\u044c \u0442\u0430\u043a \u0434\u043e\u043b\u0433\u043e \u043f\u0440\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0438 \u043c\u0430\u043b\u0435\u0439\u0448\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439!<\/p>\n<h4>Rust \u0432 Docker \u0441 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u043c \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c<\/h4>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u043c\u043e\u0447\u044c!<\/p>\n<p><a href=\"https:\/\/github.com\/LukeMathWalker\/cargo-chef\" rel=\"noopener noreferrer nofollow\"><code>cargo-chef<\/code><\/a>\u00a0\u041b\u0443\u043a\u0438 \u041f\u0430\u043b\u043c\u0438\u0435\u0440\u0438 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0432\u0441\u0435\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0432 \u043a\u044d\u0448\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 Docker, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u0438 \u043a \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b (\u043d\u043e \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439).<\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432 <a href=\"https:\/\/lpalmieri.com\/posts\/fast-rust-docker-builds\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u0442\u0435 \u041b\u0443\u043a\u0438<\/a>, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u0442\u043e <code>cargo-chef<\/code>\u00a0\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u00ab\u0440\u0435\u0446\u0435\u043f\u0442\u0430\u00bb \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u00ab\u0438\u0441\u043f\u0435\u0447\u044c\u00bb, \u0447\u0442\u043e\u0431\u044b \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u0445 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041c\u043e\u0439 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442 \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e <em>\u0434\u043e\u043b\u0436\u043d\u043e<\/em> \u043f\u043e\u043c\u043e\u0447\u044c!<\/p>\n<pre><code class=\"powershell\">...  FROM ... AS planner COPY . . RUN cargo chef prepare --recipe-path=\/workdir\/recipe.json  FROM ... AS cooker # \u041f\u0420\u0418\u041c\u0415\u0427\u0410\u041d\u0418\u0415: \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0442\u043e\u0433\u043e \u0436\u0435 \"\u0440\u0435\u0446\u0435\u043f\u0442\u0430\", # \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u0441\u0431\u043e\u0440\u043a\u0438. COPY --from=planner \/workdir\/recipe.json recipe.json RUN cargo chef cook --release --recipe-path=\/workdir\/recipe.json \\     --target=x86_64-unknown-linux-musl  # \u0415\u0441\u043b\u0438 recipe.json \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f, \u0442\u043e 'cooker' \u0431\u0443\u0434\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d. # \u041e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. FROM cooker AS builder COPY . . RUN cargo build --release --package web-http-server \\     --target=x86_64-unknown-linux-musl<\/code><\/pre>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0440\u043e\u0441\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435 \u0442\u0430\u043a\u0438\u043c, \u043a\u0430\u043a \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u043b\u0438 \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"powershell\">$ # \u041f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 $ cargo chef cook --release ...     Updating crates.io index  Downloading crates ...  ...    Compiling web-http-server v0.0.1 (\/workdir\/web-http-server)     Finished `release` profile [optimized + debuginfo] target(s) in 1m 07s  $ # \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 $ cargo build --release ...    Compiling web-http-server v0.1.0 (\/workdir\/web-http-server)     Finished `release` profile [optimized + debuginfo] target(s) in 2m 50s<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e 25% \u0432\u0440\u0435\u043c\u0435\u043d\u0438! \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u043c\u043e\u0439 \u043a\u043e\u0434 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e. \u041e\u043d \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0438\u0437 \u0441\u0435\u043c\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u043a\u043b\u0435\u044f, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>axum<\/code>,\u00a0<code>reqwest<\/code> \u0438\u00a0<code>tokio-postgres<\/code>).<\/p>\n<p><em>(\u0427\u0442\u043e\u0431\u044b \u0435\u0449\u0451 \u0440\u0430\u0437 \u0432\u0441\u0451 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c <\/em><code><em>cargo build<\/em><\/code><em>\u00a0\u0441 <\/em><code><em>--verbose<\/em><\/code><em>. \u041f\u043e\u0447\u0442\u0438 3 \u043c\u0438\u043d\u0443\u0442\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <\/em><code><em>rustc<\/em><\/code><em>!)<\/em><\/p>\n<h3>\u0427\u0442\u043e rustc\u00a0\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f?<\/h3>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438\u0437 <a href=\"https:\/\/fasterthanli.me\/articles\/why-is-my-rust-build-so-slow\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 fasterthanlime<\/a>, \u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <code>cargo --timings<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"powershell\">$ cargo build --release --timings ...    Compiling web-http-server v0.1.0 (\/workdir\/web-http-server)       Timing report saved to \/workdir\/target\/cargo-timings\/cargo-timing-20250607T192029.207407545Z.html     Finished `release` profile [optimized + debuginfo] target(s) in 2m 54s<\/code><\/pre>\n<p>\u041d\u0430\u0440\u044f\u0434\u0443 \u0441 \u0444\u0430\u0439\u043b\u043e\u043c <code>cargo-timing-&lt;timestamp&gt;.html<\/code>\u00a0\u0435\u0441\u0442\u044c \u0438 \u0444\u0430\u0439\u043b <code>cargo-timing.html<\/code>. \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e:<\/p>\n<pre><code class=\"powershell\">...  FROM cooker AS builder COPY . . RUN cargo build --timings --release --target=x86_64-unknown-linux-musl --package web-http-server # \u041d\u041e\u0412\u041e\u0415: \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438 cargo \u0432 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 RUN mv target\/cargo-timings\/cargo-timing-*.html cargo-timing.html  FROM alpine:3.22 COPY --from=builder \/workdir\/target\/x86_64-unknown-linux-musl\/release\/web-http-server \/usr\/bin\/web-http-server # \u041d\u041e\u0412\u041e\u0415: \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 COPY --from=builder \/workdir\/cargo-timing.html cargo-timing.html<\/code><\/pre>\n<p>\u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u043e\u0437\u0438\u0432\u0448\u0438\u0441\u044c \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c&#8230;<\/p>\n<pre><code class=\"powershell\">id=\"$(docker container create &lt;IMAGE&gt;)\" docker cp \"$id:\/cargo-timing.html\" cargo-timing.html docker container rm -f \"$id\"<\/code><\/pre>\n<p>&#8230; \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0436\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/564\/826\/ad6\/564826ad6615edc261f34861115d9185.png\" alt=\"Screenshot of the cargo build timings page, showing only web-http-server being compiled and taking 174 seconds\" title=\"\" width=\"964\" height=\"1439\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/564\/826\/ad6\/564826ad6615edc261f34861115d9185.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/564\/826\/ad6\/564826ad6615edc261f34861115d9185.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><em>\u041e\u0439.<\/em>\u00a0\u041d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438!<\/p>\n<h4>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442?<\/h4>\n<p><code>cargo build --timings<\/code>\u00a0\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, <em>\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0440\u0435\u0439\u0442\u0430<\/em>. \u041d\u043e \u043d\u0430\u0441 \u0432\u043e\u043b\u043d\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0440\u0435\u0439\u0442\u0430!<\/p>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0435 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0431\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b, \u0438\u043b\u0438\u00a0\u043d\u0430\u043c\u00a0\u0431\u044b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0438\u0441\u043a\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 <code>cargo build<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438 <code>cargo<\/code> \u043f\u043e\u0437\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442 \u043d\u0430\u043c \u0442\u043e\u0447\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c: \u0432 \u043e\u0442\u0447\u0451\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 174,1 \u0441, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 2 \u043c\u0438\u043d\u0443\u0442\u0430\u043c 54 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 <code>cargo build<\/code>.<\/p>\n<h3>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043f\u0440\u043e\u0441\u0438\u043c \u0441\u0430\u043c rustc<\/h3>\n<p>\u0412 \u043f\u043e\u0441\u0442\u0435 fasterthanlime \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u043e\u0432\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u2014\u00a0\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u0438\u0447\u0438 \u0441\u0430\u043c\u043e\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <code>rustc<\/code> \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u043b\u0430\u0433\u0430 <code>-Zself-profile<\/code>.<\/p>\n<p>\u0412 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"powershell\">RUSTC_BOOTSTRAP=1 cargo rustc --release -- -Z self-profile<\/code><\/pre>\n<p><em>(\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0437\u0434\u0435\u0441\u044c <\/em><code><em>cargo rustc<\/em><\/code><em>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 <\/em><code><em>rustc<\/em><\/code><em> \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 \u0441 <\/em><code><em>RUSTC_BOOTSTRAP=1<\/em><\/code><em>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438 <\/em><code><em>-Z<\/em><\/code><em>\u00a0\u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430.)<\/em><\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0437\u0434\u0435\u0441\u044c \u044d\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u2014 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 <code>cargo chef cook<\/code>, \u0430 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 <code>rustc<\/code>\u00a0\u0447\u0435\u0440\u0435\u0437 <code>cargo-chef<\/code> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u0441\u0451 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>RUSTFLAGS<\/code>:<\/p>\n<pre><code class=\"powershell\"># cargo chef: RUSTC_BOOTSTRAP=1 RUSTFLAGS='-Zself-profile' cargo chef cook --release ...  # \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430: RUSTC_BOOTSTRAP=1 RUSTFLAGS='-Zself-profile' cargo build --release ...<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0444\u0430\u0439\u043b\u044b \u0432\u0438\u0434\u0430 <code>web_http_server-&lt;random-number&gt;.mm_profdata<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0430 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u043b\u044f <code>cargo-timing.html<\/code>.<\/p>\n<p><em>(\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043c\u044b \u0443\u0434\u0430\u043b\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 <\/em><code><em>cargo chef cook<\/em><\/code><em>. \u042f \u043d\u0435 \u0441\u0442\u0430\u043b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438).<\/em><\/p>\n<h4>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c profdata<\/h4>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Rust \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u0430\u043c\u043e\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <code>rustc<\/code>; \u044d\u0442\u043e\u0442 \u043d\u0430\u0431\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"https:\/\/github.com\/rust-lang\/measureme\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/rust-lang\/measureme<\/a>.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><code>summary<\/code>\u00a0\u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0441 \u043a\u0440\u0430\u0442\u043a\u043e\u0439 \u0441\u0432\u043e\u0434\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><code>flamegraph<\/code>\u00a0\u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 SVG \u0441 <a href=\"https:\/\/www.brendangregg.com\/flamegraphs.html\" rel=\"noopener noreferrer nofollow\">flame-\u0433\u0440\u0430\u0444\u0438\u043a\u043e\u043c<\/a><\/p>\n<\/li>\n<li>\n<p><code>crox<\/code>\u00a0\u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0432 <a href=\"https:\/\/docs.google.com\/document\/d\/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU\/preview?tab=t.0#heading=h.yr4qxyxotyw\" rel=\"noopener noreferrer nofollow\">\u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Chrome<\/a>, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0443\u044e \u0441 <code>chrome:\/\/tracing<\/code>\u00a0(\u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Chromium)<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u0430\u0440\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c:<\/p>\n<pre><code class=\"powershell\">cargo install --git https:\/\/github.com\/rust-lang\/measureme flamegraph summarize<\/code><\/pre>\n<p>\u041b\u0438\u0447\u043d\u043e \u044f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c Firefox, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043a\u0430\u0441\u0430\u0442\u044c\u0441\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Chrome.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c <code>summarize<\/code>\u00a0(\u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>summarize<\/code>\u00a0\u0438 <code>diff<\/code>):<\/p>\n<pre><code class=\"powershell\">$ summarize summarize web_http_server.mm_profdata | wc -l 945 $ summarize summarize web_http_server.mm_profdata | head +-------------------------------+-----------+-----------------+----------+------------+ | Item                          | Self time | % of total time | Time     | Item count | +-------------------------------+-----------+-----------------+----------+------------+ | LLVM_lto_optimize             | 851.95s   | 33.389          | 851.95s  | 1137       | +-------------------------------+-----------+-----------------+----------+------------+ | LLVM_module_codegen_emit_obj  | 674.94s   | 26.452          | 674.94s  | 1137       | +-------------------------------+-----------+-----------------+----------+------------+ | LLVM_thin_lto_import          | 317.75s   | 12.453          | 317.75s  | 1137       | +-------------------------------+-----------+-----------------+----------+------------+ | LLVM_module_optimize          | 189.00s   | 7.407           | 189.00s  | 17         |  thread 'main' panicked at library\/std\/src\/io\/stdio.rs:1165:9: failed printing to stdout: Broken pipe (os error 32) note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace<\/code><\/pre>\n<p><em>(\u041e\u0439! \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 CLI.\u00a0<\/em><a href=\"https:\/\/github.com\/rust-lang\/measureme\/pull\/243\" rel=\"noopener noreferrer nofollow\"><em>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0448\u0438\u0442\u044c<\/em><\/a><em>.)<\/em><\/p>\n<p>\u041d\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0432\u0430 \u0441\u0430\u043c\u044b\u0445 \u0432\u0430\u0436\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u0430 \u2014 \u044d\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438 (<a href=\"https:\/\/www.llvm.org\/docs\/LinkTimeOptimization.html\" rel=\"noopener noreferrer nofollow\">link-time optimization<\/a>, LTO) \u0438 <code>LLVM_module_codegen_emit_obj<\/code>, \u0447\u0442\u043e \u0431\u044b \u044d\u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u043c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e flame-\u0433\u0440\u0430\u0444\u0438\u043a\u0430:<\/p>\n<pre><code class=\"powershell\">$ flamegraph web_http_server.mm_profdata $ # ... \u0432\u044b\u0432\u043e\u0434\u0430 \u043d\u0435\u0442. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u043e\u0441\u044c ... $ find . -cmin 1 -type f # \u0438\u0449\u0435\u043c \u0444\u0430\u0439\u043b\u044b, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0438\u043d\u0443\u0442\u044b \u043d\u0430\u0437\u0430\u0434 .\/rustc.svg<\/code><\/pre>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c SVG!<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d2e\/40e\/d67\/d2e40ed67b34eeeb24fbe60aaa4d623f.png\" alt=\"Flamegraph of rustc execution, with codegen_module_perform_lto highlighted as taking 78.9% of the total time\" title=\"\" width=\"1250\" height=\"270\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d2e\/40e\/d67\/d2e40ed67b34eeeb24fbe60aaa4d623f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d2e\/40e\/d67\/d2e40ed67b34eeeb24fbe60aaa4d623f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><em>(\u041e\u043d <\/em><a href=\"https:\/\/sharnoff.io\/blog\/why-rust-compiler-slow\/assets\/rustc-2025-06-07T21:24:16Z.svg\" rel=\"noopener noreferrer nofollow\"><em>\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439<\/em><\/a><em>! \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e \u0438 \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.)<\/em><\/p>\n<p>\u041f\u043e\u0445\u043e\u0436\u0435, \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438 LTO \u0441\u043c\u0435\u0448\u0430\u043b\u0438\u0441\u044c: <code>codegen_module_perform_lto<\/code> \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438 \u043a <code>LLVM_lto_optimize<\/code>\/<code>LLVM_thin_lto_import<\/code>, \u0438 \u043a <code>LLVM_module_codegen<\/code>.<\/p>\n<p>\u041d\u043e, \u043a\u0430\u043a \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 LTO: <code>codegen_module_perform_lto<\/code> \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u043a\u043e\u043b\u043e 80% \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<h3>\u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e\u0431 LTO<\/h3>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Rust \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u043a\u0440\u0435\u0439\u0442\u044b \u043d\u0430 <a href=\"https:\/\/doc.rust-lang.org\/rustc\/codegen-options\/index.html#codegen-units\" rel=\"noopener noreferrer nofollow\">\u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438<\/a>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u043a\u0430\u0436\u0434\u044b\u0439 LLVM \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.\u00a0<em>\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435<\/em> \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u043d\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u044e\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435.<\/p>\n<p>LTO \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u0432\u043d\u043e\u0441\u0438\u043c\u044b\u0445 LLVM \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>Cargo (\u0447\u0435\u0440\u0435\u0437 <code>rustc<\/code>) \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/doc.rust-lang.org\/rustc\/codegen-options\/index.html#lto\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0446\u0438\u0439 LTO<\/a>:<\/p>\n<ul>\n<li>\n<p>Off \u2014 \u0432\u0441\u0435 LTO \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b<\/p>\n<\/li>\n<li>\n<p>\u00ab\u0422\u043e\u043d\u043a\u0438\u0435\u00bb LTO \u2014 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0445\u043e\u0436 \u0441 \u043e\u043f\u0446\u0438\u0435\u0439 \u00ab\u0442\u043e\u043b\u0441\u0442\u044b\u0445\u00bb LTO, \u043d\u043e \u044d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u043c\u0435\u043d\u0435\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u0430 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u00ab\u0422\u043e\u043b\u0441\u0442\u044b\u0435\u00bb LTO \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0451\u043c LTO \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u043a\u0440\u0435\u0439\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e<\/p>\n<\/li>\n<\/ul>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u043e\u043f\u0446\u0438\u044f LTO \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430, \u0442\u043e <code>rustc<\/code>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u00ab\u0442\u043e\u043d\u043a\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 LTO\u00bb, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u00ab\u0442\u043e\u043d\u043a\u0438\u0435\u00bb LTO \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0438\u043c \u043a\u0440\u0435\u0439\u0442\u043e\u043c \u0437\u0430 \u0440\u0430\u0437.<\/p>\n<h4>\u041a\u0430\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f<\/h4>\n<p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u0443\u043a\u0430\u0437\u0430\u043b \u0432 <code>Cargo.toml<\/code> \u043e\u043f\u0446\u0438\u044e <code>lto = \"thin\"<\/code>:<\/p>\n<pre><code class=\"powershell\">[profile.release] lto = \"thin\" debug = \"full\"<\/code><\/pre>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, <a href=\"https:\/\/doc.rust-lang.org\/cargo\/reference\/profiles.html#debug\" rel=\"noopener noreferrer nofollow\"><code>debug = \"full\"<\/code><\/a>\u00a0\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u044f <code>release<\/code>). \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u0441\u044f \u0438 \u043a \u044d\u0442\u043e\u043c\u0443 \u0442\u043e\u0436\u0435.<\/p>\n<h4>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 (\u043e\u0431\u044b\u0447\u043d\u044b\u0445) \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a<\/h4>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a <code>lto<\/code>\u00a0\u0438 <code>debug<\/code>\u00a0(\u0441\u043d\u043e\u0432\u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, <code>cargo build --timings<\/code> \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0445 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u043e\u0432).<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0412\u0440\u0435\u043c\u044f \/ \u0440\u0430\u0437\u043c\u0435\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\"><code>debug=none<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\"><code>debug=line-tables-only<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\"><code>debug=limited<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\"><code>debug=full<\/code><\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 LTO<\/p>\n<\/td>\n<td>\n<p align=\"left\">50.0s \/ 21.0Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">54.4s \/ 85.9Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">54.8s \/ 105.9Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">67.6s \/ 214.3Mi<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0422\u043e\u043d\u043a\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 LTO<\/p>\n<\/td>\n<td>\n<p align=\"left\">67.5s \/ 20.1Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">71.5s \/ 95.4Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">73.6s \/ 117.0Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">88.2s \/ 256.8Mi<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0422\u043e\u043d\u043a\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">133.7s \/ 20.3Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">141.7s \/ 80.6Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">140.7s \/ 96.0Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">172.2s \/ 197.5Mi<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0422\u043e\u043b\u0441\u0442\u044b\u0435 LTO<\/p>\n<\/td>\n<td>\n<p align=\"left\">189.1s \/ 15.9Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">211.1s \/ 64.4Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">212.5s \/ 75.8Mi<\/p>\n<\/td>\n<td>\n<p align=\"left\">287.1s \/ 155.9Mi<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0432 \u043e\u0431\u0449\u0435\u043c: \u043f\u043e\u0445\u043e\u0436\u0435, \u043d\u0430\u0438\u0445\u0443\u0434\u0448\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 30-50% \u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0438 \u0442\u043e\u043b\u0441\u0442\u044b\u0435 LTO, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 <strong>\u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/strong>, \u0447\u0435\u043c \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 LTO.<\/p>\n<p>\u042d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u2014 \u0434\u0430, \u0442\u043e\u043b\u0441\u0442\u044b\u0435 LTO \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u043e\u043b\u044c\u0448\u0435. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0442\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u0430 50 \u0441\u0435\u043a\u0443\u043d\u0434!<\/p>\n<h3>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, 50 \u0441\u0435\u043a\u0443\u043d\u0434 \u2014 \u044d\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e!<\/h3>\n<p>50 \u0441\u0435\u043a\u0443\u043d\u0434 \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u043a\u0430\u0447\u043e\u043a \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c LTO \u0438 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b&#8230; \u0430 \u0432\u0435\u0434\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0443 \u043c\u043e\u0435\u0433\u043e \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 \u043f\u043e\u0447\u0442\u0438 \u043d\u0443\u043b\u0435\u0432\u0430\u044f.\u00a0<em>\u041c\u0435\u043d\u044f \u044d\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0443\u0441\u0442\u0440\u043e\u0438\u0442.<\/em><\/p>\n<p><strong>\u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u0447\u0438\u043d \u043a\u043e\u0432\u044b\u0440\u044f\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435.<\/strong><\/p>\n<p>\u041d\u043e \u0440\u0430\u0437\u0432\u0435 \u043d\u0435 \u0432\u0435\u0441\u0435\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0433\u043b\u0443\u0431\u0436\u0435? \u041c\u044b \u0432\u0435\u0434\u044c \u0432\u0441\u0451 \u0435\u0449\u0451 \u043c\u043e\u0436\u0435\u043c \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e?<\/p>\n<h3>\u0415\u0449\u0451 \u043e\u0434\u043d\u043e \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0440\u0430\u0437\u0432\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u043d\u0443\u044e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e?<\/h3>\n<p>\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043d\u043e \u0434\u0430, \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e; \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0421\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u044d\u0448\u0430 \u0441\u0431\u043e\u0440\u043e\u043a \u2014 \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u0443\u0436 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u043d\u043e \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0443 <code>\/target<\/code>\u00a0\u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/docs.docker.com\/build\/cache\/optimize\/#use-cache-mounts\" rel=\"noopener noreferrer nofollow\">cache mount<\/a>\u00a0\u0432 dockerfile \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u043f\u0430\u043f\u043a\u0443 \u043c\u0435\u0436\u0434\u0443 \u0441\u0431\u043e\u0440\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u044f \u0446\u0435\u043d\u044e \u0442\u043e, \u0447\u0442\u043e <code>docker build<\/code>\u00a0<em>\u043c\u043e\u0436\u0435\u0442 <\/em>\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0447\u0438\u0441\u0442\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0438 \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f docker, \u0432\u0435\u0434\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <code>cargo-chef<\/code>.<\/p>\n<h3>\u041a\u043e\u043f\u0430\u0435\u043c \u0433\u043b\u0443\u0431\u0436\u0435: \u0438 \u0442\u044b \u0442\u043e\u0436\u0435,\u00a0LLVM_module_optimize?<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043c LTO \u0438 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0442\u043e \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 50 \u0441\u0435\u043a\u0443\u043d\u0434, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442&#8230; \u0447\u0442\u043e-\u0442\u043e.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043d\u043e\u0432\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0430\u043c\u043e\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e <a href=\"https:\/\/sharnoff.io\/blog\/why-rust-compiler-slow\/assets\/rustc-2025-06-09T21:56:36Z.svg?s=LLVM_module_optimize\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442<\/a>.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2a3\/851\/6d6\/2a38516d625010cb18e25eb64e179048.png\" alt=\"Flamegraph of rustc, with LLVM_module_optimize highlighted as taking 68.7% of total time\" title=\"\" width=\"1248\" height=\"421\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2a3\/851\/6d6\/2a38516d625010cb18e25eb64e179048.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2a3\/851\/6d6\/2a38516d625010cb18e25eb64e179048.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 70% \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u0438\u043d <code>LLVM_module_optimize<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0442\u043e, \u0433\u0434\u0435 LLVM \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434. \u041f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 LLVM, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043d\u0435\u0442 \u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432.<\/p>\n<h4>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/h4>\n<p>\u041f\u0440\u043e\u0444\u0438\u043b\u044c <code>release<\/code>\u00a0\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>opt-level = 3<\/code>; \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0430 \u043d\u0435\u0451 \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u0435-\u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0448\u0435 \u2014 \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0448\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438 \u043d\u0430\u0441 \u0432\u043e\u043b\u043d\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0435:<\/p>\n<pre><code class=\"powershell\">[profile.release] lto = \"off\" debug = \"none\" opt-level = 0 # \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435  # ... \u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 # \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043c. \u0437\u0434\u0435\u0441\u044c: # https:\/\/doc.rust-lang.org\/cargo\/reference\/profiles.html#overrides [profile.release.package.\"*\"] opt-level = 3<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043e\u043f\u0446\u0438\u0439, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/doc.rust-lang.org\/cargo\/reference\/profiles.html#opt-level\" rel=\"noopener noreferrer nofollow\"><code>opt-level<\/code><\/a>:<\/p>\n<ul>\n<li>\n<p><code>0<\/code>\u00a0\u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><code>1<\/code>,\u00a0<code>2<\/code> \u0438 <code>3<\/code>\u00a0\u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439<\/p>\n<\/li>\n<li>\n<p><code>\"s\"<\/code>\u00a0\u0438 <code>\"z\"<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043d\u043e\u0432\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">Final \/ Deps<\/p>\n<\/th>\n<th>\n<p align=\"left\">deps:\u00a0<code>opt-level=3<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\">deps:\u00a0<code>opt-level=\"s\"<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\">deps:\u00a0<code>opt-level=\"z\"<\/code><\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">final:\u00a0<code>opt-level=0<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">14.7 \u0441 \/ 26.0 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">15.0 \u0441 \/ 25.9 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">15.7 \u0441 \/ 26.3 \u041c\u0438\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">final:\u00a0<code>opt-level=1<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">48.8 \u0441 \/ 21.5 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">47.6 \u0441 \/ 20.1 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">47.8 \u0441 \/ 20.6 \u041c\u0438\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">final:\u00a0<code>opt-level=2<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">50.8 \u0441 \/ 20.9 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">55.2 \u0441 \/ 20.2 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">55.4 \u0441 \/ 20.7 \u041c\u0438\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">final:\u00a0<code>opt-level=3<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">51.0 \u0441 \/ 21.0 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">55.4 \u0441 \/ 20.3 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">55.2 \u0441 \/ 20.8 \u041c\u0438\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">final:\u00a0<code>opt-level=\"s\"<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">46.0 \u0441 \/ 20.1 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">45.7 \u0441 \/ 18.9 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">46.0 \u0441 \/ 19.3 \u041c\u0438\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">final:\u00a0<code>opt-level=\"z\"<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">42.7 \u0441 \/ 20.1 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">41.8 \u0441 \/ 18.8 \u041c\u0438\u0411<\/p>\n<\/td>\n<td>\n<p align=\"left\">41.8 \u0441 \/ 19.3 \u041c\u0438\u0411<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u2014 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 50 \u0441\u0435\u043a\u0443\u043d\u0434;<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0439: \u0432\u0441\u0435\u0433\u043e \u043e\u043a\u043e\u043b\u043e 15 \u0441.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0427\u0442\u043e \u0437\u0430 \u0434\u0435\u043b\u0430 \u0441 LLVM?<\/h3>\n<p>Rust \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u0438 \u0445\u043e\u0442\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0445 \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0431\u044b\u043b\u043e \u0431\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b <em>\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435<\/em> \u0438\u0437 \u043d\u0438\u0445!<\/p>\n<p><strong>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u043d\u0430 \u0447\u0442\u043e \u0443\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/strong>\u00a0\u041e\u0434\u043d\u0430\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0430\u043c\u043e\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <code>rustc<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 LLVM.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0435\u0449\u0451 <a href=\"https:\/\/github.com\/rust-lang\/rust\/blob\/d13a431a6cc69cd65efe7c3eb7808251d6fd7a46\/src\/doc\/rustc-dev-guide\/src\/backend\/debugging.md?plain=1#L209-L212\" rel=\"noopener noreferrer nofollow\">\u043f\u0430\u0440\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 <code>rustc<\/code><\/a>:<\/p>\n<ul>\n<li>\n<p><code>-Z time-llvm-passes<\/code>\u00a0\u2014 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 LLVM \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435<\/p>\n<\/li>\n<li>\n<p><code>-Z llvm-time-trace<\/code>\u00a0\u2014 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 LLVM \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Chrome<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 LLVM \u0441 rustc\u00a0\u2014 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0432\u0438\u0434<\/h4>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u043f\u043e\u043a\u0430 \u043e\u0442\u043b\u043e\u0436\u0438\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Chrome \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<pre><code class=\"powershell\"># cargo chef: RUSTC_BOOTSTRAP=1 RUSTFLAGS='-Ztime-llvm-passes' cargo chef cook --release ...  # \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430: RUSTC_BOOTSTRAP=1 RUSTFLAGS='-Ztime-llvm-passes' cargo build --release ...<\/code><\/pre>\n<p>&#8230; \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0435\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <code>docker build<\/code>, \u0442\u043e \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435:<\/p>\n<pre><code class=\"powershell\">[output clipped, log limit 2MiB reached]<\/code><\/pre>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 <a href=\"https:\/\/docs.docker.com\/build\/buildkit\/\" rel=\"noopener noreferrer nofollow\">BuildKit<\/a>\u00a0(\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0432\u0435\u0436\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Docker \u0432 Linux) \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u043e\u0436\u043d\u043e \u0432\u0435\u0434\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042d\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>BUILDKIT_STEP_LOG_MAX_SIZE<\/code>\u0438 <code>BUILDKIT_STEP_LOG_MAX_SPEED<\/code>. \u041d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0438\u0445 <code>docker build<\/code>\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"powershell\">BUILDKIT_STEP_LOG_MAX_SIZE=-1 BUILDKIT_STEP_LOG_MAX_SPEED=-1 docker build ...<\/code><\/pre>\n<p>&#8230; \u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0430 \u0432 <em>\u0434\u0435\u043c\u043e\u043d\u0435<\/em> docker.<\/p>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043e\u0432 Linux <code>dockerd<\/code>\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u044e\u043d\u0438\u0442 <code>systemd<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u0417\u043d\u0430\u0447\u0438\u0442, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0435\u0451 \u0432 \u044e\u043d\u0438\u0442\u0435 systemd?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u2122 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e:<\/p>\n<pre><code class=\"powershell\">$ systemctl edit --drop-in=buildkit-env.conf docker.service<\/code><\/pre>\n<p><em>(\u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f <\/em><code><em>--drop-in<\/em><\/code><em>\u00a0, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u0443 \u0431\u043e\u043b\u0435\u0435 \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043d\u0435\u0436\u0435\u043b\u0438 <\/em><code><em>override.conf<\/em><\/code><em>)<\/em><\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"powershell\">[Service] Environment=\"BUILDKIT_STEP_LOG_MAX_SIZE=-1\" Environment=\"BUILDKIT_STEP_LOG_MAX_SPEED=-1\"<\/code><\/pre>\n<p>\u0410 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"powershell\">$ systemctl restart docker.service<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u0440\u0430\u0431\u043e\u0442\u0443&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"powershell\">$ pgrep dockerd 1234567 $ cat \/proc\/1234567\/environ | tr '\\0' '\\n' | grep -i 'buildkit' BUILDKIT_STEP_LOG_MAX_SIZE=-1 BUILDKIT_STEP_LOG_MAX_SPEED=-1<\/code><\/pre>\n<p><em>(\u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:\u00a0<\/em><code><em>tr<\/em><\/code><em>\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f nul \u0441\u0442\u0440\u043e\u043a\u0430, \u0430 \u043f\u043e\u0438\u0441\u043a \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e)<\/em><\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0432 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 <code>docker build<\/code>\u00a0\u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u043a\u043e\u043b\u043e <strong>200 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u0430<\/strong>; \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u0432\u0430\u043c \u043d\u0435 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432\u0441\u0435 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u043c \u0438\u0445 \u0432 \u0444\u0430\u0439\u043b \u0432\u043d\u0443\u0442\u0440\u0438 docker \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438\u0445, \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u043e\u0442\u0447\u0451\u0442\u044b \u043e\u0442 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0430\u0445 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"powershell\">===-------------------------------------------------------------------------===                           Pass execution timing report ===-------------------------------------------------------------------------===   Total Execution Time: 0.0428 seconds (0.0433 wall clock)     ---User Time---   --System Time--   --User+System--   ---Wall Time---  \u2014 Name ---    0.0072 ( 19.2%)   0.0015 ( 27.4%)   0.0086 ( 20.2%)   0.0087 ( 20.0%)  InstCombinePass    0.0040 ( 10.8%)   0.0006 ( 10.8%)   0.0046 ( 10.8%)   0.0047 ( 10.8%)  InlinerPass    0.0024 (  6.4%)   0.0010 ( 18.0%)   0.0034 (  7.9%)   0.0034 (  7.8%)  SimplifyCFGPass    0.0022 (  5.9%)   0.0002 (  4.5%)   0.0025 (  5.7%)   0.0024 (  5.6%)  EarlyCSEPass    0.0021 (  5.5%)   0.0001 (  1.5%)   0.0021 (  5.0%)   0.0022 (  5.0%)  GVNPass    0.0015 (  4.0%)   0.0001 (  2.2%)   0.0016 (  3.8%)   0.0018 (  4.2%)  ArgumentPromotionPass     ... \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0438, \u043d\u0438\u0436\u0435 \u0438\u0434\u0451\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432, \u0441\u043e\u0442\u043d\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a ... <\/code><\/pre>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0438\u0445 <em>\u043c\u043e\u0436\u043d\u043e<\/em> \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0438 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c! \u041d\u043e \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0441 \u0447\u0435\u043c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0430 \u043d\u0430 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u043b\u0438\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043a-\u0442\u043e \u0438\u043d\u0430\u0447\u0435.<\/p>\n<h4>\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 LLVM \u0441 rustc\u00a0\u2014 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430<\/h4>\n<p>\u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438 <code>-Z llvm-time-trace<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Chrome.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043d\u0435\u043c\u0443:<\/p>\n<pre><code class=\"powershell\"># cargo chef: RUSTC_BOOTSTRAP=1 RUSTFLAGS='-Zllvm-time-trace' cargo chef cook --release ...  # \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430: RUSTC_BOOTSTRAP=1 RUSTFLAGS='-Zllvm-time-trace' cargo build --release ...<\/code><\/pre>\n<p>\u041e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 <code>$package-$hash.llvm_timings.json<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<pre><code class=\"powershell\">$ ls -lAh target\/x86_64-unknown-linux-musl\/release\/deps | head total 5G -rw-r--r--    1 root     root       11.8K Jun  9 23:11 aho_corasick-ff268aeac1b7a243.d -rw-r--r--    1 root     root       69.4M Jun  9 23:11 aho_corasick-ff268aeac1b7a243.llvm_timings.json -rw-r--r--    1 root     root        6.6K Jun  9 23:11 allocator_api2-28ed2e0fa8ab7b44.d -rw-r--r--    1 root     root      373.1K Jun  9 23:11 allocator_api2-28ed2e0fa8ab7b44.llvm_timings.json -rw-r--r--    1 root     root        4.0K Jun  9 23:11 anstream-cf9519a72988d4c1.d -rw-r--r--    1 root     root        4.4M Jun  9 23:11 anstream-cf9519a72988d4c1.llvm_timings.json -rw-r--r--    1 root     root        2.4K Jun  9 23:11 anstyle-76a77f68346b4238.d -rw-r--r--    1 root     root      885.3K Jun  9 23:11 anstyle-76a77f68346b4238.llvm_timings.json -rw-r--r--    1 root     root        2.2K Jun  9 23:11 anstyle_parse-702e2f8f76fe1827.d<\/code><\/pre>\n<p><em>(\u041f\u043e\u0447\u0435\u043c\u0443 <\/em><code><em>root<\/em><\/code><em>? \u041c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c docker \u0431\u0435\u0437 root \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 \u0442\u0435\u0445 \u043f\u043e\u0440 \u044f \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b\u0441\u044f)<\/em><\/p>\n<p>\u0418\u0442\u0430\u043a, \u0443\u0434\u0430\u043b\u0438\u0432 <code>*.llvm_timings.json<\/code>\u00a0\u043c\u0435\u0436\u0434\u0443 <code>cargo-chef<\/code>\u00a0\u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432 <code>web_http_server.llvm_timings.json<\/code> \u0435\u0434\u0438\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/p>\n<pre><code class=\"powershell\">$ du -sh web_http_server.llvm_timings.json 1.4Gweb_http_server.llvm_timings.json<\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f <em>\u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u0439<\/em>. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430!<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0435\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Firefox<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c Firefox, \u0442\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c <a href=\"https:\/\/profiler.firefox.com\/\" rel=\"noopener noreferrer nofollow\">Firefox Profiler<\/a>? \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0441 \u0444\u0430\u0439\u043b\u043e\u043c:<\/p>\n<blockquote>\n<p>Firefox Profiler \u043c\u043e\u0436\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u0438 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/profiler.firefox.com\/docs\/#\/.\/guide-perf-profiling\" rel=\"noopener noreferrer nofollow\">Linux perf<\/a>,\u00a0<a href=\"https:\/\/profiler.firefox.com\/docs\/#\/.\/guide-android-profiling\" rel=\"noopener noreferrer nofollow\">Android SimplePerf<\/a>, \u043f\u0430\u043d\u0435\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Chrome,\u00a0<a href=\"https:\/\/developer.android.com\/studio\/profile\/cpu-profiler\" rel=\"noopener noreferrer nofollow\">Android Studio<\/a> \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 \u0444\u0430\u0439\u043b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <a href=\"https:\/\/valgrind.org\/docs\/manual\/dh-manual.html\" rel=\"noopener noreferrer nofollow\">dhat<\/a>\u00a0\u0438\u043b\u0438 <a href=\"https:\/\/docs.google.com\/document\/d\/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU\/preview\" rel=\"noopener noreferrer nofollow\">Google Trace Event<\/a>.<\/p>\n<\/blockquote>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/031\/806\/807\/0318068079467dc468da884b3f7a2e24.png\" alt=\"Screenshot of error message from Firefox Profiler, saying the profile couldn't be parsed as a UTF-8 string\" title=\"\" width=\"691\" height=\"390\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/031\/806\/807\/0318068079467dc468da884b3f7a2e24.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/031\/806\/807\/0318068079467dc468da884b3f7a2e24.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0417\u0430\u0433\u043b\u044f\u043d\u0443\u0432 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u043c\u044b \u043f\u043e\u0439\u043c\u0451\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u2013 \u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c \u043f\u0430\u043c\u044f\u0442\u044c:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d7d\/b93\/9c2\/d7db939c2e314b6098efb1e583dd1233.png\" alt=\"Screenshot of console error messages. The first reads reads NS_ERROR_OUT_OF_MEMORY. The two others say the array buffer couldn't be parsed as UTF-8.\" title=\"\" width=\"949\" height=\"184\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d7d\/b93\/9c2\/d7db939c2e314b6098efb1e583dd1233.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d7d\/b93\/9c2\/d7db939c2e314b6098efb1e583dd1233.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>perfetto.dev \u0432 Firefox<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u043e\u0438\u0441\u043a\u0430\u0432 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043e\u043a \u0444\u043e\u0440\u043c\u0430\u0442\u0430 Chrome,\u00a0\u044f \u043d\u0430\u0448\u0451\u043b <a href=\"http:\/\/perfetto.dev\" rel=\"noopener noreferrer nofollow\">perfetto.dev<\/a>. \u0415\u0433\u043e \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0438\u043d\u0433\u043e\u043c \u0442\u043e\u0436\u0435 <a href=\"https:\/\/github.com\/google\/perfetto\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f Google<\/a>.<\/p>\n<p>\u042f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0435\u0433\u043e \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0435 \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u043b\u0433\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0438 \u0443 \u043d\u0435\u0433\u043e \u0442\u043e\u0436\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c \u043f\u0430\u043c\u044f\u0442\u044c:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e61\/ef8\/5bb\/e61ef85bb44381ef5a52d65f65ce6741.png\" alt=\"Screenshot of an error pop-up, saying the WASM processor ran out of memory and advising to run perfetto locally. It also says the typca\" title=\"\" width=\"1129\" height=\"548\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e61\/ef8\/5bb\/e61ef85bb44381ef5a52d65f65ce6741.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e61\/ef8\/5bb\/e61ef85bb44381ef5a52d65f65ce6741.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a WASM, \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c \u0441 <a href=\"https:\/\/github.com\/google\/perfetto\/issues\/1301\" rel=\"noopener noreferrer nofollow\">\u0431\u0430\u0433\u043e\u043c Firefox<\/a>.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u044f \u0441\u0434\u0430\u043b\u0441\u044f \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f Chromium, \u043d\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043b \u043f\u043e\u043f\u044b\u0442\u043a\u0443. \u0421 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 Perfetto \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/20e\/196\/659\/20e1966592787bc01c366f12fe00da8e.png\" alt=\"Screenshot of the perfetto UI, showing a few rows of vibrantly colored flamegraphs\" title=\"\" width=\"1252\" height=\"1462\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/20e\/196\/659\/20e1966592787bc01c366f12fe00da8e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/20e\/196\/659\/20e1966592787bc01c366f12fe00da8e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043b, \u0447\u0442\u043e <em>\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e<\/em>, \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u0438 \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 LLVM \u044f\u0432\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043b\u0443\u0447\u0448\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>chrome:\/\/tracing\u00a0\u0432 Chromium<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421\u0442\u043e\u0438\u043b\u043e \u0431\u044b \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044f \u0442\u043e\u0436\u0435 \u043f\u043e\u0442\u0435\u0440\u043f\u0435\u043b \u043d\u0435\u0443\u0434\u0430\u0447\u0443, \u0445\u043e\u0442\u044f \u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e, \u0447\u0435\u043c \u0440\u0430\u043d\u044c\u0448\u0435:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b10\/f30\/0d0\/b10f300d052663a66a4d6882cd1beef7.png\" alt=\"Screenshot of an error pop-up, saying &quot;Error while loading file: [object ProgressEvent]&quot;\" title=\"\" width=\"493\" height=\"253\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b10\/f30\/0d0\/b10f300d052663a66a4d6882cd1beef7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b10\/f30\/0d0\/b10f300d052663a66a4d6882cd1beef7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<p>\u041d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043d\u043e \u0432\u0435\u0434\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0430\u0439\u043b JSON \u0441 <a href=\"https:\/\/docs.google.com\/document\/d\/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU\/preview?tab=t.0\" rel=\"noopener noreferrer nofollow\">\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c<\/a>, \u0442\u0430\u043a \u0447\u0442\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u0432 \u044d\u0442\u043e\u043c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e?<\/p>\n<p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e JSON \u043d\u0430 1,4 \u0413\u0438\u0411 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>less<\/code>, \u0442\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0441\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c <code>jq<\/code>, \u0442\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u0441\u0435 1,4 \u0413\u0438\u0411 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 <code>jq<\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 <em>\u0433\u043e\u0440\u0430\u0437\u0434\u043e <\/em>\u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430, \u0447\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 1,4 \u0413\u0438\u0411).<\/p>\n<\/li>\n<li>\n<p>Vim \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0418, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0432\u044b \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c <code>cat<\/code>\u00a0\u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u2014 \u043f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c: \u044d\u0442\u043e \u0444\u0430\u0439\u043b \u043d\u0430 1,4 \u0413\u0438\u0411!<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u043a\u043e\u043d\u0446\u0435 \u0444\u0430\u0439\u043b\u0430:<\/p>\n<pre><code class=\"powershell\">$ head -c300 web_http_server.llvm_timings.json {\"traceEvents\":[{\"pid\":25,\"tid\":30,\"ts\":8291351,\"ph\":\"X\",\"dur\":6827,\"name\":\"RunPass\",\"args\":{\"detail\":\"Expand large div\/rem\"}},{\"pid\":25,\"tid\":30,\"ts\":8298181,\"ph\":\"X\",\"dur\":2,\"name\":\"RunPass\",\"args\":{\"detail\":\"Expand large fp convert\"}},{\"pid\":25,\"tid\":30,\"ts\":8298183,\"ph\":\"X\",\"dur\":8,\"name\":\"RunPa $ tail -c300 web_http_server.llvm_timings.json me\":\"\"}},{\"cat\":\"\",\"pid\":25,\"tid\":43,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}},{\"cat\":\"\",\"pid\":25,\"tid\":44,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}},{\"cat\":\"\",\"pid\":25,\"tid\":29,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}}],\"beginningOfTime\":1749510885820760}<\/code><\/pre>\n<p>\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u0438\u0445 \u0441 <a href=\"https:\/\/docs.google.com\/document\/d\/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU\/preview?tab=t.0#heading=h.q8di1j2nawlp\" rel=\"noopener noreferrer nofollow\">JSON Object Format<\/a>\u00a0\u0438\u0437 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Chrome, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0439\u0442\u0438 \u043a \u0432\u044b\u0432\u043e\u0434\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 JSON \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"powershell\">{   \"traceEvents\": [     {\"pid\":25,\"tid\":30,\"ts\":8291351,\"ph\":\"X\",\"dur\":6827,\"name\":\"RunPass\",\"args\":{\"detail\":\"Expand large div\/rem\"}},     {\"pid\":25,\"tid\":30,\"ts\":8298181,\"ph\":\"X\",\"dur\":2,\"name\":\"RunPass\",\"args\":{\"detail\":\"Expand large fp convert\"}},     ...   ],   \"beginningOfTime\": 1749510885820760 }<\/code><\/pre>\n<p>\u041c\u044b \u0431\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0431\u044b \u0440\u0430\u0437\u0431\u0438\u043b\u0438 \u0432\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"powershell\">cat web_http_server.llvm_timings.json \\     | sed -E 's\/},\/}\\n\/g;s\/^\\{\"traceEvents\":\\[\/\/g;s\/\\],\"beginningOfTime\":[0-9]+}$\/\/g' \\     &gt; web-http-server.llvm_timings.jsonl<\/code><\/pre>\n<p><em>(\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c <\/em><code><em>\"},\"<\/em><\/code><em>\u00a0\u0432 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u043c \u043a\u043e\u043d\u0435\u0446 \u043e\u0431\u044a\u0435\u043a\u0442\u0430)<\/em><\/p>\n<p>\u0412\u043e\u0442 <em>\u0442\u0435\u043f\u0435\u0440\u044c <\/em>\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<pre><code class=\"powershell\">$ wc -l web_http_server.llvm_timings.jsonl 7301865 web_http_server.llvm_timings.jsonl  $ head web_http_server.llvm_timings.jsonl {\"pid\":25,\"tid\":30,\"ts\":8291351,\"ph\":\"X\",\"dur\":6827,\"name\":\"RunPass\",\"args\":{\"detail\":\"Expand large div\/rem\"}} {\"pid\":25,\"tid\":30,\"ts\":8298181,\"ph\":\"X\",\"dur\":2,\"name\":\"RunPass\",\"args\":{\"detail\":\"Expand large fp convert\"}} {\"pid\":25,\"tid\":30,\"ts\":8298183,\"ph\":\"X\",\"dur\":8,\"name\":\"RunPass\",\"args\":{\"detail\":\"Expand Atomic instructions\"}} {\"pid\":25,\"tid\":30,\"ts\":8298192,\"ph\":\"X\",\"dur\":0,\"name\":\"RunPass\",\"args\":{\"detail\":\"Lower AMX intrinsics\"}} {\"pid\":25,\"tid\":30,\"ts\":8298193,\"ph\":\"X\",\"dur\":0,\"name\":\"RunPass\",\"args\":{\"detail\":\"Lower AMX type for load\/store\"}} {\"pid\":25,\"tid\":30,\"ts\":8298195,\"ph\":\"X\",\"dur\":1,\"name\":\"RunPass\",\"args\":{\"detail\":\"Lower Garbage Collection Instructions\"}} {\"pid\":25,\"tid\":30,\"ts\":8298196,\"ph\":\"X\",\"dur\":1,\"name\":\"RunPass\",\"args\":{\"detail\":\"Shadow Stack GC Lowering\"}} {\"pid\":25,\"tid\":30,\"ts\":8298197,\"ph\":\"X\",\"dur\":1164,\"name\":\"RunPass\",\"args\":{\"detail\":\"Remove unreachable blocks from the CFG\"}} {\"pid\":25,\"tid\":30,\"ts\":8299362,\"ph\":\"X\",\"dur\":1,\"name\":\"RunPass\",\"args\":{\"detail\":\"Instrument function entry\/exit with calls to e.g. mcount() (post inlining)\"}} {\"pid\":25,\"tid\":30,\"ts\":8299363,\"ph\":\"X\",\"dur\":5,\"name\":\"RunPass\",\"args\":{\"detail\":\"Scalarize Masked Memory Intrinsics\"}}<\/code><\/pre>\n<h3>\u0427\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 LLVM?<\/h3>\n<p>\u041f\u043e\u0445\u043e\u0436\u0435, \u0432\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0435\u0441\u0442\u044c <code>\"ph\":\"X\"<\/code>.<\/p>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043f\u043e\u043b\u0435 <code>ph<\/code>\u00a0\u0437\u0430\u0434\u0430\u0451\u0442 \u0442\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0430 <code>X<\/code>\u00a0\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u043f\u043e\u043b\u043d\u044b\u0435\u00bb \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044f, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043d\u044f\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 (<code>tid<\/code>). \u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>dur<\/code>.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0431\u044b\u0432\u0430\u044e\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>M<\/code>:<\/p>\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl | jq -c 'select(.ph != \"X\")' | head {\"cat\":\"\",\"pid\":25,\"tid\":27,\"ts\":0,\"ph\":\"M\",\"name\":\"process_name\",\"args\":{\"name\":\"rustc\"}} {\"cat\":\"\",\"pid\":25,\"tid\":27,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}} {\"cat\":\"\",\"pid\":25,\"tid\":30,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}} {\"cat\":\"\",\"pid\":25,\"tid\":35,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}} {\"cat\":\"\",\"pid\":25,\"tid\":32,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}} {\"cat\":\"\",\"pid\":25,\"tid\":33,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}} {\"cat\":\"\",\"pid\":25,\"tid\":34,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}} {\"cat\":\"\",\"pid\":25,\"tid\":39,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}} {\"cat\":\"\",\"pid\":25,\"tid\":40,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}} {\"cat\":\"\",\"pid\":25,\"tid\":36,\"ts\":0,\"ph\":\"M\",\"name\":\"thread_name\",\"args\":{\"name\":\"\"}} <\/code><\/pre>\n<p>\u042d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u00ab\u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u00bb \u2014 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f.<\/p>\n<p>\u0410 \u043a\u0440\u043e\u043c\u0435 \u043d\u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e:<\/p>\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl | jq -c 'select(.ph != \"X\" and .ph != \"M\")' &lt;nothing&gt;<\/code><\/pre>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c <code>X<\/code>: \u0443 \u043c\u043d\u043e\u0433\u0438\u0445 \u0438\u0437 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c <code>\"name\":\"RunPass\"<\/code>. \u0410 \u0447\u0442\u043e \u0435\u0449\u0451 \u0442\u0430\u043c \u0435\u0441\u0442\u044c?<\/p>\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl | jq -c 'select(.ph == \"X\" and .name != \"RunPass\")' | head {\"pid\":25,\"tid\":30,\"ts\":8291349,\"ph\":\"X\",\"dur\":32009,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RNvCscSpY9Juk0HT_7___rustc12___rust_alloc\"}} {\"pid\":25,\"tid\":30,\"ts\":8323394,\"ph\":\"X\",\"dur\":283,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RNvCscSpY9Juk0HT_7___rustc14___rust_dealloc\"}} {\"pid\":25,\"tid\":30,\"ts\":8323678,\"ph\":\"X\",\"dur\":216,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RNvCscSpY9Juk0HT_7___rustc14___rust_realloc\"}} {\"pid\":25,\"tid\":30,\"ts\":8323895,\"ph\":\"X\",\"dur\":179,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RNvCscSpY9Juk0HT_7___rustc19___rust_alloc_zeroed\"}} {\"pid\":25,\"tid\":30,\"ts\":8324075,\"ph\":\"X\",\"dur\":155,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RNvCscSpY9Juk0HT_7___rustc26___rust_alloc_error_handler\"}} {\"pid\":25,\"tid\":30,\"ts\":8288691,\"ph\":\"X\",\"dur\":35693,\"name\":\"OptModule\",\"args\":{\"detail\":\"5z12fn0vr5uv0i2pfsngwe5em\"}} {\"pid\":25,\"tid\":35,\"ts\":9730144,\"ph\":\"X\",\"dur\":16,\"name\":\"Annotation2MetadataPass\",\"args\":{\"detail\":\"[module]\"}} {\"pid\":25,\"tid\":35,\"ts\":9730214,\"ph\":\"X\",\"dur\":10,\"name\":\"ForceFunctionAttrsPass\",\"args\":{\"detail\":\"[module]\"}} {\"pid\":25,\"tid\":35,\"ts\":9730346,\"ph\":\"X\",\"dur\":11,\"name\":\"InnerAnalysisManagerProxy&lt;llvm::AnalysisManager&lt;llvm::Function&gt;, llvm::Module&gt;\",\"args\":{\"detail\":\"[module]\"}} {\"pid\":25,\"tid\":35,\"ts\":9730416,\"ph\":\"X\",\"dur\":17,\"name\":\"TargetLibraryAnalysis\",\"args\":{\"detail\":\"llvm.expect.i1\"}}<\/code><\/pre>\n<p>\u0417\u0434\u043e\u0440\u043e\u0432\u043e! \u041f\u043e\u0445\u043e\u0436\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c (demangle) \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043c\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0439\u043c\u0451\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0442\u0430\u043a\u0430\u044f \u0434\u043e\u043b\u0433\u0430\u044f.<\/p>\n<p>\u041d\u0438\u0436\u0435 \u0438\u0434\u0451\u0442 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>Total OptFunction<\/code>. \u041e\u043d\u0430 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u0430 \u0441\u0443\u043c\u043c\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>OptFunction<\/code>). \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438:<\/p>\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl | jq -r 'select(.name | startswith(\"Total \")) | \"\\(.dur \/ 1e6) \\(.name)\"' | sort -rn | head 665.369662 Total ModuleInlinerWrapperPass 656.465446 Total ModuleToPostOrderCGSCCPassAdaptor 632.441396 Total DevirtSCCRepeatedPass 627.236893 Total PassManager&lt;llvm::LazyCallGraph::SCC, llvm::AnalysisManager&lt;llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&amp;&gt;, llvm::LazyCallGraph&amp;, llvm::CGSCCUpdateResult&amp;&gt; 536.738589 Total PassManager&lt;llvm::Function&gt; 372.768547 Total CGSCCToFunctionPassAdaptor 193.914869 Total ModuleToFunctionPassAdaptor 190.924012 Total OptModule 189.621119 Total OptFunction 182.250077 Total InlinerPass<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 110 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 16 \u044f\u0434\u0440\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044b \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u043d\u044b \u0434\u0432\u0430\u0436\u0434\u044b (\u0447\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u2014 \u043c\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c \u0438 <code>ModuleInlinerWrapperPass<\/code>,<em> \u0438<\/em>\u00a0<code>InlinerPass<\/code>, \u0430 <code>OptModule<\/code>, \u043f\u043e\u0445\u043e\u0436\u0435, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>OptFunction<\/code>).<\/p>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f (<code>OptFunction<\/code>) \u0438 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435 (<code>InlinerPass<\/code>). \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441 \u044d\u0442\u0438\u043c \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<h3>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c InlinerPass?<\/h3>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0434\u0430!<\/p>\n<p>\u0423 LLVM \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 <code>rustc<\/code>\u00a0\u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u043b\u0430\u0433\u0430 <code>-C llvm-args<\/code>. \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 (\u0438\u044e\u043d\u044c 2025 \u0433\u043e\u0434\u0430), \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u0442\u043e \u043e\u043f\u0446\u0438\u0439, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435\u043c (<code>rustc -C llvm-args='--help-list-hidden'<\/code>). \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, <a href=\"https:\/\/github.com\/llvm\/llvm-project\/blob\/c7063380205d8776e281f7a6603119aa8ea28c12\/llvm\/lib\/Analysis\/InlineCost.cpp#L58-L176\" rel=\"noopener noreferrer nofollow\">\u043a\u0443\u0447\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043e\u043f\u0446\u0438\u0439<\/a>\u00a0\u0435\u0441\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0437\u0430\u0442\u0440\u0430\u0442.<\/p>\n<p>\u0411\u0443\u0434\u0443 \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u044b\u043c: \u044f <em>\u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e<\/em> \u0437\u043d\u0430\u044e \u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0438 LLVM. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043e\u043f\u0446\u0438\u0439 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u00ab\u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438\u00bb \u043d\u0430 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0441\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.\u00a0<strong>\u0412 \u044d\u0442\u043e\u043c \u044f \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0441\u044c.<\/strong>\u00a0\u041d\u043e \u0435\u0441\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><code>--inlinedefault-threshold=225<\/code>\u00a0\u2014 \u00ab\u043e\u0431\u044a\u0451\u043c \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb<\/p>\n<\/li>\n<li>\n<p><code>--inline-threshold=225<\/code>\u00a0\u2014 \u00ab\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f\u00bb<\/p>\n<\/li>\n<li>\n<p><code>--inlinehint-threshold=325<\/code>\u00a0\u2014 \u00ab\u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u0445\u0438\u043d\u0442\u043e\u043c inline\u00bb<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043e\u043f\u0446\u0438\u044f\u0445 \u00abthreshold\u00bb \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \u00ab\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0441 \u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438 \u043d\u0438\u0436\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u00bb, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u043c \u0432\u044b\u0448\u0435 threshold, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043c \u044d\u0442\u0438\u043c \u043e\u043f\u0446\u0438\u044f\u043c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>50<\/code>), \u0442\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0441\u043d\u0438\u0437\u0438\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"powershell\">RUSTFLAGS=\"-Cllvm-args=-inline-threshold=50 -Cllvm-args=-inlinedefault-threshold=50 -Cllvm-args=-inlinehint-threshold=50\" ...<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e, \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 threshold \u0434\u043e 50\u00a0<em>\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e<\/em>\u00a0\u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e! \u0421 48,8 \u0441 \u0434\u043e 42,2 \u0441.<\/p>\n<p>\u0412\u043e\u0442, \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/94f\/687\/2dd\/94f6872dd49d14d691f57e4e6dab7766.png\" width=\"774\" height=\"450\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/94f\/687\/2dd\/94f6872dd49d14d691f57e4e6dab7766.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/94f\/687\/2dd\/94f6872dd49d14d691f57e4e6dab7766.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><em>(\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e 1, \u0430 \u043d\u0435 0. \u041f\u043e\u0447\u0435\u043c\u0443 1? \u0418\u043d\u043e\u0433\u0434\u0430 0 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c 1.)<\/em><\/p>\n<p>\u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0441\u043b\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0432 \u043c\u043e\u0451\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f (\u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0443 \u043c\u043e\u0435\u0433\u043e \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 \u043f\u043e\u0447\u0442\u0438 \u043d\u0443\u043b\u0435\u0432\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430!), \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 10. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0442\u043e\u0440\u043e\u043f\u0438\u0442\u044c\u0441\u044f.<\/p>\n<h3>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c OptFunction?<\/h3>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0441\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435 (\u0443 \u043d\u0430\u0441 \u0432\u044b\u0431\u0440\u0430\u043d <code>opt-level = 1<\/code>, \u0430 <code>opt-level = 0<\/code>\u00a0\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438). \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0436\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u043d\u0430 \u0447\u0442\u043e \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u043a\u0440\u0430\u0442\u0446\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439:<\/p>\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl | jq -c 'select(.name == \"OptFunction\")' | head {\"pid\":25,\"tid\":30,\"ts\":7995006,\"ph\":\"X\",\"dur\":32052,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RNvCscSpY9Juk0HT_7___rustc12___rust_alloc\"}} {\"pid\":25,\"tid\":30,\"ts\":8027059,\"ph\":\"X\",\"dur\":242,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RNvCscSpY9Juk0HT_7___rustc14___rust_dealloc\"}} {\"pid\":25,\"tid\":30,\"ts\":8027302,\"ph\":\"X\",\"dur\":158,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RNvCscSpY9Juk0HT_7___rustc14___rust_realloc\"}} {\"pid\":25,\"tid\":30,\"ts\":8027461,\"ph\":\"X\",\"dur\":126,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RNvCscSpY9Juk0HT_7___rustc19___rust_alloc_zeroed\"}} {\"pid\":25,\"tid\":30,\"ts\":8027589,\"ph\":\"X\",\"dur\":150,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RNvCscSpY9Juk0HT_7___rustc26___rust_alloc_error_handler\"}} {\"pid\":25,\"tid\":35,\"ts\":31457262,\"ph\":\"X\",\"dur\":24576,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_ZN10serde_json5value8to_value17h0315c73febebe85cE\"}} {\"pid\":25,\"tid\":35,\"ts\":31481850,\"ph\":\"X\",\"dur\":11862,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_ZN10serde_json5value8to_value17h0516143613516496E\"}} {\"pid\":25,\"tid\":35,\"ts\":31493764,\"ph\":\"X\",\"dur\":15830,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_ZN10serde_json5value8to_value17h0bdb4ac12d8ad59bE\"}} {\"pid\":25,\"tid\":35,\"ts\":31509615,\"ph\":\"X\",\"dur\":8221,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_ZN10serde_json5value8to_value17h0c630b789ee318c2E\"}} {\"pid\":25,\"tid\":35,\"ts\":31517858,\"ph\":\"X\",\"dur\":8670,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_ZN10serde_json5value8to_value17h12ba815471bb2bc8E\"}}<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u044b\u0440\u043e\u043c \u0432\u0438\u0434\u0435 \u043f\u043e\u043b\u0435\u00a0<code>.args.detail<\/code>\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041c\u043e\u0436\u043d\u043e \u00ab\u0440\u0430\u0437\u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb \u0438\u0445 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b Rust \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/github.com\/luser\/rustfilt\" rel=\"noopener noreferrer nofollow\"><code>rustfilt<\/code><\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"powershell\">$ cargo install rustfilt  $ rustfilt '_RNvCscSpY9Juk0HT_7___rustc12___rust_alloc' __rustc::__rust_alloc $ rustfilt '_ZN10serde_json5value8to_value17h0315c73febebe85cE' serde_json::value::to_value<\/code><\/pre>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0445\u043e\u0442\u044f \u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u0441\u043f\u0438\u0441\u043a\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 <code>serde_json::value::to_value<\/code>, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u044d\u0448\u0438:<\/p>\n<pre><code class=\"powershell\">$ rustfilt -h '_ZN10serde_json5value8to_value17h0315c73febebe85cE' serde_json::value::to_value::h0315c73febebe85c $ rustfilt -h '_ZN10serde_json5value8to_value17h0516143613516496E' serde_json::value::to_value::h0516143613516496 $ rustfilt -h '_ZN10serde_json5value8to_value17h0bdb4ac12d8ad59bE' serde_json::value::to_value::h0bdb4ac12d8ad59b $ rustfilt -h '_ZN10serde_json5value8to_value17h0c630b789ee318c2E' serde_json::value::to_value::h0c630b789ee318c2 $ rustfilt -h '_ZN10serde_json5value8to_value17h12ba815471bb2bc8E' serde_json::value::to_value::h12ba815471bb2bc8<\/code><\/pre>\n<p>&#8230; \u0447\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e <code>serde_json::value::to_value<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a-\u0444\u0443\u043d\u043a\u0446\u0438\u044f; \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 (\u00ab\u043c\u043e\u043d\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438\u00bb).<\/p>\n<h4>\u041f\u043e\u0441\u0442\u043e\u0439\u0442\u0435, \u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u0440\u0435\u0439\u0442\u043e\u0432?<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f <em>\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0442\u043e\u0433\u043e \u043a\u0440\u0435\u0439\u0442\u0430, \u0433\u0434\u0435 \u0431\u044b\u043b\u0430 \u043c\u043e\u043d\u043e\u043c\u043e\u0440\u0444\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f<\/em>. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0438\u043f <code>Foo<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f <code>Option&lt;Foo&gt;<\/code>, \u0442\u043e \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b <em>\u0441 \u044d\u0442\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438<\/em> \u0431\u0443\u0434\u0443\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u0440\u0435\u0439\u0442\u0430. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u043e\u0439 \u0436\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439, \u0447\u0442\u043e \u0438 \u043d\u0430\u0448 \u043a\u0440\u0435\u0439\u0442.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043d\u043e \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u044d\u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c!<\/p>\n<h4>\u041d\u0430 \u0447\u0442\u043e \u0436\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438?<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u0437\u0443\u0447\u0430\u0435\u043c, \u043f\u0440\u0438\u0448\u043b\u0430 \u043f\u043e\u0440\u0430 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u0438\u0437. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0439\u0434\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438:<\/p>\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl \\     | jq -c 'select(.name == \"OptFunction\")' \\     | jq -sc 'sort_by(-.dur) | .[] | { dur: (.dur \/ 1e6), detail: .args.detail }' \\     | head {\"dur\":1.875744,\"detail\":\"_ZN15web_http_server6photos11PhotosState3new28_$u7b$$u7b$closure$u7d$$u7d$17ha4de409b0951d78bE\"} {\"dur\":1.44252,\"detail\":\"_ZN14tokio_postgres6client6Client5query28_$u7b$$u7b$closure$u7d$$u7d$17h18fb9179bb73bfa4E\"} {\"dur\":1.440186,\"detail\":\"_ZN15web_http_server3run28_$u7b$$u7b$closure$u7d$$u7d$17h426fe76bd1b089abE\"} {\"dur\":1.397705,\"detail\":\"_ZN15web_http_server6photos11PhotosState3new28_$u7b$$u7b$closure$u7d$$u7d$17ha4de409b0951d78bE\"} {\"dur\":1.170948,\"detail\":\"_ZN14tokio_postgres11connect_raw11connect_raw28_$u7b$$u7b$closure$u7d$$u7d$17h0dfcfa0a648a93f8E\"} {\"dur\":1.158111,\"detail\":\"_ZN14pulldown_cmark5parse15Parser$LT$F$GT$19handle_inline_pass117hc91a3dc90e0e9e0cE\"} {\"dur\":1.131707,\"detail\":\"_ZN129_$LT$axum..boxed..MakeErasedHandler$LT$H$C$S$GT$$u20$as$u20$axum..boxed..ErasedIntoRoute$LT$S$C$core..convert..Infallible$GT$$GT$9clone_box17he7f38a2ccd053fbbE\"} {\"dur\":1.062162,\"detail\":\"_ZN4core3ptr49drop_in_place$LT$http..extensions..Extensions$GT$17h89b138bb6c1aa101E\"} {\"dur\":1.026656,\"detail\":\"_ZN15web_http_server3run28_$u7b$$u7b$closure$u7d$$u7d$17h426fe76bd1b089abE\"} {\"dur\":1.009844,\"detail\":\"_ZN4core3ptr252drop_in_place$LT$$LT$alloc..vec..drain..Drain$LT$T$C$A$GT$$u20$as$u20$core..ops..drop..Drop$GT$..drop..DropGuard$LT$lol_html..selectors_vm..stack..StackItem$LT$lol_html..rewriter..rewrite_controller..ElementDescriptor$GT$$C$alloc..alloc..Global$GT$$GT$17h62ca0c07fce3ede0E\"}<\/code><\/pre>\n<p><em>(\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u044b \u0434\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u0430 <\/em><code><em>jq<\/em><\/code><em>? \u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d, \u0442\u043e \u0432\u044b\u0437\u043e\u0432 <\/em><code><em>-s<\/em><\/code><em>\/<\/em><code><em>--slurp<\/em><\/code><em>\u00a0\u043f\u0435\u0440\u0435\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b \u0431\u044b \u0432\u0435\u0441\u044c \u0444\u0430\u0439\u043b \u0432 \u043e\u0434\u0438\u043d \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c)<\/em><\/p>\n<p>\u041d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438! \u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u043d\u043e \u0434\u0430\u0436\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430 \u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e!<\/p>\n<p>\u041d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0437\u0443\u0447\u0438\u043c \u0432\u0441\u0451 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c:<\/p>\n<ul>\n<li>\n<p><code>web_http_server::photos::PhotosState::new::{{closure}}<\/code>\u00a0\u2014 \u044d\u0442\u043e <em>\u043d\u0435\u043a\u043e\u0435<\/em> \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 async-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435\u0441\u0442\u0430 \u0441\u0442\u0440\u043e\u043a, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0434\u043b\u044f <a href=\"https:\/\/sharnoff.io\/photos\" rel=\"noopener noreferrer nofollow\">https:\/\/sharnoff.io\/photos<\/a><\/p>\n<\/li>\n<li>\n<p><code>web_http_server::run::{{closure}}<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 (\u0442\u043e\u0436\u0435 async), \u043d\u043e \u0432\u0441\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>.wrap_err_with(|| format!(\"failed to bind address {addr:?}\"))<\/code><\/p>\n<ul>\n<li>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0442\u043e-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435!<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&#8230; \u0438 \u043a\u0443\u0447\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u0436\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f:<\/p>\n<ul>\n<li>\n<p><code>pulldown_cmark<\/code>\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <a href=\"https:\/\/github.com\/pulldown-cmark\/pulldown-cmark\/blob\/0.13.0\/pulldown-cmark\/src\/parse.rs#L387-L862\" rel=\"noopener noreferrer nofollow\">\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043f\u044f\u0442\u044c\u0441\u043e\u0442 \u0441\u0442\u0440\u043e\u043a<\/a><\/p>\n<\/li>\n<li>\n<p><code>tokio_postgres::connect_raw<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 <a href=\"https:\/\/github.com\/sfackler\/rust-postgres\/blob\/tokio-postgres-v0.7.13\/tokio-postgres\/src\/connect_raw.rs#L82-L127\" rel=\"noopener noreferrer nofollow\">async-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430<\/a>. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0432 <code>web_http_server::run<\/code>?<\/p>\n<\/li>\n<li>\n<p>Drop-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <a href=\"https:\/\/docs.rs\/http\/1.2.0\/http\/struct.Extensions.html\" rel=\"noopener noreferrer nofollow\"><code>http::extensions::Extensions<\/code><\/a>\u00a0<em>\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442<\/em>\u00a0\u0442\u0430\u043a, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 (\u0443 \u043d\u0435\u0451 \u043d\u0435\u0442 \u044f\u0432\u043d\u043e\u0433\u043e \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430), \u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0451 <a href=\"https:\/\/github.com\/hyperium\/http\/blob\/v1.2.0\/src\/extensions.rs#L6\" rel=\"noopener noreferrer nofollow\"><code>Option&lt;Box&lt;HashMap&lt;TypeId, Box&lt;dyn ...&gt;, BuildDefaultHasher&lt;..&gt;&gt;&gt;&gt;<\/code><\/a>. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0437\u0434\u0435\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0437-\u0437\u0430 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f?<\/p>\n<\/li>\n<li>\n<p>\u0418 <a href=\"https:\/\/doc.rust-lang.org\/std\/vec\/struct.Drain.html\" rel=\"noopener noreferrer nofollow\"><code>vec::Drain&lt;T&gt;<\/code><\/a>\u00a0\u0441 \u0441\u0435\u0440\u0438\u0435\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 <a href=\"https:\/\/docs.rs\/lol_html\" rel=\"noopener noreferrer nofollow\"><code>lol_html<\/code><\/a>\u00a0\u0442\u043e\u0436\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0436\u0430\u043b\u043e\u0431\u044b; \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e \u0442\u0435\u043c \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p><strong>\u0418\u043b\u0438 \u0436\u0435<\/strong> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0443 \u043f\u043e \u0441\u0430\u043c\u043e\u043c\u0443 \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u043a\u0440\u0435\u0439\u0442\u0443:<\/p>\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl \\     | jq -r 'select(.name == \"OptFunction\") | \"\\(.dur) \\(.args.detail)\"' \\     | xargs -l bash -c 'echo \"{\\\"dur\\\":$0,\\\"root\\\":\\\"$(rustfilt \"$1\" | sed -E \"s\/^([a-z_-]+)::.*\/\\1\/g\")\\\"}\"' \\     | jq -s -r 'group_by(.root) | map({ root: .[0].root, dur: (map(.dur) | add) }) | sort_by(-.dur) | .[] | \"\\(.dur \/ 1e6) \\(.root)\"' \\     | head  61.534452 core 13.750173 web_http_server 11.237289 tokio 7.890088 tokio_postgres 6.851621 lol_html 4.470053 alloc 4.177471 feed_rs 3.269217 std 3.067573 hashbrown 3.063146 eyre<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0442\u043e\u0447\u043d\u0430\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430: \u0441\u0430\u043c\u044b\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u0440\u0435\u0439\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u0432\u044f\u0437\u0430\u043d \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0443\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <code>&lt;Foo as Bar&gt;::baz<\/code>. \u041d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u043d\u0430 \u0432\u0441\u0451 \u044d\u0442\u043e \u0433\u043b\u0430\u0437\u0430, \u0442\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432\u043d\u043e\u0441\u0438\u0442 <code>core<\/code>!<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0433\u043b\u0443\u0431\u0436\u0435, \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e 84% \u044d\u0442\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u0438 <a href=\"https:\/\/doc.rust-lang.org\/stable\/core\/ptr\/fn.drop_in_place.html\" rel=\"noopener noreferrer nofollow\"><code>core::ptr::drop_in_place<\/code><\/a>!<\/p>\n<h4>\u0418\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0433\u043b\u0443\u0431\u0436\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0441 \u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c v0<\/h4>\n<p>\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c; \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u0442\u043e\u0438\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435. \u0415\u0441\u0442\u044c \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 <code>{{closure}}<\/code>, \u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u044f, <em>\u043a\u0430\u043a\u043e\u0435<\/em> \u0438\u0437 \u043d\u0438\u0445 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p>\u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c! \u041d\u0430 \u0438\u044e\u043d\u044c 2025 \u0433\u043e\u0434\u0430\u00a0<code>rustc<\/code>\u00a0\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u00ab\u043b\u0435\u0433\u0430\u0441\u0438\u00bb-\u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043d\u043e \u0435\u0441\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u0430\u044f \u043e\u043f\u0446\u0438\u044f \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439: <a href=\"https:\/\/doc.rust-lang.org\/rustc\/symbol-mangling\/v0.html\" rel=\"noopener noreferrer nofollow\">\u0444\u043e\u0440\u043c\u0430\u0442 v0<\/a>.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0441\u044f \u0444\u043b\u0430\u0433\u0430\u043c <code>RUSTFLAGS=\"-C symbol-mangling-version=v0\"<\/code>. \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"powershell\">RUSTC_BOOTSTRAP=1 RUSTFLAGS=\"-Csymbol-mangling-version=v0 -Zllvm-time-trace\" cargo build --timings ...<\/code><\/pre>\n<p><em>(\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: issue \u044d\u0442\u043e\u0439 \u0444\u0438\u0447\u0438 \u0431\u044b\u043b \u043e\u0442\u043a\u0440\u044b\u0442 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0448\u0435\u0441\u0442\u0438 \u043b\u0435\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u0435\u0451 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0441\u043c\u0435\u0440\u0434\u0436\u0438\u043b\u0438? \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <\/em><code><em>gdb<\/em><\/code><em>\u00a0\u0438 <\/em><code><em>perf<\/em><\/code><em>, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u0430\u043f\u0441\u0442\u0440\u0438\u043c-\u0440\u0430\u0431\u043e\u0442\u044b. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0435\u0451 \u0447\u0430\u0441\u0442\u044c \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u0430, \u043d\u043e \u0433\u043e\u0442\u043e\u0432\u043e \u0435\u0449\u0451 \u043d\u0435 \u0432\u0441\u0451).<\/em><\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0442\u043e\u0433\u043e \u0432 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0435 LLVM \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f <strong>\u0433\u043e\u0440\u0430\u0437\u0434\u043e<\/strong> \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b <code>serde_json::value::to_value<\/code>:<\/p>\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl | jq -c 'select(.name == \"OptFunction\")' | grep -E 'serde_json.+value.+to_value' | head {\"pid\":25,\"tid\":35,\"ts\":34400185,\"ph\":\"X\",\"dur\":7336,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RINvNtCs9KWWFfvvCPd_10serde_json5value8to_valueINtNCNvCs5etrU9lJXb7_15web_http_server5index012IndexContextNtNtNtNtBQ_4blog6handle7context9RootIndexNtNtNtNtBQ_6photos6handle7context9RootIndexEEBQ_\"}} {\"pid\":25,\"tid\":35,\"ts\":34407530,\"ph\":\"X\",\"dur\":13226,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RINvNtCs9KWWFfvvCPd_10serde_json5value8to_valueNtNtNtNtCs5etrU9lJXb7_15web_http_server4blog6handle7context4PostEBR_\"}} {\"pid\":25,\"tid\":35,\"ts\":34420761,\"ph\":\"X\",\"dur\":10344,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RINvNtCs9KWWFfvvCPd_10serde_json5value8to_valueNtNtNtNtCs5etrU9lJXb7_15web_http_server4blog6handle7context5IndexEBR_\"}} {\"pid\":25,\"tid\":35,\"ts\":34431114,\"ph\":\"X\",\"dur\":11100,\"name\":\"OptFunction\",\"args\":{\"detail\":\"_RINvNtCs9KWWFfvvCPd_10serde_json5value8to_valueNtNtNtNtCs5etrU9lJXb7_15web_http_server6photos6handle7context11AlbumsIndexEBR_\"}}  $ rustfilt '_RINvNtCs9KWWFfvvCPd_10serde_json5value8to_valueINtNCNvCs5etrU9lJXb7_15web_http_server5index012IndexContextNtNtNtNtBQ_4blog6handle7context9RootIndexNtNtNtNtBQ_6photos6handle7context9RootIndexEEBQ_' serde_json::value::to_value::&lt;web_http_server::index::{closure#0}::IndexContext&lt;web_http_server::blog::handle::context::RootIndex, web_http_server::photos::handle::context::RootIndex&gt;&gt; $ rustfilt '_RINvNtCs9KWWFfvvCPd_10serde_json5value8to_valueNtNtNtNtCs5etrU9lJXb7_15web_http_server4blog6handle7context4PostEBR_' serde_json::value::to_value::&lt;web_http_server::blog::handle::context::Post&gt; $ rustfilt '_RINvNtCs9KWWFfvvCPd_10serde_json5value8to_valueNtNtNtNtCs5etrU9lJXb7_15web_http_server4blog6handle7context5IndexEBR_' serde_json::value::to_value::&lt;web_http_server::blog::handle::context::Index&gt; $ rustfilt '_RINvNtCs9KWWFfvvCPd_10serde_json5value8to_valueNtNtNtNtCs5etrU9lJXb7_15web_http_server6photos6handle7context11AlbumsIndexEBR_' serde_json::value::to_value::&lt;web_http_server::photos::handle::context::AlbumsIndex&gt;<\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0443 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 (\u0441\u043c., \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>{closure#0}<\/code>), \u043d\u043e \u0438 \u043f\u043e\u043b\u043d\u044b\u0435 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e!<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c <em>\u0434\u043e\u043b\u0436\u043d\u043e<\/em> \u0443\u0436\u0435 \u0441\u0442\u0430\u0442\u044c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u043d\u0430 \u0447\u0442\u043e \u0436\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438:<\/p>\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl \\     | jq -r 'select(.name == \"OptFunction\") | \"\\(.dur) \\(.args.detail)\"' \\     | xargs -l bash -c 'echo \"{\\\"dur\\\":$0,\\\"fn\\\":\\\"$(rustfilt \"$1\")\\\"}\"' \\     | jq -sr 'sort_by(-.dur) | .[] | \"\\(.dur \/ 1e4 | round | . \/ 1e2)s \\(.fn)\"' \\     | head -n5 1.99s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0} 1.56s web_http_server::run::{closure#0} 1.41s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0} 1.22s core::ptr::drop_in_place::&lt;axum::routing::Endpoint&lt;web_http_server::AppState&gt;&gt; 1.15s core::ptr::drop_in_place::&lt;axum::routing::method_routing::MethodEndpoint&lt;web_http_server::AppState, core::convert::Infallible&gt;&gt;<\/code><\/pre>\n<p>&#8230; \u043d\u043e \u044d\u0442\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439 <em>\u043a\u0440\u043e\u0448\u0435\u0447\u043d\u044b\u0435<\/em>:<\/p>\n<pre><code class=\"rust\">let is_jpg = |path: &amp;Path| path.extension().and_then(|s| s.to_str()) == Some(\"jpg\");<\/code><\/pre>\n<p>\u0438<\/p>\n<pre><code class=\"rust\">let app = axum::Router::new()     \/* .route(...) \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 *\/     .route(\"\/feed.xml\", axum::routing::get(move || async move { feed }))     \/\/                         \u0432\u043e\u0442 \u044d\u0442\u043e:   ^^^^^^^^^^^^^^^^^^^^^^^^^^^<\/code><\/pre>\n<p>\u0418 \u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0434\u0430\u043b\u0438\u043c \u044d\u0442\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f, \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u0438\u0445 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, LLVM\u00a0<em>\u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e<\/em>\u00a0\u0441\u043e\u043e\u0431\u0449\u0438\u0442, \u0447\u0442\u043e \u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e <code>{closure#0}<\/code>\u00a0\u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<h4>\u0422\u0430\u043a \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u044d\u0442\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f?<\/h4>\n<p>\u0421\u0434\u0430\u043c\u043f\u0438\u0432 LLVM IR \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>RUSTFLAGS=\"--emit=llvm-ir\"<\/code>\u00a0(\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 <code>target\/...\/deps\/*.ll<\/code>) \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u044f \u043d\u0430\u0448\u0451\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<pre><code class=\"ruby\">; core::ptr::drop_in_place::&lt;&lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::process_photo::{closure#0}&gt;<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f<code>process_photo<\/code>\u00a0\u0431\u044b\u043b\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 async-\u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 <code>PhotosState::new<\/code>. \u0422\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0441\u0438\u043c\u0432\u043e\u043b \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f?<\/p>\n<hr\/>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 <code>rustc<\/code>\u00a0<em>async-\u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u0431\u043b\u043e\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0432\u0438\u0434\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f<\/em>. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 async-\u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0433\u0434\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f <code>closure#0<\/code>\u00a0\u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438\u043c\u0435\u043b\u0438\u0441\u044c \u0432 \u0432\u0438\u0434\u0443 \u0441\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438!<\/p>\n<p>\u041f\u043e\u0438\u0441\u043a\u0430\u0432 \u043f\u043e github (<code>is:issue state:open async fn closure mangle<\/code>), \u044f \u0432\u044b\u044f\u0441\u043d\u0438\u043b, \u0447\u0442\u043e \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0432\u043e\u0434\u0443 \u0443\u0436\u0435 <a href=\"https:\/\/github.com\/rust-lang\/rust\/issues\/104830\" rel=\"noopener noreferrer nofollow\">\u0435\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0435 issue<\/a>!<\/p>\n<h4>\u0411\u043e\u043b\u044c\u0448\u0438\u0435 async-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0432\u0440\u0435\u0434\u043d\u044b\u043c\u0438?<\/h4>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0448\u0435 \u0441\u043f\u0438\u0441\u043a\u0443: \u0432 \u0442\u0435\u0445 async-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 LLVM \u0442\u0440\u0430\u0442\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e <code>closure#0<\/code>, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u0440\u0435\u043c\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u0442\u0435\u043b\u0435 \u0441\u0430\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041b\u043e\u0433\u0438\u0447\u043d\u043e, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e, \u0430 async-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u0432\u0434\u0432\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e <em>\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e<\/em> \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u0440\u0435\u0439\u0442\u0430 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0435 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438:<\/p>\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl \\     | jq -r 'select(.name == \"OptFunction\") | \"\\(.dur) \\(.args.detail)\"' \\     | xargs -l bash -c 'echo \"{\\\"dur\\\":$0,\\\"fn\\\":\\\"$(rustfilt \"$1\")\\\"}\"' \\     | jq -sc 'group_by(.fn) | map({ fn: .[0].fn, dur: (map(.dur) | add) }) | sort_by(-.dur) | .[]' \\     | jq -r 'select(.fn | test(\"^(core::ptr::drop_in_place::&lt;)?&lt;*web_http_server\")) | \"\\(.dur \/ 1e4 | round | . \/ 1e2)s \\(.fn)\"' \\     | head -n10 4.11s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0} 3.05s web_http_server::run::{closure#0} 1.44s core::ptr::drop_in_place::&lt;web_http_server::run::{closure#0}&gt; 0.6s &lt;web_http_server::reading_list::handle::post_login as axum::handler::Handler&lt;(axum_core::extract::private::ViaRequest, axum::extract::state::State&lt;&amp;web_http_server::reading_list::ReadingListState&gt;, axum::extract::state::State&lt;&amp;tera::tera::Tera&gt;, axum_extra::extract::cookie::CookieJar, axum::form::Form&lt;web_http_server::reading_list::handle::LoginForm&gt;), web_http_server::AppState&gt;&gt;::call::{closure#0} 0.57s web_http_server::reading_list::fetch_posts_data::{closure#0} 0.51s &lt;web_http_server::reading_list::ReadingListState&gt;::make_pool::{closure#0} 0.44s &lt;web_http_server::reading_list::ReadingListState&gt;::refresh_single::{closure#0} 0.38s &lt;web_http_server::photos::PhotosState&gt;::process_photo::{closure#0} 0.38s &lt;web_http_server::html::WriteState&gt;::process_event 0.33s core::ptr::drop_in_place::&lt;&lt;web_http_server::reading_list::ReadingListState&gt;::run_refresh::{closure#0}::{closure#0}&gt;<\/code><\/pre>\n<p>\u0427\u0430\u0441\u0442\u044c \u0441\u0430\u043c\u044b\u0445 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438.<\/p>\n<p><strong>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u043e\u0434\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u044d\u0442\u043e.<\/strong>\u00a0\u041d\u0430\u0447\u043d\u0451\u043c \u0441 <code>PhotosState::new<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u043e \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439: \u043f\u043e\u043b\u043d\u044b\u0435 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438 PhotosState::new<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl \\     | jq -r 'select(.name == \"OptFunction\") | \"\\(.dur) \\(.args.detail)\"' \\     | xargs -l bash -c 'echo \"{\\\"dur\\\":$0,\\\"fn\\\":\\\"$(rustfilt \"$1\")\\\"}\"' \\     | jq -sc 'group_by(.fn) | map({ fn: .[0].fn, dur: (map(.dur) | add) }) | sort_by(-.dur) | .[]' \\     | jq 'select(.fn | test(\"^(core::ptr::drop_in_place::&lt;)?&lt;web_http_server::photos::PhotosState&gt;::new\")) | .dur' \\     | jq -sr 'add | . \/ 1e4 | round | . \/ 1e2 | \"\\(.)s\"' 5.3s  $ cat web_http_server.llvm_timings.jsonl \\     | jq -r 'select(.name == \"OptFunction\") | \"\\(.dur) \\(.args.detail)\"' \\     | xargs -l bash -c 'echo \"{\\\"dur\\\":$0,\\\"fn\\\":\\\"$(rustfilt \"$1\")\\\"}\"' \\     | jq -sc 'group_by(.fn) | map({ fn: .[0].fn, dur: (map(.dur) | add) }) | sort_by(-.dur) | .[]' \\     | jq -r 'select(.fn | test(\"^(core::ptr::drop_in_place::&lt;)?&lt;web_http_server::photos::PhotosState&gt;::new\")) | \"\\(.dur \/ 1e4 | round | . \/ 1e2)s \\(.fn)\"' 4.11s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0} 0.27s core::ptr::drop_in_place::&lt;&lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}&gt; 0.24s core::ptr::drop_in_place::&lt;&lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#2}::{closure#0}&gt; 0.23s core::ptr::drop_in_place::&lt;&lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#2}&gt; 0.19s core::ptr::drop_in_place::&lt;&lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#6}::{closure#0}&gt; 0.11s core::ptr::drop_in_place::&lt;&lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#7}::{closure#0}&gt; 0.03s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#6}::{closure#0} 0.02s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#3} 0.02s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#11} 0.02s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#4} 0.02s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#5} 0.01s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#2} 0.01s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#7}::{closure#0} 0.01s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#2}::{closure#0} 0.01s &lt;web_http_server::photos::PhotosState&gt;::new::{closure#0}::{closure#1}::{closure#1}<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0441\u0432\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0435\u0451 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438, \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0435\u043c\u044f\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e <code>.await<\/code>, \u043d\u0430\u0434\u0435\u044f\u0441\u044c \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442 \u0442\u0438\u043f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f: \u043f\u043e\u043b\u043d\u044b\u0435 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438 photos::init<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl \\     | jq -r 'select(.name == \"OptFunction\") | \"\\(.dur) \\(.args.detail)\"'      | xargs -l bash -c 'echo \"{\\\"dur\\\":$0,\\\"fn\\\":\\\"$(rustfilt \"$1\")\\\"}\"' \\     | jq -sc 'group_by(.fn) | map({ fn: .[0].fn, dur: (map(.dur) | add) }) | sort_by(-.dur) | .[]' \\     | jq 'select(.fn | test(\"^(core::ptr::drop_in_place::&lt;)?&lt;*web_http_server::photos::(init|PhotosState&gt;::new)\")) | .dur' \\     | jq -sr 'add | . \/ 1e4 | round | . \/ 1e2 | \"\\(.)s\"' 4.66s  $ cat web_http_server.llvm_timings.jsonl \\     | jq -r 'select(.name == \"OptFunction\") | \"\\(.dur) \\(.args.detail)\"' \\     | xargs -l bash -c 'echo \"{\\\"dur\\\":$0,\\\"fn\\\":\\\"$(rustfilt \"$1\")\\\"}\"' \\     | jq -sc 'group_by(.fn) | map({ fn: .[0].fn, dur: (map(.dur) | add) }) | sort_by(-.dur) | .[]' \\     | jq -r 'select(.fn | test(\"^(core::ptr::drop_in_place::&lt;)?&lt;*web_http_server::photos::(init|PhotosState&gt;::new)\")) | \"\\(.dur \/ 1e4 | round | . \/ 1e2)s \\(.fn)\"' 3.37s web_http_server::photos::init::make_state::{closure#0} 0.24s core::ptr::drop_in_place::&lt;web_http_server::photos::init::image_process_futs::{closure#0}::{closure#0}&gt; 0.21s core::ptr::drop_in_place::&lt;web_http_server::photos::init::album_process_futs::{closure#0}&gt; 0.21s core::ptr::drop_in_place::&lt;web_http_server::photos::init::make_state::{closure#0}&gt; 0.16s core::ptr::drop_in_place::&lt;web_http_server::photos::init::image_process_futs::{closure#0}&gt; 0.12s core::ptr::drop_in_place::&lt;web_http_server::photos::init::album_process_futs::{closure#1}&gt; 0.06s web_http_server::photos::init::album_process_futs::{closure#0} 0.04s web_http_server::photos::init::image_process_futs::{closure#0} 0.03s web_http_server::photos::init::album_process_futs::{closure#1} 0.03s web_http_server::photos::init::album_process_futs 0.02s core::ptr::drop_in_place::&lt;web_http_server::photos::init::get_img_candidates::{closure#0}&gt; 0.02s web_http_server::photos::init::make_album_membership 0.02s web_http_server::photos::init::make_state::{closure#0}::{closure#1} 0.02s web_http_server::photos::init::make_albums_in_order 0.02s web_http_server::photos::init::image_process_futs 0.02s web_http_server::photos::init::make_state::{closure#0}::{closure#3} 0.02s web_http_server::photos::init::make_state::{closure#0}::{closure#2} 0.02s web_http_server::photos::init::image_process_futs::{closure#0}::{closure#0} 0.02s web_http_server::photos::init::make_state::{closure#0}::{closure#7} 0.01s web_http_server::photos::init::make_all_album 0.01s web_http_server::photos::init::make_recently_published_albums 0.01s web_http_server::photos::init::make_images_by_time 0s web_http_server::photos::init::get_img_candidates::{closure#0}::{closure#1}::{closure#1}<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u043e, \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043d\u0438\u0437\u0438\u043b\u043e\u0441\u044c \u0441 5,3 \u0441 \u0434\u043e 4,7 \u0441.<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u0437\u0430\u0442\u0435\u043c \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 <code>.await<\/code> \u0432 \u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u043d\u0438\u0437\u0438\u0432 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441 10 \u0434\u043e 3.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0441\u043b\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 .await<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl \\     | jq -r 'select(.name == \"OptFunction\") | \"\\(.dur) \\(.args.detail)\"'      | xargs -l bash -c 'echo \"{\\\"dur\\\":$0,\\\"fn\\\":\\\"$(rustfilt \"$1\")\\\"}\"' \\     | jq -sc 'group_by(.fn) | map({ fn: .[0].fn, dur: (map(.dur) | add) }) | sort_by(-.dur) | .[]' \\     | jq 'select(.fn | test(\"^(core::ptr::drop_in_place::&lt;)?&lt;*web_http_server::photos::(init|PhotosState&gt;::new)\")) | .dur' \\     | jq -sr 'add | . \/ 1e4 | round | . \/ 1e2 | \"\\(.)s\"' 6.24s  $ cat web_http_server.llvm_timings.jsonl \\     | jq -r 'select(.name == \"OptFunction\") | \"\\(.dur) \\(.args.detail)\"' \\     | xargs -l bash -c 'echo \"{\\\"dur\\\":$0,\\\"fn\\\":\\\"$(rustfilt \"$1\")\\\"}\"' \\     | jq -sc 'group_by(.fn) | map({ fn: .[0].fn, dur: (map(.dur) | add) }) | sort_by(-.dur) | .[]' \\     | jq -r 'select(.fn | test(\"^(core::ptr::drop_in_place::&lt;)?&lt;*web_http_server::photos::(init|PhotosState&gt;::new)\")) | \"\\(.dur \/ 1e4 | round | . \/ 1e2)s \\(.fn)\"' 2.7s web_http_server::photos::init::process_all_images::{closure#0} 1.93s web_http_server::photos::init::make_state::{closure#0} 0.25s core::ptr::drop_in_place::&lt;web_http_server::photos::init::image_process_futs::{closure#0}::{closure#0}&gt; 0.25s core::ptr::drop_in_place::&lt;web_http_server::photos::init::album_process_futs::{closure#0}&gt; 0.18s core::ptr::drop_in_place::&lt;web_http_server::photos::init::image_process_futs::{closure#0}&gt; 0.14s core::ptr::drop_in_place::&lt;web_http_server::photos::init::album_process_futs::{closure#1}&gt; 0.09s core::ptr::drop_in_place::&lt;web_http_server::photos::init::process_all_images::{closure#0}&gt; 0.08s core::ptr::drop_in_place::&lt;web_http_server::photos::init::join_image_futs&lt;web_http_server::photos::init::image_process_futs::{closure#0}&gt;::{closure#0}&gt; 0.07s core::ptr::drop_in_place::&lt;web_http_server::photos::init::make_state::{closure#0}&gt; 0.07s web_http_server::photos::init::album_process_futs::{closure#0} 0.06s core::ptr::drop_in_place::&lt;web_http_server::photos::init::parse::{closure#0}&gt; 0.04s core::ptr::drop_in_place::&lt;web_http_server::photos::init::join_album_futs::{closure#0}&gt; 0.04s web_http_server::photos::init::image_process_futs::{closure#0} 0.03s web_http_server::photos::init::album_process_futs 0.03s web_http_server::photos::init::make_album_membership 0.03s core::ptr::drop_in_place::&lt;web_http_server::photos::init::get_img_candidates::{closure#0}&gt; 0.03s web_http_server::photos::init::album_process_futs::{closure#1} 0.03s web_http_server::photos::init::make_albums_in_order 0.03s web_http_server::photos::init::image_process_futs 0.02s web_http_server::photos::init::process_all_images::{closure#0}::{closure#1} 0.02s web_http_server::photos::init::make_state::{closure#0}::{closure#0} 0.02s web_http_server::photos::init::make_state::{closure#0}::{closure#1} 0.02s web_http_server::photos::init::process_all_images::{closure#0}::{closure#2} 0.02s web_http_server::photos::init::image_process_futs::{closure#0}::{closure#0} 0.02s web_http_server::photos::init::make_all_album 0.01s web_http_server::photos::init::make_images_by_time 0.01s web_http_server::photos::init::make_recently_published_albums 0s web_http_server::photos::init::get_img_candidates::{closure#0}::{closure#1}::{closure#1}<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u043e \u0432\u0441\u0451 \u0441\u0442\u0430\u043b\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435! \u0412\u0440\u0435\u043c\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u0441 4,66 \u0441 \u0434\u043e 6,24 \u0441!<\/p>\n<hr\/>\n<p>\u041d\u0430\u0447\u0430\u043b\u043e \u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441 async-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0442\u043e-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435. \u0418\u043d\u0430\u0447\u0435 \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0443\u0445\u0443\u0434\u0448\u0430\u043b\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e?<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 async-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0442 \u0441\u0430\u0445\u0430\u0440\u0430, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0442\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c <code>Future<\/code>\u00a0\u0432 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0440\u0435\u0439\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0440\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0437\u0430 \u043d\u0438\u043c (\u043e\u0431\u044b\u0447\u043d\u043e <code>Pin&lt;Box&lt;dyn Future&gt;&gt;<\/code>).<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"rust\">fn erase&lt;'a, T&gt;(     fut: impl 'a + Send + Future&lt;Output = T&gt;, ) -&gt; Pin&lt;Box&lt;dyn 'a + Send + Future&lt;Output = T&gt;&gt;&gt; {     Box::pin(fut) }<\/code><\/pre>\n<p>\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0451 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f <code>.await<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"rust\">\/\/ \u0441\u0442\u0430\u0440\u043e\u0435: let candidates = get_img_candidates().await?;  \/\/ \u043d\u043e\u0432\u043e\u0435: let candidates = erase(get_img_candidates()).await?;<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435:\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c Pin&gt;\u00a0future<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"powershell\">$ cat web_http_server.llvm_timings.jsonl \\     | jq -r 'select(.name == \"OptFunction\") | \"\\(.dur) \\(.args.detail)\"'      | xargs -l bash -c 'echo \"{\\\"dur\\\":$0,\\\"fn\\\":\\\"$(rustfilt \"$1\")\\\"}\"' \\     | jq -sc 'group_by(.fn) | map({ fn: .[0].fn, dur: (map(.dur) | add) }) | sort_by(-.dur) | .[]' \\     | jq 'select(.fn | test(\"^(core::ptr::drop_in_place::&lt;)?&lt;*web_http_server::photos::(init|PhotosState&gt;::new)\")) | .dur' \\     | jq -sr 'add | . \/ 1e4 | round | . \/ 1e2 | \"\\(.)s\"' 2.14s  $ cat web_http_server.llvm_timings.jsonl \\     | jq -r 'select(.name == \"OptFunction\") | \"\\(.dur) \\(.args.detail)\"' \\     | xargs -l bash -c 'echo \"{\\\"dur\\\":$0,\\\"fn\\\":\\\"$(rustfilt \"$1\")\\\"}\"' \\     | jq -sc 'group_by(.fn) | map({ fn: .[0].fn, dur: (map(.dur) | add) }) | sort_by(-.dur) | .[]' \\     | jq -r 'select(.fn | test(\"^(core::ptr::drop_in_place::&lt;)?&lt;*web_http_server::photos::(init|PhotosState&gt;::new)\")) | \"\\(.dur \/ 1e4 | round | . \/ 1e2)s \\(.fn)\"' 0.25s web_http_server::photos::init::process_all_images::{closure#0} 0.21s core::ptr::drop_in_place::&lt;web_http_server::photos::init::image_process_futs::{closure#0}::{closure#0}&gt; 0.2s core::ptr::drop_in_place::&lt;web_http_server::photos::init::image_process_futs::{closure#0}&gt; 0.2s web_http_server::photos::init::join_image_futs::&lt;web_http_server::photos::init::image_process_futs::{closure#0}&gt;::{closure#0} 0.19s core::ptr::drop_in_place::&lt;web_http_server::photos::init::album_process_futs::{closure#0}&gt; 0.13s web_http_server::photos::init::parse::{closure#0} 0.11s core::ptr::drop_in_place::&lt;web_http_server::photos::init::album_process_futs::{closure#1}&gt; 0.1s web_http_server::photos::init::get_img_candidates::{closure#0} 0.1s core::ptr::drop_in_place::&lt;web_http_server::photos::init::make_state::{closure#0}&gt; 0.06s core::ptr::drop_in_place::&lt;web_http_server::photos::init::process_all_images::{closure#0}&gt; 0.06s web_http_server::photos::init::album_process_futs::{closure#0} 0.06s web_http_server::photos::init::album_process_futs 0.05s web_http_server::photos::init::join_album_futs::{closure#0} 0.05s web_http_server::photos::init::make_albums_in_order 0.05s core::ptr::drop_in_place::&lt;web_http_server::photos::init::join_image_futs&lt;web_http_server::photos::init::image_process_futs::{closure#0}&gt;::{closure#0}&gt; 0.04s core::ptr::drop_in_place::&lt;web_http_server::photos::init::parse::{closure#0}&gt; 0.03s web_http_server::photos::init::image_process_futs::{closure#0} 0.03s web_http_server::photos::init::make_all_album 0.03s web_http_server::photos::init::album_process_futs::{closure#1} 0.02s core::ptr::drop_in_place::&lt;web_http_server::photos::init::join_album_futs::{closure#0}&gt; 0.02s core::ptr::drop_in_place::&lt;web_http_server::photos::init::get_img_candidates::{closure#0}&gt; 0.02s web_http_server::photos::init::make_state::{closure#0}::{closure#1} 0.02s web_http_server::photos::init::make_state::{closure#0}::{closure#0} 0.02s web_http_server::photos::init::make_recently_published_albums 0.02s web_http_server::photos::init::image_process_futs::{closure#0}::{closure#0} 0.01s web_http_server::photos::init::make_images_by_time 0.01s web_http_server::photos::init::erase::&lt;core::result::Result&lt;std::collections::hash::map::HashMap&lt;alloc::string::String, &amp;web_http_server::photos::Album&gt;, eyre::Report&gt;, web_http_server::photos::init::join_album_futs::{closure#0}&gt; 0.01s web_http_server::photos::init::erase::&lt;core::result::Result&lt;web_http_server::photos::init::ProcessedImages, eyre::Report&gt;, web_http_server::photos::init::process_all_images::{closure#0}&gt; 0.01s web_http_server::photos::init::erase::&lt;core::result::Result&lt;(web_http_server::photos::MapSettings, web_http_server::photos::FlexGridSettings, web_http_server::photos::parsed::HiddenAlbumsAndPhotos, web_http_server::photos::parsed::Albums), eyre::Report&gt;, web_http_server::photos::init::parse::{closure#0}&gt; 0.01s web_http_server::photos::init::process_all_images::{closure#0}::{closure#1} 0.01s web_http_server::photos::init::process_all_images::{closure#0}::{closure#2} 0.01s web_http_server::photos::init::make_state 0.01s web_http_server::photos::init::get_img_candidates::{closure#0}::{closure#1}::{closure#1}<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u2014 \u0432\u0440\u0435\u043c\u044f \u0441\u043d\u0438\u0437\u0438\u043b\u043e\u0441\u044c \u0434\u043e 2,14 \u0441.<\/strong><\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043e\u0442 5,3 \u0441 \u0434\u043e 2,14 \u0441 \u2014 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441, \u0445\u043e\u0442\u044c \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0432\u0448\u0438\u0439 \u043a\u0443\u0447\u0438 \u0443\u0441\u0438\u043b\u0438\u0439. (\u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u044f \u043e\u0431\u0451\u0440\u0442\u044b\u0432\u0430\u043b future \u0432 <code>Box::pin<\/code>\u00a0\u0432\u043c\u0435\u0441\u0442\u043e \u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e).<\/p>\n<p>\u0417\u0430\u043d\u043e\u0432\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u0431\u0435\u0437 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0431\u0449\u0435\u0435 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441 48,8 \u0441 \u0434\u043e 46,8 \u0441. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e, \u043d\u043e \u043c\u044b \u0432\u0435\u0434\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e!<\/p>\n<p><em>(\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0430 \u043a\u0430\u043a \u043d\u0430\u0441\u0447\u0451\u0442 <\/em><code><em>#[inline(never)]<\/em><\/code><em>? \u042f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0441 \u043d\u0438\u043c \u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u2013 \u043f\u043e\u0441\u043b\u0435 box \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043b\u0443\u0447\u0448\u0435, \u043d\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043e\u0442 \u0447\u0435\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438 LLVM.)<\/em><\/p>\n<p><em>(\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0430 \u043a\u0430\u043a \u043d\u0430\u0441\u0447\u0451\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f <\/em><strong><em>poll<\/em><\/strong><em>-\u0444\u0443\u043d\u043a\u0446\u0438\u0439? \u042f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c async-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <\/em><code><em>Future<\/em><\/code><em>, \u0443\u043a\u0430\u0437\u0430\u0432 <\/em><code><em>#[inline(never)]<\/em><\/code><em>\u00a0\u0434\u043b\u044f \u0435\u0451 poll-\u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u042d\u0442\u043e <\/em><strong><em>\u043d\u0435\u043c\u043d\u043e\u0433\u043e<\/em><\/strong><em> \u043f\u043e\u043c\u043e\u0433\u043b\u043e, \u043d\u043e \u043d\u0435 \u0442\u0430\u043a \u0441\u0438\u043b\u044c\u043d\u043e, \u043a\u0430\u043a box).<\/em><\/p>\n<h3>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435<\/h3>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c:<\/p>\n<ol>\n<li>\n<p>\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 LLVM;<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u0440\u0435\u0439\u0442\u0435; <\/p>\n<\/li>\n<li>\n<p>\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438 \u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u0440\u0435\u0439\u0442\u0435<\/p>\n<\/li>\n<\/ol>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u043c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Dockerfile \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"powershell\">RUN RUSTFLAGS='-Cllvm-args=-inline-threshold=10 -Cllvm-args=-inlinedefault-threshold=10 -Cllvm-args=-inlinehint-threshold=10' \\         cargo chef cook --release --target=x86_64-unknown-linux-musl --recipe-path=\/workdir\/recipe.json  ...  RUN RUSTFLAGS='-Cllvm-args=-inline-threshold=10 -Cllvm-args=-inlinedefault-threshold=10 -Cllvm-args=-inlinehint-threshold=10' \\         cargo build --timings --release --target=x86_64-unknown-linux-musl --package web-http-server<\/code><\/pre>\n<p>&#8230; \u0438 \u0432\u043d\u0435\u0441\u0451\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u0440\u0435\u0439\u0442:<\/p>\n<pre><code class=\"powershell\">$ git diff --stat base..HEAD -- web-http-server ...  10 files changed, 898 insertions(+), 657 deletions(-)<\/code><\/pre>\n<p>&#8230; \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0435 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u043c:\u00a0<a href=\"https:\/\/github.com\/pulldown-cmark\/pulldown-cmark\/pull\/1045\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/pulldown-cmark\/pulldown-cmark\/pull\/1045<\/a><\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0435\u0440\u0451\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u0440\u0435\u0439\u0442 \u0441 \u043d\u0435 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0430\u043c\u0438:\u00a0<a href=\"https:\/\/github.com\/LukeMathWalker\/cargo-chef\/pull\/309\" rel=\"noopener noreferrer nofollow\">\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 cargo-chef<\/a>, \u0441 \u043d\u043e\u0432\u044b\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u0440\u0435\u0439\u0442\u043e\u043c, \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 API \u0431\u0435\u0437 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0438\u0437 <code>lol_html<\/code>\u00a0\u0438 <code>deadpool_postgres<\/code><\/p>\n<\/li>\n<\/ul>\n<p>&#8230; \u0447\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u043d\u0430\u043c \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 <strong>32,3 \u0441<\/strong>.<\/p>\n<hr\/>\n<h3>\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044f \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u044d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442, \u043f\u0430\u0440\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 Bluesky \u0434\u0430\u043b\u0430 \u043c\u043d\u0435 \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0441\u043e\u0432\u0435\u0442\u044b!<\/p>\n<ol>\n<li>\n<p>\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c <code>-Zshare-generics<\/code>; \u0438<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c Alpine<\/p>\n<\/li>\n<\/ol>\n<h4>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c -Zshare-generics<\/h4>\n<p>\u041f\u0451\u0442\u0440 \u041e\u0441\u0435\u0432\u0438\u0447 \u0441 Bluesky\u00a0<a href=\"https:\/\/bsky.app\/profile\/osiewicz.bsky.social\/post\/3lsjiadbh4s27\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c <code>-Zshare-generics<\/code><\/a>:<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043d\u043e\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432 \u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043a\u0440\u0435\u0439\u0442\u0430. \u0424\u043b\u0430\u0433 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0451\u043d \u0432 \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043a\u0430\u0445 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>[ &#8230; ]<\/p>\n<p>\u0424\u043b\u0430\u0433 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0432 nightly-\u0441\u0431\u043e\u0440\u043a\u0430\u0445, \u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0451\u043d \u0434\u043b\u044f dev-\u0441\u0431\u043e\u0440\u043e\u043a \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0443\u043b\u0447\u0435\u0439\u043d\u0430.<\/p>\n<\/blockquote>\n<p>\u0417\u0432\u0443\u0447\u0438\u0442 \u043d\u0435\u043f\u043b\u043e\u0445\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0435\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c!<\/p>\n<pre><code class=\"powershell\">RUSTFLAGS=\"-Zshare-generics -Cllvm-args=-inline-threshold=10 -Cllvm-args=-inlinedefault-threshold=10 -Cllvm-args=-inlinehint-threshold=10\" ...<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u0435\u043d \u2014\u00a0<strong>\u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441 32,3 \u0441 \u0434\u043e 29,1 \u0441<\/strong>, \u0434\u0430\u0436\u0435 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 <code>core::ptr::drop_in_place<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435, \u0432\u0441\u0451 \u0435\u0449\u0451 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442.<\/p>\n<p>\u0412 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0441\u0430\u043c\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e <code>drop_in_place<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043a\u0440\u0435\u0439\u0442\u0430\u043c\u0438:<\/p>\n<pre><code class=\"powershell\">$ # Before $ cat ... | jq ... \\     | grep -P 'core::ptr::drop_in_place::&lt;(?!web_http_server)[a-zA-Z0-9_:]+&gt;$' \\     | head -n5 0.42s core::ptr::drop_in_place::&lt;tracing_subscriber::filter::directive::ParseError&gt; 0.13s core::ptr::drop_in_place::&lt;http::uri::Uri&gt; 0.12s core::ptr::drop_in_place::&lt;toml_edit::item::Item&gt; 0.11s core::ptr::drop_in_place::&lt;std::io::error::Error&gt; 0.1s core::ptr::drop_in_place::&lt;hyper::body::incoming::Incoming&gt;  $ # After $ cat ... | jq ... \\     | grep -P 'core::ptr::drop_in_place::&lt;(?!web_http_server)[a-zA-Z0-9_:]+&gt;$' \\     | head -n5 0.59s core::ptr::drop_in_place::&lt;hyper::ext::Protocol&gt; 0.28s core::ptr::drop_in_place::&lt;http::header::map::HeaderMap&gt; 0.1s core::ptr::drop_in_place::&lt;std::io::error::Error&gt; 0.09s core::ptr::drop_in_place::&lt;http::uri::Uri&gt; 0.08s core::ptr::drop_in_place::&lt;tokio::runtime::io::registration::Registration&gt;<\/code><\/pre>\n<p>\u041c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043d\u043e \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0442\u043e\u0433\u043e \u0436\u0435 <code>core::ptr::drop_in_place<\/code>!<\/p>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u044d\u0442\u043e, \u0432\u0440\u0435\u043c\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043d\u0438\u0437\u0438\u043b\u043e\u0441\u044c \u2014 \u0435\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b <code>drop_in_place<\/code>, \u0442\u043e \u0441 21,7 \u0441 \u0434\u043e 17,4 \u0441, \u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0435\u0441\u043b\u0438 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435 (\u0441 128 \u0441 \u0434\u043e 104 \u0441; \u043f\u0440\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441 \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u043e\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f LLVM).<\/p>\n<h4>\u0423\u0445\u043e\u0434\u0438\u043c \u0441 Alpine<\/h4>\n<p>\u0423\u044d\u0441\u043b\u0438 \u041c\u0443\u0440 \u0432 Lobsters (<a href=\"https:\/\/bsky.app\/profile\/wezm.net\/post\/3lskc72tz2s24\" rel=\"noopener noreferrer nofollow\">\u0447\u0435\u0440\u0435\u0437 Bluesky<\/a>)\u00a0<a href=\"https:\/\/lobste.rs\/s\/72hbqg\/why_is_rust_compiler_so_slow#c_oah8c1\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0443\u0439\u0442\u0438 \u0441 Alpine<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 \u043d\u0451\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<blockquote>\n<p>\u041f\u043e \u043c\u043e\u0435\u043c\u0443 \u043e\u043f\u044b\u0442\u0443, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 Chimera Linux \u043f\u0435\u0440\u0435\u0448\u0451\u043b \u0441\u043e scudo (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0431\u044b\u043b \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043f\u0430\u043c\u044f\u0442\u0438 musl) \u043d\u0430 mimalloc, \u0432\u0440\u0435\u043c\u044f \u0447\u0438\u0441\u0442\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 Gleam \u0441\u043d\u0438\u0437\u0438\u043b\u043e\u0441\u044c \u0441 67 \u0441 \u0434\u043e 46 \u0441.<\/p>\n<p>\u0421\u0445\u043e\u0436\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c, \u0441\u043c\u0435\u043d\u0438\u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 docker [ &#8230; ]<\/p>\n<\/blockquote>\n<p><strong>\u042d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c.<\/strong><\/p>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u044f \u0441 alpine \u043d\u0430 debian \u0438 \u0443\u0431\u0440\u0430\u0432 <code>--target=x86_64-unknown-linux-musl<\/code>, \u044f \u0441\u043d\u0438\u0437\u0438\u043b \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441 29,1 \u0441 \u0430\u0436 \u0434\u043e 9,1 \u0441!<\/p>\n<h3>\u041f\u043e\u0434\u0432\u0435\u0434\u0451\u043c \u0438\u0442\u043e\u0433<\/h3>\n<ol>\n<li>\n<p>\u041c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441 175 \u0441<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0432 LTO (\u0438 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b!), \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 51 \u0441 (-71%)<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u044f \u043d\u0430 <code>opt-level = 1<\/code>\u00a0\u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0440\u0435\u0439\u0442\u0430, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 48,8 \u0441 (-4%)<\/p>\n<\/li>\n<li>\n<p>\u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0432 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>-C llvm-args<\/code>, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 40,7 \u0441 (-16%)<\/p>\n<\/li>\n<li>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0438 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f 37,7 \u0441 (-7%)<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445 \u0434\u0430\u043b\u0438 \u043d\u0430\u043c 32,3 \u0441 (-14%)<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u0421 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438:<\/strong><\/p>\n<ol start=\"7\">\n<li>\n<p>\u0412\u043a\u043b\u044e\u0447\u0438\u0432 <code>-Zshare-generics<\/code>, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 29,1 \u0441 (-10%)<\/p>\n<\/li>\n<li>\n<p>\u0410 \u0443\u0439\u0434\u044f \u0441 alpine, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 9,1 \u0441 (-69%)<\/p>\n<\/li>\n<\/ol>\n<h4>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435?<\/h4>\n<p>\u0425\u043e\u0442\u044c \u044f \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e, \u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0441 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u044b\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0441\u043c\u043e\u0433 \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 \u0441\u0432\u043e\u044e \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443.<\/p>\n<p>\u0427\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u043a\u043e: \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0431\u0430\u0433\u043e\u0432, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043f\u043e\u043f\u0430\u0432\u0448\u0435\u043c\u0443 \u0432 \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>\u0421 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432\u0441\u0451 \u0431\u044b\u043b\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435:<\/p>\n<ul>\n<li>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0433\u0440\u0430\u0444\u043e\u0432 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 async-\u0444\u0443\u043d\u043a\u0446\u0438\u0439: \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443 LLVM \u0435\u0441\u0442\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0439 \u043f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0433\u043a\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 <code>rustc<\/code>; \u0430 \u043c\u043e\u0436\u0435\u0442, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043b\u043e\u0445\u0430\u044f \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, <code>rustc<\/code>\u00a0<em>\u0441\u0442\u043e\u0438\u0442 <\/em>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0434\u043b\u044f <code>core::ptr::drop_in_place&lt;T&gt;<\/code>\u00a0, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u043a\u0440\u0435\u0439\u0442, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 <code>T<\/code>. \u0422\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043d\u0435 \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432), \u0437\u0430\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0435\u043c\u0443 \u0434\u0430\u0443\u043d\u0441\u0442\u0440\u0438\u043c-\u043a\u0440\u0435\u0439\u0442\u0430\u043c \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437.<\/p>\n<ul>\n<li>\n<p><strong>\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435:<\/strong>\u00a0<code>-Zshare-generics<\/code>\u00a0\u0437\u0434\u0435\u0441\u044c <em>\u043f\u043e\u043c\u043e\u0433<\/em>, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e <a href=\"https:\/\/github.com\/rust-lang\/rust\/issues\/84175\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e \u0443\u0436\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u043e\u0441\u044c<\/a> \u0438, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0445\u043e\u0436\u0435,\u00a0<a href=\"https:\/\/github.com\/rust-lang\/rust\/pull\/108838#issuecomment-1471619165\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/a>\u00a0\u0438\u0437-\u0437\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u043e drop-\u043a\u043b\u0435\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0431\u044b. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0432 \u0443\u0449\u0435\u0440\u0431 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c), \u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0431\u044b\u043b \u0431\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043c\u043e\u0433 \u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u0441 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0435\u0439 \u0442\u0435\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 (\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043f\u043e \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c), \u043d\u043e \u044d\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0447\u0435\u043c \u043c\u043e\u0439 \u043f\u043e\u0441\u0442.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0410 \u043f\u043e\u043a\u0430 \u0432\u0430\u043c \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043e\u0439\u0442\u0438 <\/strong><code><strong>opt-level = 0<\/strong><\/code><strong>!<\/strong><\/p>\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\/922534\/\"> https:\/\/habr.com\/ru\/articles\/922534\/<\/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>\u042f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043c\u0435\u0441\u044f\u0446 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 \u0432 Docker \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0433\u043e\u0442\u043e\u0432 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0443\u0436\u0430\u0441\u043d\u044b\u043c\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<\/p>\n<p>\u041c\u043e\u0439 <a href=\"https:\/\/sharnoff.io\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0435\u0431-\u0441\u0430\u0439\u0442<\/a> (\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u044b\u043b\u0430 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0430 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f) \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c Rust. \u041e\u043d \u0441\u0442\u0430\u043b <em>\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u044b\u043c<\/em>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u044f \u0434\u043e\u043b\u0436\u0435\u043d:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 (\u0441 <code>--target=x86_64-unknown-linux-musl<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0431-\u0441\u0430\u0439\u0442<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043c\u044f\u0433\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 (\u0431\u0443\u0434\u044c \u0442\u043e Docker, Kubernetes \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u043e\u0435), \u0432 \u0434\u0443\u0445\u0435 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u041f\u041e, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u043b\u0435\u0442.<\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 Rust \u0441 Docker \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<h3>\u041e\u0441\u043d\u043e\u0432\u044b: Rust \u0432 Docker<\/h3>\n<h4>Rust \u0432 Docker: \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 Rust \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0443\u044e \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0443:<\/p>\n<pre><code class=\"powershell\">FROM rust:1.87-alpine3.22 AS builder  RUN apk add musl-dev  WORKDIR \/workdir COPY . .  # \"package\" \u0434\u043b\u044f \u043c\u043e\u0435\u0433\u043e \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u0430 - \u044d\u0442\u043e \"web-http-server\". RUN cargo build --package web-http-server --target=x86_64-unknown-linux-musl  # \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b FROM alpine:3.20 COPY --from=builder \/workdir\/target\/x86_64-unknown-linux-musl\/release\/web-http-server \/usr\/bin\/web-http-server  ENTRYPOINT [\"\/usr\/bin\/web-http-server\"]<\/code><\/pre>\n<p><strong>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043b\u044e\u0431\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0441\u0451 \u0441 \u043d\u0443\u043b\u044f<\/strong>.<\/p>\n<p>\u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u0431\u043e\u0440\u043a\u0430 \u0441 \u043d\u0443\u043b\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 4 \u043c\u0438\u043d\u0443\u0442\u044b (\u0432\u043a\u043b\u044e\u0447\u0430\u044f 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043a\u0440\u0435\u0439\u0442\u043e\u0432).<\/p>\n<pre><code class=\"powershell\">$ cargo build --release --target=x86_64-unknown-linux-musl --package web-http-server     Updating crates.io index  Downloading crates ...   Downloaded anstream v0.6.18   Downloaded http-body v1.0.1  ... \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u043a ...     Compiling web-http-server v0.1.0 (\/workdir\/web-http-server)     Finished `release` profile [optimized + debuginfo] target(s) in 3m 51s<\/code><\/pre>\n<p>\u0414\u0430, \u043c\u043e\u0433\u043b\u043e \u0431\u044b\u0442\u044c \u0438 \u0445\u0443\u0436\u0435. \u041d\u043e \u044f-\u0442\u043e \u043f\u0440\u0438\u0432\u044b\u043a \u043a \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0431\u043e\u0440\u043a\u0430\u043c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u042f \u043d\u0435 \u0445\u043e\u0447\u0443 \u0436\u0434\u0430\u0442\u044c \u0442\u0430\u043a \u0434\u043e\u043b\u0433\u043e \u043f\u0440\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0438 \u043c\u0430\u043b\u0435\u0439\u0448\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439!<\/p>\n<h4>Rust \u0432 Docker \u0441 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u043c \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c<\/h4>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u043c\u043e\u0447\u044c!<\/p>\n<p><a href=\"https:\/\/github.com\/LukeMathWalker\/cargo-chef\" rel=\"noopener noreferrer nofollow\"><code>cargo-chef<\/code><\/a>\u00a0\u041b\u0443\u043a\u0438 \u041f\u0430\u043b\u043c\u0438\u0435\u0440\u0438 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0432\u0441\u0435\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0432 \u043a\u044d\u0448\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 Docker, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u0438 \u043a \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b (\u043d\u043e \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439).<\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432 <a href=\"https:\/\/lpalmieri.com\/posts\/fast-rust-docker-builds\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u0442\u0435 \u041b\u0443\u043a\u0438<\/a>, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u0442\u043e <code>cargo-chef<\/code>\u00a0\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u00ab\u0440\u0435\u0446\u0435\u043f\u0442\u0430\u00bb \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u00ab\u0438\u0441\u043f\u0435\u0447\u044c\u00bb, \u0447\u0442\u043e\u0431\u044b \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u0445 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041c\u043e\u0439 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442 \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e <em>\u0434\u043e\u043b\u0436\u043d\u043e<\/em> \u043f\u043e\u043c\u043e\u0447\u044c!<\/p>\n<pre><code class=\"powershell\">...  FROM ... AS planner COPY . . RUN cargo chef prepare --recipe-path=\/workdir\/recipe.json  FROM ... AS cooker # \u041f\u0420\u0418\u041c\u0415\u0427\u0410\u041d\u0418\u0415: \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0442\u043e\u0433\u043e \u0436\u0435 \"\u0440\u0435\u0446\u0435\u043f\u0442\u0430\", # \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u0441\u0431\u043e\u0440\u043a\u0438. COPY --from=planner \/workdir\/recipe.json recipe.json RUN cargo chef cook --release --recipe-path=\/workdir\/recipe.json \\     --target=x86_64-unknown-linux-musl  # \u0415\u0441\u043b\u0438 recipe.json \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f, \u0442\u043e 'cooker' \u0431\u0443\u0434\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d. # \u041e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. FROM cooker AS builder COPY . . RUN cargo build --release --package web-http-server \\     --target=x86_64-unknown-linux-musl<\/code><\/pre>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0440\u043e\u0441\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435 \u0442\u0430\u043a\u0438\u043c, \u043a\u0430\u043a \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u043b\u0438 \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"powershell\">$ # \u041f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 $ cargo chef cook --release ...     Updating crates.io index  Downloading crates ...  ...    Compiling web-http-server v0.0.1 (\/workdir\/web-http-server)     Finished `release` profile [optimized + debuginfo] target(s) in 1m 07s  $ # \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 $ cargo build --release ...    Compiling web-http-server v0.1.0 (\/workdir\/web-http-server)     Finished `release` profile [optimized + debuginfo] target(s) in 2m 50s<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e 25% \u0432\u0440\u0435\u043c\u0435\u043d\u0438! \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u043c\u043e\u0439 \u043a\u043e\u0434 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e. \u041e\u043d \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0438\u0437 \u0441\u0435\u043c\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u043a\u043b\u0435\u044f, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>axum<\/code>,\u00a0<code>reqwest<\/code> \u0438\u00a0<code>tokio-postgres<\/code>).<\/p>\n<p><em>(\u0427\u0442\u043e\u0431\u044b \u0435\u0449\u0451 \u0440\u0430\u0437 \u0432\u0441\u0451 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c <\/em><code><em>cargo build<\/em><\/code><em>\u00a0\u0441 <\/em><code><em>--verbose<\/em><\/code><em>. \u041f\u043e\u0447\u0442\u0438 3 \u043c\u0438\u043d\u0443\u0442\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <\/em><code><em>rustc<\/em><\/code><em>!)<\/em><\/p>\n<h3>\u0427\u0442\u043e rustc\u00a0\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f?<\/h3>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438\u0437 <a href=\"https:\/\/fasterthanli.me\/articles\/why-is-my-rust-build-so-slow\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 fasterthanlime<\/a>, \u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <code>cargo --timings<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"powershell\">$ cargo build --release --timings ...    Compiling web-http-server v0.1.0 (\/workdir\/web-http-server)       Timing report saved to \/workdir\/target\/cargo-timings\/cargo-timing-20250607T192029.207407545Z.html     Finished `release` profile [optimized + debuginfo] target(s) in 2m 54s<\/code><\/pre>\n<p>\u041d\u0430\u0440\u044f\u0434\u0443 \u0441 \u0444\u0430\u0439\u043b\u043e\u043c <code>cargo-timing-&lt;timestamp&gt;.html<\/code>\u00a0\u0435\u0441\u0442\u044c \u0438 \u0444\u0430\u0439\u043b <code>cargo-timing.html<\/code>. \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e:<\/p>\n<pre><code class=\"powershell\">...  FROM cooker AS builder COPY . . RUN cargo build --timings --release --target=x86_64-unknown-linux-musl --package web-http-server # \u041d\u041e\u0412\u041e\u0415: \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438 cargo \u0432 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 RUN mv target\/cargo-timings\/cargo-timing-*.html cargo-timing.html  FROM alpine:3.22 COPY --from=builder \/workdir\/target\/x86_64-unknown-linux-musl\/release\/web-http-server \/usr\/bin\/web-http-server # \u041d\u041e\u0412\u041e\u0415: \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 COPY --from=builder \/workdir\/cargo-timing.html cargo-timing.html<\/code><\/pre>\n<p>\u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u043e\u0437\u0438\u0432\u0448\u0438\u0441\u044c \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c&#8230;<\/p>\n<pre><code class=\"powershell\">id=\"$(docker container create &lt;IMAGE&gt;)\" docker cp \"$id:\/cargo-timing.html\" cargo-timing.html docker container rm -f \"$id\"<\/code><\/pre>\n<p>&#8230; \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0436\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p><em>\u041e\u0439.<\/em>\u00a0\u041d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438!<\/p>\n<h4>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442?<\/h4>\n<p><code>cargo build --timings<\/code>\u00a0\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, <em>\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0440\u0435\u0439\u0442\u0430<\/em>. \u041d\u043e \u043d\u0430\u0441 \u0432\u043e\u043b\u043d\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0440\u0435\u0439\u0442\u0430!<\/p>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0435 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0431\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b, \u0438\u043b\u0438\u00a0\u043d\u0430\u043c\u00a0\u0431\u044b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0438\u0441\u043a\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 <code>cargo build<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438 <code>cargo<\/code> \u043f\u043e\u0437\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442 \u043d\u0430\u043c \u0442\u043e\u0447\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c: \u0432 \u043e\u0442\u0447\u0451\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 174,1 \u0441, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 2 \u043c\u0438\u043d\u0443\u0442\u0430\u043c 54 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 <code>cargo build<\/code>.<\/p>\n<h3>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043f\u0440\u043e\u0441\u0438\u043c \u0441\u0430\u043c rustc<\/h3>\n<p>\u0412 \u043f\u043e\u0441\u0442\u0435 fasterthanlime \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u043e\u0432\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u2014\u00a0\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0444\u0438\u0447\u0438 \u0441\u0430\u043c\u043e\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <code>rustc<\/code> \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u043b\u0430\u0433\u0430 <code>-Zself-profile<\/code>.<\/p>\n<p>\u0412 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"powershell\">RUSTC_BOOTSTRAP=1 cargo rustc --release -- -Z self-profile<\/code><\/pre>\n<p><em>(\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0437\u0434\u0435\u0441\u044c <\/em><code><em>cargo rustc<\/em><\/code><em>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 <\/em><code><em>rustc<\/em><\/code><em> \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 \u0441 <\/em><code><em>RUSTC_BOOTSTRAP=1<\/em><\/code><em>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438 <\/em><code><em>-Z<\/em><\/code><em>\u00a0\u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430.)<\/em><\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0437\u0434\u0435\u0441\u044c \u044d\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u2014 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 <code>cargo chef cook<\/code>, \u0430 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 <code>rustc<\/code>\u00a0\u0447\u0435\u0440\u0435\u0437 <code>cargo-chef<\/code> \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u0441\u0451 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>RUSTFLAGS<\/code>:<\/p>\n<pre><code class=\"powershell\"># cargo chef: RUSTC_BOOTSTRAP=1 RUSTFLAGS='-Zself-profile' cargo chef cook --release ...  # \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430: RUSTC_BOOTSTRAP=1 RUSTFLAGS='-Zself-profile' cargo build --release ...<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0444\u0430\u0439\u043b\u044b \u0432\u0438\u0434\u0430 <code>web_http_server-&lt;random-number&gt;.mm_profdata<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0430 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u043b\u044f <code>cargo-timing.html<\/code>.<\/p>\n<p><em>(\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043c\u044b \u0443\u0434\u0430\u043b\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 <\/em><code><em>cargo chef cook<\/em><\/code><em>. \u042f \u043d\u0435 \u0441\u0442\u0430\u043b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438).<\/em><\/p>\n<h4>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c profdata<\/h4>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Rust \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u0430\u043c\u043e\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <code>rustc<\/code>; \u044d\u0442\u043e\u0442 \u043d\u0430\u0431\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"https:\/\/github.com\/rust-lang\/measureme\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/rust-lang\/measureme<\/a>.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><code>summary<\/code>\u00a0\u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0441 \u043a\u0440\u0430\u0442\u043a\u043e\u0439 \u0441\u0432\u043e\u0434\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><code>flamegraph<\/code>\u00a0\u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 SVG \u0441 <a href=\"https:\/\/www.brendangregg.com\/flamegraphs.html\" rel=\"noopener noreferrer nofollow\">flame-\u0433\u0440\u0430\u0444\u0438\u043a\u043e\u043c<\/a><\/p>\n<\/li>\n<li>\n<p><code>crox<\/code>\u00a0\u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0432 <a href=\"https:\/\/docs.google.com\/document\/d\/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU\/preview?tab=t.0#heading=h.yr4qxyxotyw\" rel=\"noopener noreferrer nofollow\">\u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Chrome<\/a>, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0443\u044e \u0441 <code>chrome:\/\/tracing<\/code>\u00a0(\u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Chromium)<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u0430\u0440\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c:<\/p>\n<pre><code class=\"powershell\">cargo install --git https:\/\/github.com\/rust-lang\/measureme flamegraph summarize<\/code><\/pre>\n<p>\u041b\u0438\u0447\u043d\u043e \u044f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c Firefox, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043a\u0430\u0441\u0430\u0442\u044c\u0441\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Chrome.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c <code>summarize<\/code>\u00a0(\u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>summarize<\/code>\u00a0\u0438 <code>diff<\/code>):<\/p>\n<pre><code class=\"powershell\">$ summarize summarize web_http_server.mm_profdata | wc -l 945 $ summarize summarize web_http_server.mm_profdata | head +-------------------------------+-----------+-----------------+----------+------------+ | Item                          | Self time | % of total time | Time     | Item count | +-------------------------------+-----------+-----------------+----------+------------+ | LLVM_lto_optimize             | 851.95s   | 33.389          | 851.95s  | 1137       | +-------------------------------+-----------+-----------------+----------+------------+ | LLVM_module_codegen_emit_obj  | 674.94s   | 26.452          | 674.94s  | 1137       | +-------------------------------+-----------+-----------------+----------+------------+ | LLVM_thin_lto_import          | 317.75s   | 12.453          | 317.75s  | 1137       | +-------------------------------+-----------+-----------------+----------+------------+ | LLVM_module_optimize          | 189.00s   | 7.407           | 189.00s  | 17         |  thread 'main' panicked at library\/std\/src\/io\/stdio.rs:1165:9: failed printing to stdout: Broken pipe (os error 32) note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace<\/code><\/pre>\n<p><em>(\u041e\u0439! \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 CLI.\u00a0<\/em><a href=\"https:\/\/github.com\/rust-lang\/measureme\/pull\/243\" rel=\"noopener noreferrer nofollow\"><em>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0448\u0438\u0442\u044c<\/em><\/a><em>.)<\/em><\/p>\n<p>\u041d\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0432\u0430 \u0441\u0430\u043c\u044b\u0445 \u0432\u0430\u0436\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u0430 \u2014 \u044d\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438 (<a href=\"https:\/\/www.llvm.org\/docs\/LinkTimeOptimization.html\" rel=\"noopener noreferrer nofollow\">link-time optimization<\/a>, LTO) \u0438 <code>LLVM_module_codegen_emit_obj<\/code>, \u0447\u0442\u043e \u0431\u044b \u044d\u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u043c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e flame-\u0433\u0440\u0430\u0444\u0438\u043a\u0430:<\/p>\n<pre><code class=\"powershell\">$ flamegraph web_http_server.mm_profdata $ # ... \u0432\u044b\u0432\u043e\u0434\u0430 \u043d\u0435\u0442. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c,<\/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-467864","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467864","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=467864"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467864\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=467864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=467864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=467864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}