4 tỷ câu lệnh if
- Gần đây khi đang lướt mạng xã hội, tôi bắt gặp ảnh chụp màn hình này trên tàu.
- Đoạn mã này là một ví dụ hoàn hảo về đánh đổi thời gian-bộ nhớ.
- Tôi muốn triển khai nó bằng ngôn ngữ C để tăng hiệu năng.
Cấu trúc mã
- Viết mã C để xác định số chẵn và số lẻ.
- Biên dịch với tối ưu hóa bị tắt.
- Chạy đúng với các số từ 0 đến 10, nhưng phát sinh vấn đề với các số lớn hơn.
Meta programming
- Dùng Python để meta programming các câu lệnh if.
- Tạo một chương trình xác định số chẵn và số lẻ cho số nguyên 8 bit.
Mở rộng lên 16 bit
- Mở rộng chương trình theo cùng cách cho số nguyên 16 bit.
- Tạo và biên dịch một tệp C khoảng 130k dòng.
Thử thách 32 bit
- Cố gắng mở rộng chương trình cho số nguyên 32 bit.
- Tạo một tệp C dung lượng 330GB, nhưng trình biên dịch thất bại do thiếu không gian heap.
- Do giới hạn của định dạng Portable Executable, không thể xử lý các tệp lớn hơn 4GB.
Tự viết mã máy
- Tự viết trực tiếp hàm
IsEven bằng hợp ngữ x86-64.
- Dùng Python để biên dịch thủ công mã máy.
Tạo tệp thực thi
- Tạo một tệp dung lượng 40GB để xác định số chẵn và số lẻ cho mọi số nguyên 32 bit.
- Ánh xạ tệp vào bộ nhớ và dùng con trỏ hàm để thực thi mã.
Sửa lỗi cuối cùng
- Thay bằng hàm
strtoul để giải quyết vấn đề phân tích số nguyên không dấu.
- Chương trình rất nhanh và trả về kết quả trong vòng 10 giây ngay cả với các số lớn.
Ý kiến của GN⁺
- Tầm quan trọng: Bài viết này giúp hiểu rõ khái niệm cơ bản của lập trình là đánh đổi thời gian-bộ nhớ. Đồng thời, đây cũng là một ví dụ tốt cho thấy mã không được tối ưu hóa ảnh hưởng thế nào đến hiệu năng thực tế.
- Điểm thú vị: Quá trình khám phá bằng thực nghiệm sự khác biệt hiệu năng giữa các ngôn ngữ lập trình và giới hạn của trình biên dịch khá thú vị. Đặc biệt, nỗ lực so sánh Python và C để cải thiện hiệu năng rất đáng xem.
- Bài học rút ra: Bài viết cho thấy rằng để giải quyết một vấn đề phức tạp, đôi khi những cách tiếp cận trông có vẻ kém hiệu quả lại có thể thực sự hữu ích. Đồng thời, nó cũng nhấn mạnh tầm quan trọng của việc tìm kiếm các giải pháp sáng tạo trong khoa học máy tính.
1 bình luận
Ý kiến Hacker News
Tóm tắt bình luận thứ nhất:
Tóm tắt bình luận thứ hai:
Tóm tắt bình luận thứ ba:
is-evenvàis-odd.npm installsẽ tải xuống một gói có kích thước 40GB.Tóm tắt bình luận thứ tư:
Tóm tắt bình luận thứ năm:
Tóm tắt bình luận thứ sáu:
Tóm tắt bình luận thứ bảy:
Tóm tắt bình luận thứ tám:
Tóm tắt bình luận thứ chín:
libdivide.Tóm tắt bình luận thứ mười: