“Vòng lặp chặt chẽ” là gì?


77

Tôi đã nghe cụm từ đó rất nhiều. Nó có nghĩa là gì?

Một ví dụ sẽ hữu ích.


Bối cảnh mà bạn đọc điều này sẽ giúp chúng tôi hiểu câu hỏi của bạn. Bạn có thể cung cấp một trích dẫn, một liên kết hoặc một số gợi ý?
S.Lott

1
Tôi vừa nghe nói rằng nó đang bị cắt trong văn phòng. Tôi đã không hoàn toàn đăng ký bối cảnh. Tôi đoán rằng tôi chỉ hơi khó chịu bởi quá nhiều băng bó sắp diễn ra.
Frederick The Fool

1
Có thể là những người trong văn phòng chỉ đang phun ra những từ thông dụng ngẫu nhiên. Hay không. Bạn có thể hỏi họ ý nghĩa của họ.
S.Lott

Câu trả lời:


52

Từ Wiktionary :

  1. (máy tính) Trong hợp ngữ, một vòng lặp chứa ít lệnh và lặp lại nhiều lần.
  2. (máy tính) Một vòng lặp như vậy sử dụng nhiều I / O hoặc tài nguyên xử lý, không thể chia sẻ chúng một cách thích hợp với các chương trình khác đang chạy trong hệ điều hành.

Đối với trường hợp 1, nó có thể giống như

for (unsigned int i = 0; i < 0xffffffff; ++ i) {}

5
1) Ví dụ không phải là một vòng lặp chặt chẽ, đó là một NOP :) 2) Tôi chưa bao giờ thấy điều này ý nghĩa trong đời. Nghe có vẻ giống như một "con heo tài nguyên"
Karoly Horvath

2
một trình biên dịch (ish) thông minh với một số tối ưu hóa (ish) thông minh sẽ loại bỏ nó.
djh

1
Tiếp tục các ý kiến ​​trên, sẽ không phải while (condition == false) {}là một ví dụ tốt hơn?
jdrd

Tôi nghĩ rằng vòng lặp này và thậm chí cả vòng lặp @jdrd đã đăng sẽ chỉ sử dụng tất cả hiệu suất của một lõi CPU. Tại sao mọi người sử dụng nó?
Minh Nghĩa

31

Tôi nghĩ rằng cụm từ này thường được sử dụng để chỉ định một vòng lặp lặp lại nhiều lần và có thể có ảnh hưởng nghiêm trọng đến hiệu suất của chương trình - nghĩa là nó có thể sử dụng nhiều chu kỳ CPU. Thông thường bạn sẽ nghe thấy cụm từ này trong một cuộc thảo luận về tối ưu hóa.

Ví dụ, tôi nghĩ đến trò chơi, trong đó một vòng lặp có thể cần xử lý mọi pixel trên màn hình hoặc ứng dụng khoa học, nơi một vòng lặp đang xử lý các mục nhập trong các mảng điểm dữ liệu khổng lồ.


4
Một phần mã được thực thi thường xuyên có thể là một ứng cử viên tốt để tối ưu hóa, nhưng nói chung nó không phải là một vòng lặp chặt chẽ. Ngay cả khi nó được gọi thường xuyên - nếu việc gọi diễn ra qua một số lớp chức năng và đối tượng, nó không "chặt chẽ". Điều kiện vòng lặp và hướng dẫn vòng lặp cần phải thực sự chặt chẽ với nhau, mã trong cùng một tệp và cùng một vài dòng cho một "vòng lặp chặt chẽ".
foo

Tôi đã nghe loại vòng lặp được mô tả trong câu trả lời được gọi là "điểm nóng" trong một chương trình - một nơi mà việc tối ưu hóa được nhắm mục tiêu sẽ thành công. Chính vì lý do này, Sun đã đặt tên cho công nghệ biên dịch nhanh chóng theo hướng hồ sơ thích ứng của họ là "HotSpot".
Jeffrey Hantin

1
@foo: Chúng hoàn toàn không phải ở trong cùng một tệp. Trình biên dịch hiện đại hapilly có thể loại bỏ lớp trừu tượng thành không có gì ... (ví dụ: C ++ templates)
Karoly Horvath

13

Có một ví dụ điển hình về một vòng lặp chặt chẽ (~ vòng lặp vô hạn) trong video Jon Skeet và Tony the Pony .

Ví dụ là:

while(text.IndexOf("  ") != -1) text = text.Replace("  ", " ");

điều này tạo ra một vòng lặp chặt chẽ vì IndexOfbỏ qua một ký tự có độ rộng bằng không Unicode (do đó tìm thấy hai khoảng trắng liền kề) nhưng Replacekhông bỏ qua chúng (do đó không thay thế bất kỳ khoảng trắng liền kề nào).

Đã có những định nghĩa tốt trong các câu trả lời khác, vì vậy tôi không đề cập lại.


10

Một vòng lặp chặt chẽ là một vòng lặp thân thiện với bộ nhớ cache của CPU. Nó là một vòng lặp nằm trong bộ đệm chỉ dẫn, không phân nhánh và ẩn hiệu quả độ trễ tìm nạp bộ nhớ cho dữ liệu đang được xử lý.


5

Câu trả lời của SandeepJ là câu trả lời đúng trong ngữ cảnh của Thiết bị mạng (ví dụ: xem mục nhập Wikipedia trên hộp trung gian) xử lý các gói tin. Tôi muốn nói thêm rằng luồng / tác vụ đang chạy vòng lặp chặt chẽ sẽ cố gắng duy trì lịch trình trên một CPU duy nhất và không bị tắt ngữ cảnh.


4

Theo từ điển của Webster, "Một vòng lặp mã thực thi mà không giải phóng bất kỳ tài nguyên nào cho các chương trình khác hoặc hệ điều hành."

http://www.websters-online-dictionary.org/ti/tight+loop.html


Tôi đã thấy điều đó, nhưng bạn có thể minh họa bằng một ví dụ không?
Frederick The Fool

3
Trên thực tế, tôi không đồng ý với định nghĩa này. vì hầu hết các vòng lặp không giải phóng các tài nguyên như vậy, điều đó ngụ ý rằng hầu hết các vòng lặp là các vòng lặp chặt chẽ.

2

Từ kinh nghiệm, tôi nhận thấy rằng nếu bạn đang cố gắng thực hiện một vòng lặp chạy vô thời hạn, chẳng hạn như:

while(true)
{
    //do some processing
}

Một vòng lặp như vậy rất có thể sẽ luôn sử dụng nhiều tài nguyên. Nếu bạn kiểm tra mức sử dụng CPU và Bộ nhớ trong quá trình với vòng lặp này, bạn sẽ thấy rằng nó sẽ tăng vọt. Đó là ý tưởng mà một số người gọi là "vòng lặp chặt chẽ".


0

Nhiều môi trường lập trình ngày nay không cho lập trình viên gặp các điều kiện cần vòng lặp chặt chẽ, ví dụ như các dịch vụ web Java chạy trong một vùng chứa gọi mã của bạn và bạn cần giảm thiểu / loại bỏ các vòng lặp trong quá trình triển khai servlet. Các hệ thống như Node.js xử lý vòng lặp chặt chẽ và một lần nữa bạn nên giảm thiểu / loại bỏ các vòng lặp trong mã của riêng bạn. Chúng được sử dụng trong các trường hợp bạn có toàn quyền kiểm soát việc thực thi chương trình, ví dụ như hệ điều hành hoặc môi trường thời gian thực / nhúng. Trong trường hợp của một hệ điều hành, bạn có thể nghĩ rằng CPU đang ở trạng thái nhàn rỗi là lượng thời gian nó dành cho vòng lặp chặt chẽ vì vòng lặp chặt chẽ là nơi nó thực hiện kiểm tra xem các quy trình khác có cần chạy hay không. là các hàng đợi cần được phục vụ, vì vậy nếu không có tiến trình nào cần chạy và hàng đợi trống thì CPU chỉ quay vòng vòng và điều này tạo ra một chỉ báo tùy chọn về mức độ 'không bận rộn' của CPU. Một vòng lặp chặt chẽ nên được thiết kế như chỉ thực hiện kiểm tra để nó giống như một danh sách lớn các câu lệnh if .. then, vì vậy trong Assembly, nó sẽ chuyển thành toán hạng SO SÁNH và sau đó là một nhánh nên nó rất hiệu quả. Khi tất cả các lần kiểm tra dẫn đến không phân nhánh, vòng lặp chặt chẽ có thể thực thi hàng triệu lần mỗi giây. Hệ điều hành / hệ thống nhúng thường có một số phát hiện đối với sự cố CPU để xử lý các trường hợp trong đó một số quy trình không từ bỏ quyền kiểm soát CPU - việc kiểm tra loại sự cố này có thể được thực hiện trong vòng lặp chặt chẽ. Cuối cùng, bạn cần hiểu rằng một chương trình cần phải có một vòng lặp tại một thời điểm nào đó, nếu không, bạn không thể làm bất cứ điều gì hữu ích với CPU, vì vậy nếu bạn không bao giờ thấy cần phải có vòng lặp, đó là vì môi trường của bạn xử lý tất cả những điều đó cho bạn. CPU tiếp tục thực hiện các lệnh cho đến khi không còn gì để thực thi hoặc bạn gặp sự cố, vì vậy một chương trình như HĐH phải có một vòng lặp chặt chẽ để thực sự hoạt động nếu không nó sẽ chạy chỉ trong micro giây. Cuối cùng, bạn cần hiểu rằng một chương trình cần phải có một vòng lặp tại một thời điểm nào đó, nếu không, bạn không thể làm bất cứ điều gì hữu ích với CPU, vì vậy nếu bạn không bao giờ thấy cần phải có vòng lặp, đó là vì môi trường của bạn xử lý tất cả những điều đó cho bạn. CPU tiếp tục thực hiện các lệnh cho đến khi không còn gì để thực thi hoặc bạn gặp sự cố, vì vậy một chương trình như HĐH phải có một vòng lặp chặt chẽ để thực sự hoạt động, nếu không, nó sẽ chạy chỉ trong micro giây. Cuối cùng, bạn cần hiểu rằng một chương trình cần phải có một vòng lặp tại một thời điểm nào đó, nếu không, bạn không thể làm bất cứ điều gì hữu ích với CPU, vì vậy nếu bạn không bao giờ thấy cần phải có vòng lặp, đó là vì môi trường của bạn xử lý tất cả những điều đó cho bạn. CPU tiếp tục thực hiện các lệnh cho đến khi không còn gì để thực thi hoặc bạn gặp sự cố, vì vậy một chương trình như HĐH phải có một vòng lặp chặt chẽ để thực sự hoạt động nếu không nó sẽ chạy chỉ trong micro giây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.