Tôi sẽ lật vấn đề: không giới hạn vòng lặp thành N lần trong một giây. Thay vào đó, xử lý N đơn vị công việc phân bố đồng đều trong thời gian mong muốn.
Đó là, tính toán bao nhiêu thời gian đã trôi qua kể từ bắt đầu (hoặc công việc trước đây), suy đó vào tỷ lệ công việc, và làm điều đó nhiều việc (yếu tố đầu/trước thời gian và số lượng công việc đã được thực hiện). Đây là nền tảng cơ bản của nhiều công cụ trò chơi/hoạt hình - một số "delta time".
Sau đó gọi yield
ở cuối mỗi vòng lặp để "đẹp" - hay đúng hơn, để tránh ăn 99% + mức sử dụng CPU! Bản thân năng suất có độ phân giải tối thiểu , nhưng hiệu ứng nói chung là thích hợp, đặc biệt là khi nội suy phù hợp.
Vì cách tiếp cận nội suy được sử dụng, nên làm việc cho tất cả N (có thể chạy trong thời gian quy định), ngay cả khi nó có nghĩa là thực hiện nhiều vòng lặp N. Nó cũng có thể là không có công việc nào có thể được thực hiện bất kỳ vòng lặp cụ thể cho một N nhỏ nhưng yield
làm cho loại "thêm bận rộn looping" giá rẻ về sử dụng CPU .
Dưới đây là một số mã giả để in ra 20 "x" s trong một giây, nơi now
lợi nhuận giây phân đoạn:
rate = 20 // per second - "N times per second"
done = 0
goal = 1 * rate // same as rate for 1 second
start = now()
while done < goal:
target = floor((now() - start) * rate)
work = (target - done) // work might be 0, that's okay
for 0 upto work:
print("x")
done += work
yield()
Trong trường hợp này nó rất dễ dàng để suy ra từ khi bắt đầu thời gian vì công thức tỷ lệ không đổi.Sử dụng "thời gian delta" dựa trên thời gian kể từ khi công việc cuối cùng (hoặc vòng lặp) là tương tự và phù hợp khi không có công thức riêng biệt, nhưng hơi phức tạp hơn và có thể dẫn đến lỗi trôi dạt tinh tế.
Độ phân giải thời gian của một thực tếsleep/yield
là thực hiện phụ thuộc và thay đổi theo bởi hệ thống. Ví dụ: nó có thể nằm trong khoảng từ 1ms on Linux to 10-15ms on windows.
Trong Ngoài đối phó với một vùng đồng bằng thời gian, giai đoạn sleep
có thể được thay đổi, như mỗi câu trả lời Dariusz Wawer của. Tuy nhiên, điều này làm tăng thêm độ phức tạp và đơn giản là yield
thường đủ.
Nếu đây chỉ là bài tập về nhà, bạn có thể sử dụng một vòng lặp bận rộn kiểm tra thời gian hiện tại trong mỗi lần lặp –
Bạn không thể chắc chắn chính xác có bao nhiêu lần một chu kỳ kéo dài trong vòng lặp của bạn trong một phút nếu bạn đang nói về thường xuyên của hệ điều hành. Để chắc chắn bạn cần một RTOS hoặc đoán nó bằng cách đo thời gian giữa mỗi chu kỳ. –
Bạn có muốn nó chạy mọi số lượng N trong 1 giây hoặc nhiều nhất là N trong 1 giây? – Adrian