So sánh hiệu năng trình liên kết Wild và Mold: Vì sao kết quả benchmark lại khác biệt?

Công nghệ20 tháng 9, 2026·5 phút đọc

Mold vừa cập nhật bộ benchmark trình liên kết và lần đầu đưa Wild vào so sánh, cho thấy Wild chậm hơn đáng kể so với kết quả công bố trước đó. Tác giả Wild phân tích nguyên nhân đến từ cấu hình đo khác nhau như hệ thống tập tin, tùy chọn --no-fork và tốc độ cải thiện gần đây của Mold.

So sánh hiệu năng trình liên kết Wild và Mold: Vì sao kết quả benchmark lại khác biệt?

So sánh hiệu năng trình liên kết Wild và Mold: Vì sao kết quả benchmark lại khác biệt?

Mold vừa cập nhật bộ benchmark trình liên kết và lần đầu tiên đưa Wild vào so sánh. Kết quả cho thấy Wild chậm hơn Mold đáng kể, trái ngược với báo cáo benchmark gần nhất mà Wild công bố hôm 4/8. Tác giả của Wild đã phân tích để tìm lời giải thích cho sự khác biệt này.

Bài viết dưới đây là bản tóm lược và phân tích của tác giả David Lattimore về nguyên nhân dẫn tới chênh lệch kết quả đo hiệu năng giữa hai trình liên kết.

Bối cảnh: hai bộ benchmark, hai cách đo khác nhau

Mold chạy benchmark trên hai máy: một Threadripper 64 nhân (128 luồng) chạy Ubuntu 24.04, và một Apple M1 Ultra (16 nhân hiệu năng) chạy Asahi Linux. Trong khi đó, Wild chạy benchmark trên một máy duy nhất: Ryzen 9955hx 16 nhân (32 luồng) chạy Ubuntu 26.04.

Sự khác biệt đầu tiên nằm ở tệp đầu ra. Benchmark của Wild giữ lại tệp đầu ra từ lần chạy trước, còn Mold xóa tệp này giữa các lần gọi trình liên kết. Điều này ảnh hưởng lớn tới hiệu năng, và mức độ ảnh hưởng còn phụ thuộc vào hệ thống tập tin.

Wild vốn chạy benchmark trên tmpfs nhằm giảm nhiễu và tránh làm hỏng SSD. Nhìn lại, đây có thể là sai lầm, vì hầu hết người dùng không build trên tmpfs. Mold dùng ext4, một lựa chọn hợp lý hơn.

Khác biệt thứ hai là Mold truyền cờ --no-fork, ghi đè hành vi mặc định là fork khi khởi động để giảm chi phí tắt máy. Wild giữ nguyên mặc định khi đo thời gian, và chỉ truyền --no-fork khi đo mức tiêu thụ bộ nhớ.

So sánh hiệu năng Clang theo từng bản phát hànhSo sánh hiệu năng Clang theo từng bản phát hành

Tái lập kết quả của Mold trên M1

Để kiểm chứng, tác giả thử tái lập kết quả gần giống benchmark của Mold trên Apple M1 16 nhân, dùng bản release của cả hai trình liên kết tính đến 28/8. Cấu hình được đặt giống Mold: tệp đầu ra trên ext4, xóa tệp giữa các lần chạy và truyền --no-fork.

Dưới đây là tập con kết quả benchmark của Mold:

  • blender-debug: Wild 1,81s / Mold 1,56s → tỷ lệ 1,2x
  • godot-debug: Wild 0,81s / Mold 0,62s → tỷ lệ 1,3x
  • blender-release: Wild 0,20s / Mold 0,25s → tỷ lệ 0,8x
  • clang-release: Wild 0,15s / Mold 0,14s → tỷ lệ 1,0x

Và kết quả tái lập của tác giả:

  • blender-debug: Wild 2,23s / Mold 1,79s → tỷ lệ 1,2x
  • godot-debug: Wild 1,11s / Mold 0,89s → tỷ lệ 1,2x
  • blender-release: Wild 0,30s / Mold 0,33s → tỷ lệ 0,9x
  • clang-release: Wild 0,21s / Mold 0,20s → tỷ lệ 1,0x

Xét việc chạy trên kiến trúc CPU khác với kích thước cache và RAM khác, các kết quả này được xem là gần như trùng khớp với mong đợi.

Điều gì tạo nên khác biệt lớn?

Sau khi tái lập được kết quả tương tự, tác giả đi sâu tìm lý do vì sao kết quả lại khác xa so với những gì Wild công bố chưa đầy một tháng trước. Trọng tâm là benchmark clang-release, thử nghiệm với nhiều cấu hình khác nhau, từ cấu hình của Mold (ext4 + xóa tệp + no-fork) đến cấu hình Wild vốn dùng (tmpfs + không xóa + fork).

Kết quả cho thấy:

  • clang-release.ext4-delete-no-fork: Wild 0,21s / Mold 0,20s → 1,0x
  • clang-release.ext4-no-delete-no-fork: Wild 0,14s / Mold 0,20s → 0,7x
  • clang-release.tmpfs-delete-no-fork: Wild 0,16s / Mold 0,20s → 0,8x
  • clang-release.tmpfs-no-delete-no-fork: Wild 0,14s / Mold 0,19s → 0,7x
  • clang-release.tmpfs-no-delete-fork: Wild 0,11s / Mold 0,19s → 0,6x

Wild đạt kết quả tốt nhất khi được phép fork, tệp đầu ra đã tồn tại và nằm trên tmpfs — tức ngược lại hoàn toàn với cấu hình mà Mold dùng. Nguyên nhân phần lớn là do Wild thiếu các tinh chỉnh đặc thù hệ điều hành giúp việc tạo và ghi tệp mới trên hệ thống tập tin ngoài tmpfs diễn ra nhanh chóng.

Tác giả Mold đã mô tả những tinh chỉnh này trong bài báo "mold: A Massively Parallel Linker", cụ thể là dùng fallocate để cấp phát trước không gian cho tệp và dùng hugepage để ánh xạ tệp. Hai thay đổi này đã được áp dụng cho Wild và sẽ có trong bản phát hành kế tiếp.

Mold đã nhanh hơn đáng kể

Vẫn còn khoảng cách đáng kể giữa benchmark Wild công bố ngày 4/8 và benchmark Mold công bố ngày 28/8. Để làm rõ, tác giả đã đo từng bản phát hành của cả Mold và Wild trong hơn một năm qua.

Kết quả cho thấy Mold đã trở nên nhanh hơn đáng kể gần đây. Benchmark ngày 4/8 của Wild được thực hiện trước các bản phát hành Mold 2.42.0 và 2.42.1 — chính là hai phiên bản mang lại phần lớn mức cải thiện.

Hiệu năng Clang theo số luồngHiệu năng Clang theo số luồng

Câu hỏi còn bỏ ngỏ trên Threadripper

Tác giả đã tái lập được gần đúng kết quả trên M1 Mac, nhưng chưa tái lập được kết quả trên Threadripper vì không có phần cứng tương đương. Máy Ryzen 9955hx 16 nhân với 92GiB RAM không phải cấu hình yếu, nhưng không thể so với Threadripper 64 nhân và 384GiB RAM.

Phỏng đoán của tác giả là chênh lệch lớn hơn trên Threadripper có thể đến từ việc Wild chạy với 128 luồng trong khi Mold chạy với 32 luồng. Trên máy 16 nhân (32 luồng) của mình, Wild vẫn nhanh hơn (dù chỉ chút ít) khi tăng từ 24 lên 32 luồng, nên tác giả chưa đặt giới hạn số luồng.

Đây thực sự chỉ là phỏng đoán. Nếu ai có Threadripper và muốn thử benchmark Wild với các mức luồng khác nhau, hãy liên hệ với tôi.

Câu chuyện này cũng là lời nhắc nhở quen thuộc với giới phát triển phần mềm: kết quả benchmark chỉ đáng tin khi cấu hình đo được công bố minh bạch. Cùng một phần mềm, nhưng chỉ cần thay đổi hệ thống tập tin, cách xử lý tệp đầu ra hay số luồng, thứ hạng hiệu năng có thể đảo chiều hoàn toàn.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗