HeadlinesBriefing favicon HeadlinesBriefing.com

Buildprof কম্পাইল টাইম visible

Hacker News •
×

আমি buildprof (GitHub) তৈরি করেছি, একটি ওপেন-সোর্স ট্রেসিং টুল যা Linux-এ সফটওয়্যার কম্পাইল করার সময় সময় কোথায় যাচ্ছে তা দেখায়। ripgrep-এর একটি সফল কম্পাইলের actually-time video এখানে: buildprof ডেমো দেখুন। কখনই কখনই কম্পাইল স্লো হোক simply কারণ অনেক কোড কম্পাইল করতে হয়। কিন্তু অধিকাংশ সময়ে, সুলভ সমস্যা আছে: খারাপ সমান্তরালতা, পুনরাবৃত্ত কাজ, নির্রতা ডাউনলোড বা একটি বড় কম্পাইলার/লিংকার invocation। buildprof সবকিছু স্পষ্টভাবে sichtbar করে তোলে, তাই আপনি দেখতে পারবেন কী জांचার ও অপ্টিমাইজ করার জন্য ارزشপূর্ণ। আপনি এটি চালাতে পারবেন যেকোনো বিল্ড কমান্ডের আগে buildprof -- রাখে ব্যবহার করছেন: buildprof -- make -j16, buildprof -- cargo build, buildprof -- ninja -C out/target, buildprof -- just build, buildprof -- ./dev/custom-build-script.sh। buildprof আপনার বিল্ড কমান্ড দ্বারা লঞ্চ করা সমস্ত প্রক্রিয়াকে রেকর্ড করে, তাদের subprocess (এবং তাদের subprocess… ) অন্তর্ভুক্ত করে, এবং একটি টাইমলাইন-এ রাখে। সময় বাম থেকে ডান দিকে যাচ্ছে, বারের প্রস্থের দৈর্ঘ্য দেখায়, এবং bambino process child-parent relation dướiে দেখায়। আমি buildprof তে তৈরি করেছি কারণ Jarred Sumner-এর এই টwiaট, যিনি Bun JavaScript রানটাইমের প্রধান আর্কিটেক্ট, আমার頭ডে ঘুরছিলা ছিল: বিশেষ করে, দাবি যে Bun-এর নতুন Rust কম্পাইল Linux-তে পুরনো Zig কম্পাইল থেকে >5× faster। আমার অভিজ্ঞতায়, Zig প্রজেক্টস সাধারণত সমান জটিলতার Rust প্রজেক্টস চেয়ে অনেক বেশি দ্রুত কম্পাইল হয়। এই intuition কाफी ছিল যে আমাকে একটি রহস্য সুলझানোর অনুভূতি হচ্ছে। এটি আরও গুরুত্বপূর্ণ, কিন্তু সহজে missed detail tweet-এ: Zig কম্পাইল Full LTO ব্যবহার করত, আর Rust কম্পাইল Thin LTO ব্যবহার করত। কম্পাইলার সাধারণত আলাদা-আলাদা compilation units largely একে-এক থেকে বাদ দিয়ে optimize করত। লিংক-টাইম অপ্টিমাইজেশন (LTO) তাদের অনুমতি দেয় যেBoundary-দ্বার optimize করতে পারে। Full LTO those units একে-একে বড় অপ্টিমাইজেশনジョブে বেঁধে রাখে, আর Thin LTO আরও separation preserve করে তাই অনেক কাজ parallelভাবে চলতে পারে। পেছনের অভিজ্ঞতা থেকে, এই পার্থক্য build time-তে enormous প্রভাব ফেলতে পারে। tweet-এ এটি পাশাপাশি উল্লেখ করা হলো, কিন্তু আমি wondered-how much of the headline improvement it explained। আমি সংখ্যাগুলো reproduce করার চেষ্টা শুরু করেছি। সংখ্যাগুলো reproduce হয়েছে। কিন্তু এখন কি? আমি Bun 1.3.14 এবং Bun 1.4.0 চেক করেছি এবং 6-core, 12-thread Linux VM-তে তাদের Linux x64 CI builds-র scripts লিখেছি। scripts build steps এবং তাদের dependencies সংরক্ষণ করেছি, একে-এক মেশিনে সবকিছু চালালাম। আমার টাইমিং Jarred-র মতোই ballpark-তে ছিল: Linux x64 build Zig era 30m06s, Rust era 5m37s। আমার single-machine CI-profile replay 24m24s 5m40s। ঠিক আছে, তাই আমার মেশিনেও gap দেখাচ্ছিল। কিন্তু দুটি measurement之间除了 language besides অনেক কিছু পরিবর্তিত হয়েছিল; তাহলে কী真的 responsible ছিল? কি এটি Zig compiler ছিল যা all extra time নেয়েছিল? বা সম্ভবত এটি Full LTO link। অথবা সম্ভবত Bun-এর build-এ আমি কখনোই ভাবলাম না কিছু anderes ছিল? এখানে আমার profiling এবং developer-tools brain kicked in। সাধারণত, যখন আমি বুঝতে চাই কেন কিছু慢، আমি একটি trace চাই: কী ঘটে, কখন ঘটে এবং কতটা সময় লাগে। এটি খুবই উত্সাহজনক হতয়া যেতে পারে যে আমাদের জন্য এই builds-র একটি trace থাকা, তাদের একটি timeline-এ রাখা এবং দেখতে পারি তাদের সময় skutelys গিয়েছে। কিন্তু একটি build অনেক বিভিন্ন টুলের অন্তর্ভুক্ত করে, প্রতিটি এর নিজের ধারণা আছে যে কী হচ্ছে। আমি वह রিকর্ড করতে হবে যা আমি সবার across দেখতে পারি। builds process trees are। যখন cargo build বা zig build চালाते हैं, তবে এটি এক প্রোগ্রাম চালাচ্ছে মতো অনুভব হয়। build system নির্ধারণ করে rebuild করার প্রয়োজন কী, those pieces之间 ordering এবং কী parallelভাবে চলতে পারে। কিন্তু generally, এটি নিজে সে সব কাজ না করে; এটি compilers, code generators, archivers, linkers এবং arbitrary scripts লঞ্চ করে। এগুলো আরও programs লanç করতে পারে যা আরও কিছু লanç করতে পারে… বিভিন্ন build systems সেই work বিভিন্ন উপায়ে describe করে। Cargo crate দেখে, Ninja build edges দেখে এবং CMake दूसरे build system-র জন্য instructions generate করে। From the operating