2 điểm bởi GN⁺ 2023-11-30 | 1 bình luận | Chia sẻ qua WhatsApp

Binding Python của OpenDAL chậm hơn Python?

  • OpenDAL là một lớp truy cập dữ liệu giúp truy xuất dữ liệu hiệu quả từ nhiều dịch vụ lưu trữ khác nhau.
  • Có báo cáo cho rằng binding Python của OpenDAL chậm hơn chính Python.
  • Đưa ra giả thuyết rằng nguyên nhân có thể là bộ đệm nội bộ của Python, tăng tốc đọc tệp, và chi phí phụ trội bổ sung của PyO3.

Dịch vụ Fs của OpenDAL chậm hơn Python?

  • Đây là vấn đề liên quan đến nhiều yếu tố như Rust, OpenDAL, Python, PyO3.
  • Tác giả phát hiện ngay cả dịch vụ fs của OpenDAL được triển khai bằng Rust cũng chậm hơn Python.

std::fs của Rust chậm hơn Python?

  • OpenDAL triển khai dịch vụ fs thông qua std::fs.
  • Xác nhận rằng cả triển khai dùng std::fs của Rust cũng chậm hơn Python.

std::fs của Rust chậm hơn Python? Thật sao!?

  • Tác giả đặt nghi vấn về kết quả cho thấy std::fs của Rust chậm hơn Python.
  • Học cách phân tích system call bằng strace.
  • Qua việc phân tích kết quả strace, tác giả vẫn không tìm ra lý do Python nhanh hơn dù cả hai đều đang dùng mmap.

Tại sao ở đây lại dùng mmap?

  • mmap không chỉ được dùng để ánh xạ tệp vào bộ nhớ mà còn được dùng để cấp phát các vùng bộ nhớ lớn.
  • Khi yêu cầu bộ nhớ bằng malloc, glibc sẽ dùng mmap để cấp phát bộ nhớ.

Python có cùng bộ cấp phát bộ nhớ với Rust không?

  • Python dùng bộ cấp phát bộ nhớ tên là pymalloc, được tối ưu cho các cấp phát nhỏ.
  • pymalloc được tối ưu cho các đối tượng nhỏ, còn với các cấp phát lớn thì dùng PyMem_RawMalloc()PyMem_RawRealloc().

Rust có chậm hơn Python với bộ cấp phát bộ nhớ mặc định không?

  • Tác giả nghi ngờ mmap là nguyên nhân gây ra vấn đề.
  • Phát hiện rằng chương trình Rust sau khi chuyển sang jemalloc thì chạy nhanh hơn Python.

Chỉ trên máy tôi thì Rust mới chậm hơn Python sao!

  • Việc Rust chạy chậm hơn Python chỉ xảy ra trên một máy tính cụ thể.
  • Tác giả cung cấp thông tin chi tiết về CPU và bộ nhớ.
  • Việc điều chỉnh các tính năng giảm thiểu lỗ hổng CPU, Transparent Hugepage và affinity lõi CPU cũng không làm thay đổi kết quả.
  • Dùng chương trình eBPF để xác nhận rằng ở mức system call, Rust vẫn chậm hơn Python.

C chậm hơn Python?

  • Tác giả phát hiện cả phiên bản triển khai bằng C cũng chậm hơn Python.

C chậm hơn Python? Khi không có offset được chỉ định!

  • Tác giả phát hiện có sự khác biệt về offset của vùng nhớ và cải thiện tốc độ chương trình C bằng cách điều chỉnh offset.
  • Xác nhận rằng trên CPU AMD Ryzen, nếu không có offset cụ thể thì hiệu năng sẽ bị suy giảm.

AMD Ryzen 9 5900X chậm nếu không có offset được chỉ định!

  • Xác nhận đây là vấn đề liên quan đến CPU, và một lập trình viên kernel đã tham gia thảo luận.
  • Qua profiling bằng perf, tác giả một lần nữa xác nhận rằng nếu không có offset thì sẽ xảy ra suy giảm hiệu năng.

Ý kiến của GN⁺: Điểm quan trọng nhất của bài viết này là Rust và C có thể chạy chậm hơn Python trong một số môi trường phần cứng cụ thể, và điều này có thể bắt nguồn từ cách cấp phát bộ nhớ cũng như cơ chế hoạt động riêng của CPU. Bài viết cho thấy mức độ phức tạp của tương tác giữa phần cứng và phần mềm thông qua quá trình truy tìm nhiều yếu tố ảnh hưởng đến hiệu năng phần mềm. Kiểu điều tra này mang lại bài học quan trọng trong việc giải quyết những vấn đề bất ngờ có thể phát sinh trong thế giới kỹ thuật phần mềm.

1 bình luận

 
GN⁺ 2023-11-30
Ý kiến trên Hacker News
  • Ý kiến về tiền đề gây nhầm lẫn

    Một người dùng bày tỏ sự bối rối trước giả định rằng các hàm trong thư viện chuẩn Python được viết bằng Python thuần. Họ cho rằng khác biệt hiệu năng giữa phương thức đọc tệp của Python và OpenDAL là điều thú vị, vì cả hai đều là wrapper Python bao quanh mã native, nhưng cách diễn đạt là "chậm hơn Python" nghe khá kỳ lạ. Họ kỳ vọng các hàm trong thư viện chuẩn Python được triển khai bằng mã native và đã được tối ưu hóa riêng. Họ không ngạc nhiên khi kết luận của bài viết liên quan đến cách mã native hoạt động, và dù có bất ngờ với một số câu trả lời cụ thể, họ vẫn thừa nhận đây là một bài viết rất thú vị dù khởi đầu khá khó hiểu.

  • Thảo luận về cờ tính năng CPU

    Có hai cờ tính năng CPU chuyên dụng cho biết các lệnh REP STOS/MOV nhanh và có thể dùng như chuỗi lệnh ngắn cho memset/memcpy. Việc phải tự tay tạo các routine tối ưu cho từng thế hệ CPU mới đã là nỗi đau kéo dài hàng chục năm. Người này đặt câu hỏi liệu chuyện đó giờ đây có nên trở thành một phần trong bộ kiểm thử timing của nhà sản xuất CPU hay không.

  • Liên kết đến bug glibc liên quan

    Cung cấp liên kết đến một bug glibc liên quan đến Zen 4.

  • Phản hồi tích cực về bài viết

    Một người dùng nói rằng ban đầu họ định đọc bài với tâm thế chế giễu việc dùng sai std::fs, nhưng bài viết hóa ra là một chuỗi hang thỏ và bí ẩn nối tiếp nhau, được viết rất tốt và cực kỳ hấp dẫn.

  • Đánh giá rất cao bài viết

    Một người dùng khác nhận xét đây là bài viết thú vị nhất họ đọc trong tuần này và khen bài được viết rất xuất sắc.

  • Đề xuất để giải quyết vấn đề

    Một giải pháp hiển nhiên được đề xuất là gửi bản vá để thay đổi phương thức kernel copy_user_generic, sao cho nếu CPU bị phát hiện là có vấn đề và việc căn chỉnh bộ nhớ kích hoạt bug chậm, thì sẽ dùng một triển khai sao chép bộ nhớ khác.

  • Thông tin về allocator mặc định của Rust

    Cung cấp thông tin rằng allocator mặc định của Rust từng là jemalloc cho đến năm 2018, kèm theo liên kết liên quan.

  • Điều các nhà phát triển Rust nên cân nhắc để cải thiện hiệu năng

    Có người thắc mắc liệu các nhà phát triển Rust có nên cân nhắc chuyển sang jemallocator để cải thiện hiệu năng hay không, liệu đây có phải cách để mọi người nhận được hiệu năng miễn phí hay không, liệu các codebase C cũng có thể hưởng lợi từ đó không, và liệu có phải hiện vẫn còn hiệu năng bị bỏ lại trên bàn hay không.

  • Giải thích về khác biệt CPU giữa AMD và Intel

    Có người giải thích rằng cách AMD xử lý string store khác với Intel, và tốt hơn hết là không nên dùng nó cho đến khi vượt quá kích thước L2 của CPU. Sau ngưỡng đó thì dùng string store sẽ có lợi và đáng ra phải chạy ở "tốc độ DRAM", nhưng do chi phí khởi động cao nên trước khi đến ngưỡng đó cần dùng vector load/store 256-bit.

  • Việc đã chuyển bài viết cho đúng người

    Một người dùng cho biết họ đã chuyển bài viết này đến đúng những người cần xem.