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.

Phạm Văn Hoàng viết 23:12 ngày 30/09/2018

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.

Tú Anh Hoàng viết 23:22 ngày 30/09/2018

Chắc so với 1 sẽ nhanh hơn với n

X viết 23:21 ngày 30/09/2018

Đ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

Văn Dương viết 23:20 ngày 30/09/2018

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.

Phuc Tran viết 23:13 ngày 30/09/2018

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.

Gió viết 23:17 ngày 30/09/2018

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ó.

Truong Pham viết 23:27 ngày 30/09/2018

Chắc bạn này học UET và cùng lớp mạng máy tính với mình

Lê Tuấn Anh viết 23:18 ngày 30/09/2018

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ơn block 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

Bài liên quan
0