Trình biên dịch JIT của CPython gặp khó khăn trong việc bắt kịp hiệu suất thông dịch viên sau hai năm phát triển

Nhóm Cộng đồng BigGo
Trình biên dịch JIT của CPython gặp khó khăn trong việc bắt kịp hiệu suất thông dịch viên sau hai năm phát triển

Trình biên dịch Just-In-Time (JIT) thử nghiệm của Python đã gặp phải một rào cản lớn. Sau hai năm phát triển, JIT thường chạy chậm hơn so với thông dịch viên thông thường của Python, đặt ra câu hỏi về hướng đi tương lai của dự án và làm nổi bật những thách thức trong việc tối ưu hóa các ngôn ngữ lập trình động.

Dự án CPython JIT bắt đầu với hy vọng cao về việc tăng tốc đáng kể quá trình thực thi mã Python. Tuy nhiên, phân tích gần đây cho thấy rằng khi sử dụng các trình biên dịch hiện đại như Clang 20, thông dịch viên luôn vượt trội hơn JIT. JIT chỉ đạt được sự ngang bằng khi thông dịch viên bị cản trở một cách cố ý bằng cách sử dụng các trình biên dịch cũ hơn, kém hiệu quả hơn như GCC 11.

Lộ trình phát triển CPython JIT

  • 2022-2023: Bắt đầu phát triển JIT ban đầu
  • Python 3.13: JIT được phát hành như một tính năng thử nghiệm, thường chậm hơn so với trình thông dịch
  • Python 3.14: Tập trung vào mở rộng phân tích kiểu dữ liệu và xây dựng cộng đồng, cải tiến tối ưu hóa tối thiểu
  • Python 3.15+: Các tối ưu hóa được lên kế hoạch bao gồm unboxing int/float, cải tiến phân bổ thanh ghi, hỗ trợ free-threading
Bài viết blog này phản ánh về những khó khăn về hiệu suất và bài học kinh nghiệm từ hai năm phát triển trình biên dịch JIT của CPython
Bài viết blog này phản ánh về những khó khăn về hiệu suất và bài học kinh nghiệm từ hai năm phát triển trình biên dịch JIT của CPython

Kiểm tra thực tế về hiệu suất

Các con số cho thấy một câu chuyện đáng lo ngại. Trong các bài kiểm tra benchmark, JIT cho thấy kết quả hỗn hợp mâu thuẫn với các báo cáo lạc quan ban đầu. Trong khi một số khối lượng công việc như benchmark Richards thấy cải thiện tốc độ 15%, những khối khác lại bị chậm lại đáng kể. Ví dụ, benchmark nbody chạy chậm hơn 13% khi bật JIT, và spectral_norm cho thấy hiệu suất giảm 6%.

Hiệu suất không nhất quán này xuất phát từ những hạn chế hiện tại của JIT. Phiên bản 3.14 gần như không chứa cải tiến tối ưu hóa lớn nào so với bản phát hành 3.13, thay vào đó tập trung vào việc mở rộng phạm vi phân tích kiểu và xây dựng chuyên môn cho các cộng tác viên. Nhóm phát triển ưu tiên xây dựng cộng đồng và chuyển giao kiến thức hơn là đạt được những cải thiện hiệu suất tức thì.

So sánh Benchmark Hiệu suất ( CPython 3.14 )

Benchmark JIT Tắt JIT Bật Thay đổi Hiệu suất
Richards 44.5ms ± 0.5ms 37.8ms ± 2.4ms Nhanh hơn +15%
Nbody 91.8ms ± 3.5ms 104ms ± 2ms Chậm hơn -13%
Spectral_norm 90.6ms ± 0.7ms 96.0ms ± 0.7ms Chậm hơn -6%

Cấu hình thử nghiệm: Ubuntu 22.04 , Clang 20.1.7 , PGO=true, LTO=thin

Thách thức của ngôn ngữ động

Python đối mặt với những rào cản tối ưu hóa độc đáo so với các ngôn ngữ động khác. Cuộc thảo luận cộng đồng tiết lộ rằng mô hình đối tượng của Python, thường được mô tả là mọi thứ đều là dict với các khóa chuỗi, tạo ra những rào cản hiệu suất cơ bản. Không giống như JavaScript, đã được hưởng lợi từ đầu tư doanh nghiệp khổng lồ và các quyết định thiết kế thân thiện với tối ưu hóa, kiến trúc của Python làm cho việc biên dịch JIT trở nên đặc biệt thách thức.

So sánh với trình biên dịch YJIT của Ruby đặc biệt có ý nghĩa. Ruby đạt được những cải thiện hiệu suất đáng kể với một nhóm nhỏ hơn, một phần vì ngữ nghĩa của Ruby phù hợp hơn với các kỹ thuật tối ưu hóa JIT hiện có được phát triển cho các ngôn ngữ như Smalltalk. API C rộng lớn của Python và cam kết về khả năng tương thích ngược càng làm phức tạp thêm các nỗ lực tối ưu hóa.

Bản chất bên trong của mô hình đối tượng đơn giản là quá nặng nề như hiện tại. Do đó, việc loại bỏ các loại chi phí mà JIT loại bỏ sẽ không giúp ích vì đó không phải là thứ mà CPU dành nhiều thời gian khi chạy CPython.

Phát triển cộng đồng so với doanh nghiệp

Những khó khăn của dự án làm nổi bật những thách thức rộng lớn hơn trong tối ưu hóa hiệu suất mã nguồn mở. Trong khi Google đã đổ nguồn lực khổng lồ để làm cho JavaScript nhanh thông qua V8, và Shopify thành công trong việc tài trợ phát triển YJIT của Ruby, JIT của Python chủ yếu dựa vào các tình nguyện viên cộng đồng và sự hỗ trợ hạn chế từ doanh nghiệp. Nhóm Faster CPython của Microsoft, đã cung cấp hỗ trợ đáng kể, phải đối mặt với việc sa thải làm giảm chuyên môn có sẵn.

Nhóm phát triển thừa nhận những thách thức này trong khi vẫn lạc quan về những cải tiến trong tương lai. Họ đã thành công trong việc xây dựng một cộng đồng cộng tác viên xung quanh JIT, với nhiều nhà phát triển hiện đang làm việc trên các thành phần khác nhau. Cách tiếp cận dựa trên cộng đồng này ưu tiên tính bền vững lâu dài hơn là đạt được những cải thiện hiệu suất tức thì.

Nhìn về phía trước

Mặc dù có những hạn chế hiện tại, CPython JIT vẫn chưa sẵn sàng để nghỉ hưu. Nhóm đã xác định được một số cơ hội tối ưu hóa có thể mang lại những cải thiện tốc độ có ý nghĩa trong Python 3.15. Những cải tiến này bao gồm unboxing số nguyên và số thực, phân bổ thanh ghi thông minh hơn, và tích hợp tốt hơn với hỗ trợ free-threading của Python.

Dự án phục vụ như một trải nghiệm học tập có giá trị về sự phức tạp của việc tối ưu hóa các ngôn ngữ động. Trong khi các mục tiêu hiệu suất vẫn còn khó nắm bắt, JIT đã trở thành một công cụ giáo dục giúp người mới hiểu các kỹ thuật tối ưu hóa trình biên dịch. Liệu giá trị giáo dục này có biện minh cho việc tiếp tục đầu tư hay không vẫn là một câu hỏi mở khi cộng đồng Python cân nhắc chi phí và lợi ích của việc theo đuổi biên dịch JIT.

Câu chuyện CPython JIT minh họa rằng việc làm cho các ngôn ngữ động trở nên nhanh đòi hỏi nhiều hơn là ý định tốt và kỹ năng kỹ thuật. Nó đòi hỏi các quyết định kiến trúc cơ bản, nguồn lực đáng kể, và đôi khi những sự đánh đổi khó khăn giữa khả năng tương thích và hiệu suất.

Tham khảo: Reflections on 2 years of CPython's JIT Compiler: The good, the bad, the ugly