انتشار زودهنگام ابرداده باعث می شود ساخت/بررسی Rust تا دو برابر سریعتر شود
آدرس مقاله: https://github.com/PowderworksCode/headstart آدرس نظرات: https://news.ycombinator.com/item?id=49951218 امتیاز: 148 # نظرات: 42
جعبه های وابسته را قبل از اتمام بررسی نوع وابستگی آنها شروع کنید.
هر جعبهای قبل از شروع به کار منتظر میماند تا جعبههایی که به آنها بستگی دارد، بهطور کامل بررسی شوند. نیازی به آن بدنه ها ندارد تا خودش را تایپ کند. در برابر رابط وابستگی، ابرداده در فایل rmeta. خود را کامپایل می کند.
Headstart باعث میشود rustc به محض بررسی رابط، یک فایل ابرداده اولیه بنویسد و شروع محموله را به آن وابسته کند. بدنههای هر جعبه در حالی که جعبههای پایین دست در حال کامپایل شدن هستند، بررسی میشوند.
اگر بدنه ای خطا داشته باشد، ساخت همچنان با آن خطا، با همان عیب یابی و وضعیت خروجی امروز، از کار می افتد. فقط خطوط پیشرفت و ترتیب کراس کرت پیامهای JSON میتواند متفاوت باشد. Cargo خروجی یک جعبه را تنها زمانی گزارش میکند که تمام وابستگیهای آن کاملا به پایان برسد، و در صورت خرابی، آن را کاهش میدهد. هزینهها مربوط به کار پاییندستی است که دور ریخته میشود، خطاها کمی دیرتر گزارش میشوند، و حافظه بیشتری در یک زمان استفاده میشود (به docs/design.md مراجعه کنید).
وصلهها یک سری commit هستند که هر کدام دارای یک پیام commit و آزمایش هستند که به درخواستهای کشش بالادست تبدیل میشوند: به patches/README.md مراجعه کنید.
در قسمت جلویی پیشفرض rustc، هد استارت ساختهای تمیز از 13 پروژه واقعی (آنالایزر زنگ زدگی، zed، bevy، lemmy، polars و موارد دیگر) را تا 54 درصد برای بررسی محموله و تا 42 درصد برای ساخت محموله سریعتر میسازد. هیچکدام کندتر نیست با قسمت جلویی موازی (-Zthreads=8)، که مقداری از همان زمین را می پوشاند، به 25% اضافه می شود. این اعداد 16 هسته ای هستند. سود حاصل از هسته هایی است که ساخت بیکار می ماند، بنابراین در ماشین های کوچکتر کوچک می شود. در 4 هسته، بررسی زنگ آنالایزر 24 درصد سریعتر و ساخت آن 13 تا 15 درصد، بررسی کدکس rs 14 درصد، و ساخت های عریض یکنواخت بیرون می آید.
یک محموله تمیز از Codex-rs بر روی 16 هسته، ثبت شده با cratebank. بدون هد استارت، جعبههای خود فضای کاری یکی پس از دیگری جمعآوری میشوند در حالی که دستگاه عمدتا بیکار است. با آن، هر کدام از متادیتاهای اولیه قبلی شروع میشوند و ساخت 37 درصد سریعتر است.
همان دو بیلد، با عرض زمان و کاهش عمق وابستگی: هر واحد تحت وابستگی ای که آن را آزاد می کند، ترسیم می شود، با فاز کامپایلر رنگ آمیزی می شود. بدون راه اندازی سر، جعبه های فضای کار یک راه پله طولانی را تشکیل می دهند. با آن همپوشانی دارند. اطلاعات بیشتر در docs/results.md.
چگونه کار میکند، چه ابردادههای اولیه حذف میشود، و خطرات: docs/design.md. اندازهگیریها: docs/results.md. آیا آماده ارائه به کامپایلر و تیمهای بار است: docs/readiness.md.
CARGO_UNSTABLE_HEADSTART=true آن را نیز روشن میکند، همانطور که [ناپایدار] headstart = true در .cargo/config.toml. بدون آن، محموله وصلهشده مانند بالادست رفتار میکند، بنابراین همان باینریها یک خط پایه منصفانه به دست میدهند.
tests/smoke یک فضای کاری دو جعبه است که اثر را نشان می دهد. بررسی کتابخانه کند آن چندین ثانیه طول می کشد، تقریبا همه آن در بدنه های تابعی است. با روشن شدن هد استارت، برنامه به جای اینکه منتظر پایان آهسته باشد، حدود 0.2 ثانیه شروع می شود.
scripts/check-errors.sh ادعای خطاهای مربوط به تست ها/خطاها را بررسی می کند. این سه سناریو (یک ساخت تمیز، یک خطا در وابستگی، یک خطا در باینری) با بررسی محموله و ساخت محموله، شروع به کار و روشن اجرا میکند. سپس خروجی قابل خواندن توسط انسان، خروجی JSON، وضعیت خروج و آنچه را که باینری ساخته شده چاپ می کند، مقایسه می کند.
scripts/check-incremental.sh [بررسی|ساخت] همین کار را در مجموعه ای از ویرایش های افزایشی انجام می دهد. این مراحل شامل افزودن تماس های وابسته به impl Fn و شکستن و سپس تعمیر یک رابط است. همچنین وضعیت نهایی را با یک ساخت تمیز مقایسه می کند.
scripts/check-swap.sh باعث میشود یک کتابخانه از ابردادههای اولیه وابستگی خود شروع کند و در هر سطح بهینهسازی، ابردادههای کامل را در حین توقف موقت، تعویض کند. برنامه ساخته شده از آن باید مانند برنامه ساخته شده از ابرداده کامل چاپ شود.
scripts/sweep.sh همه 53 معیار کامپایل rustc-perf را با شروع و روشن کردن headstart، با -Zearly-metadata-verify ایجاد می کند. زمانی که هر بیلد در هر دو حالت با عیبیابی یکسان موفق شود، میگذرد و هیچ گزارشی را تأیید نمیکند. -c build sweeps cargo build، -r نمایه آزادسازی، و -t قسمت جلویی موازی (-Zthreads=8).
این بار چک محموله تمیز (یا ساخت محموله) ساخته می شود، شروع به کار متناوب و روشن می شود و میانه ها را چاپ می کند. یک پروژه می تواند آرگومان های محموله را بعد از :: ( path/to/vaultwarden::--features=sqlite) بگیرد. `scripts/real-projects.sh
scripts/setup-codex.sh <dir> همین کار را برای codex-rs انجام می دهد که به یک وابستگی اصلاح شده و V8 از پیش ساخته شده کدکس نیاز دارد (به اسکریپت مراجعه کنید). منبع <dir>/codex/headstart.env قبل از زمان بندی آن.
-w در هر پروژه، برای ساخت اسکریپتهایی که یک بار کار خارج از هدف انجام میدهند، یک ساخت گرمآپ بدون زمان اضافه میکند (helix گرامرهای خود را در درخت منبع خود کامپایل میکند).
scripts/bench-suite.sh <out-dir> کل مجموعه docs/results.md را بر روی دستگاه فعلی اجرا می کند: Rust-analyzer، 21 معیار rustc-perf، سایر پروژه های واقعی و codex-rs، بررسی و ساخت. نتایج هر بنچمارک را جداگانه نگه میدارد و از نتایج تمامشده صرفنظر میکند، بنابراین میتوان آن را دوباره راهاندازی کرد، و در پایان یک جدول خلاصه مینویسد. این نحوه بدست آوردن اعداد برای اندازه دستگاهی است که هنوز اندازه گیری نشده است، مانند 8 هسته.
scripts/bench-mem.sh از کل حافظه تمام فرآیندهای rustc در طول ساخت، در خود دایرکتوری پروژه نمونه برداری می کند (آن را روی یک ماشین غیرفعال اجرا کنید). scripts/bench-incremental.sh پس از ویرایش یک بدنه تابع، بررسیهای مجدد افزایشی را دفع میکند. scripts/log-rustc زمان شروع و پایان هر اجرا rustc را ضبط می کند، بنابراین می توانید زمان بندی را ببینید. معیارهای rustc-perf در زیر rustc/src/tools/rustc-perf/collector/compile-benchmarks قرار دارند (بهروزرسانی زیر ماژول git -C rustc --init --depth 1 src/tools/rustc-perf).
متن اصلی (انگلیسی)
Emitting metadata early makes building/checking Rust up to twice as fast
Article URL: https://github.com/PowderworksCode/headstart Comments URL: https://news.ycombinator.com/item?id=49951218 Points: 148 # Comments: 42