Q: Nếu một máy tính có thể thực thi hàng triệu tập lệnh trong một giây, làm sao mà lệnh for (int i = 0; i < 1000000; i++) { cout << 1; } chạy mãi không xong?
A: Steve Baker, Blogger của LetsRunWithIt.com từ 2013
Nếu cậu đã từng viết chương trình này với ngôn ngữ C hoặc C++, ví dụ nhé:
for (int i = 0; i < 1000000; i++) x += i;
( để ý là tôi sửa code của cậu thành cộng tổng tất cả các số từ 0 đến 1 triệu, sẽ khác rất nhiều so với in hết ra màn hình )
… và khi biên dịch nó thành mã máy thì máy tính phải làm các công việc sau:
· Kiểm tra xem i có nhỏ hơn 1 triệu hay không
· Cộng i vào x
· Cộng 1 vào i
· Trở về bước 1 và làm lại
Vậy là 4 lệnh mã máy – mỗi lệnh lặp 1 triệu lần – tổng là 4 triệu tập lệnh. Và vì máy tính của cậu có thể xử lý hàng tỉ tập lệnh mỗi giây, sẽ rất nhanh đấy.. dưới 1 mili giây đối với máy tính hiện đại
Bây giờ… giả sử cậu dùng C hoặc C++ biên dịch lệnh thành mã máy, nhưng cậu đã viết là:
for (int i = 0; i < 1000000; i++) cout << i ;
Nhìn qua thì “cout << i;” nhìn không khó hơn so với x += i;, nhưng sự thật là có !!
Thử nhìn vào những gì máy tính sẽ phải làm theo thứ tự để chạy 1 vòng lặp trong đoạn mã của cậu:
· Kiểm tra xem nếu i có đang nhỏ hơn 1 triệu không
· Cộng 1 vào i
· Gửi i vào đầu ra tiêu chuẩn – thứ tự như sau:
o Chuyển đổi số i thành một chuỗi chữ cái ASCII hệ thập phân và cộng thêm một kí tự rỗng... đòi hỏi một hàm khá phức tạp có nhiệm vụ kiểm tra xem số đó có âm hay không và sau đó chạy một vòng lặp làm nhiệm vụ kiểu như chia i liên tục cho 10 và cộng mã ASCII cho số ‘0’ với mỗi chữ số. Việc này tốn đâu đó vào khoảng vài trăm đoạn mã máy – số càng to thì càng lặp nhiều.
o Gửi chuỗi chữ số đến luồng “đầu ra tiêu chuẩn” – thứ bao gồm một vòng lặp khác sao chép mỗi kí tự ASCII vào trong bộ đệm của luồng cout. Một tá các tập lệnh nữa.
o Kiểm tra bộ đệm có đầy hay không – thứ luôn có khả năng xảy ra sau vài trăm vòng lặp – và nếu nó xảy ra…
o Gửi bộ đệm đến cửa sổ hệ thống… vài trăm tập lệnh nữa
o Cửa sổ hệ thống nhận diện cửa sổ màn hình sẽ nhận thông tin từ bộ đệm
o Tìm kiếm phông chữ đang được sử dụng
o Kiểm tra xem nếu chuỗi kí tự có chứa mấy cái đặc biệt như tab, backspaces và xuống dòng – hoặc nếu nó muốn in đậm in nghiêng các kiểu con đà điểu
o Nó có thể quyết định xem cửa sổ có phải kéo cửa sổ lên đúng dòng không – và sẽ phải cập nhật lại thanh kéo và di chuyển tất cả những thứ khác. Bởi vì cậu có thể tùy ý lăn lên xuống cửa sổ với con chuột – còn phải lưu vài đoạn văn bản ở đâu đó để cậu có thể lăn trở lại xem nó trên cửa sổ ( mất hàng triệu tập lệnh !!)
o Tiếp tục, lại phải gọi đến thằng driver hiển thị cho card đồ họa của cậu
o Thứ sẽ dẫn đến việc tế nhân hệ điều hành lên bảo nó lưu lại trạng thái chương trình ( vài trăm tập lệnh nữa )
o Dẫn tiếp đến việc lại phải ngó xem có thằng chương trình nào khác chạy không (thêm chục triệu tập lệnh !!).
o Hơn nữa, mệnh lệnh vẽ điểm ảnh chính xác giá trị thập phân của ‘i’ xếp hàng ngay ngắn để chui vào chip xử lý hình ảnh GPU lại tốn thêm vài trăm tập lệnh
o Khi GPU rảnh rồi (tốn 1 khoảng thời gian nếu có chương trình khác cũng đang vẽ các thứ khác), dữ liệu cập nhật cửa sổ màn hình được gửi tới GPU thông qua cơ chế “DMA”
o Trả về tất cả đống bên trên cho hệ điều hành và chờ đợi đến lượt chương trình cập nhật trạng thái tiếp theo
o Và CUỐI CÙNG…
· Nhảy về bước 1 và làm lại tất cả đống kinh khủng tởm phía trên
Đó vấn đề là trong khi vòng lặp trông vẫn chỉ mất vài triệu tập lệnh để thực thi – nhưng thứ thực sự ẩn giấu bên trong nó – một chuỗi phản ứng khổng lồ vô cùng khó nuốt !!
Đó là một bài học sơ khai của Lập trình – vào ra chắc chắn là thứ xa xỉ nhất mà 1 chương trình phải thực hiện
Đây không phải là khả năng duy nhất – cậu có thể chuyển hướng luồng ra tiêu chuẩn đến một file trong ổ cứng… thứ sẽ dẫn đến một vụ nổ còn khổng lồ hơn…
À mà tất nhiên trên thực tế, mấy thứ kiểu game – tất cả quá trình phải được cắt ngắn lại bằng bất kì giá nào thông qua giao tiếp dù lớn hay nhỏ, trực tiếp đến chip xử lý hình ảnh – bỏ qua hầu hết quá trình kinh khủng tởm kia.
Chốt, máy tính nhanh điên rồ và cũng phức tạp điên rồ luôn !!
ABOUT THE AUTHOR
tôi là ai . tỉnh nguyễn
0 nhận xét:
Đăng nhận xét