30/09/2018, 21:11
[Đố] Đoạn lệnh nào chạy nhanh hơn?
Hôm nay học môn Mạng máy tính, thầy mình có đề cập tới một câu hỏi rất thú vị.
So sánh 2 đoạn lệnh sau, giải thích đoạn lệnh nào chạy nhanh hơn và vì sao?
// Block code 1
for (i = 1; i <= n; i++) { a[i] = 0; }
// Block code 2
for (i = n; i >= 1; i--) { a[i] = 0; }
Update 1:
Một dòng code làm sao nó nói lên dc gì, khi mà chưa có ngữ cảnh cho nó.
xl do thiếu nội dung : Mục đích của nó là gán 0 cho tất cả các phần tử của mảng a.
Bài liên quan
Mình nghĩ là đoạn lệnh 1 nhanh hơn. Phép trừ thì phải thêm bước chuyển về phép cộng với số âm nên chắc là sẽ chậm hơn.
Chắc so với 1 sẽ nhanh hơn với n
Đoạn 2 nhanh hơn. Vì điều kiện dừng nó chỉ so sánh với số 1 trong suốt quá trình lặp. Nhưng chênh lệch không đáng kể để quan tâm :v
Chạy bằng nhau . Và còn tuỳ ngôn ngữ, tuỳ trình biên dịch và tuỳ kiến trúc CPU.
Hình như là cái này liên quan đến cache, đại loại là để đọc a[1] thì 1 vùng nhớ từ a[1] trở đi sẽ được lấy và lưu trong cache memory, do đó những lần đọc các a[i] sau sẽ nhanh hơn.
Câu trả lời là không xác định.
Ai biết dc i có kiểu dữ liệu là gì? Ví như i có kiểu A nhưng chỉ khác overload operator++ và – một cách không bình thường như: sau khi overload operator i++ <=> i+=3, i-- <=> i=i-2 chẳng hạn.
Một dòng code làm sao nó nói lên dc gì, khi mà chưa có ngữ cảnh cho nó.
Chắc bạn này học UET và cùng lớp mạng máy tính với mình
mình nghĩ 2 đoạn lệnh này chạy như nhau, tất nhiên nó còn phụ thuộc kiến trúc tập lệnh (ISA) của lõi vi xử lý. Tuy nhiên thì hầu hết ISA của vi xử lý có cơ chế tính toán khá giống nhau là thực hiện so sánh với 0. (cụ thể ntn thì bạn tham khảo thêm tài liệu về kiến trúc máy tính, cơ chế các tập lệnh …)
Nhưng nếu thay ở
block code 2
như sau thì sẽ nhanh hơnblock code 1
:// Block code 2 for (i = n; i != 0; i--) { a[i] = 0; }
Lý do là vì trong các thanh ghi của vi xử lý đã có giá trị 0 nên không cần phải copy 1 giá trị integer ở nơi khác để so sánh như
block code 1
(Là giá trị n).Tham khảo: https://www.amazon.co.uk/Professional-Embedded-ARM-Development-Wrox/dp/111878894X/280-4948868-1221714?ie=UTF8&Version=1&entries=0 ở page 180, chapter 10: Writing Optimized C