Để có hiệu suất tối ưu, bạn có thể chỉ cần sử dụng một chuỗi thời lượng dài thay vì danh sách.
Chúng tôi đã có yêu cầu tương tự tại một thời điểm để triển khai trình ước tính thời gian tải xuống và chúng tôi đã sử dụng bộ đệm tròn để lưu tốc độ trên mỗi N
giây cuối cùng.
Chúng tôi không quan tâm đến tốc độ tải xuống trong toàn bộ thời gian, chỉ mất khoảng thời gian dự kiến dựa trên hoạt động gần đây nhưng không phải là số vì vậy gần đây. chẳng hạn như nếu chúng ta chỉ sử dụng giây cuối cùng để tính toán nó).
Lý do chúng tôi không quan tâm đến toàn bộ khung thời gian là tải xuống có thể 1M/s trong nửa giờ sau đó chuyển lên 10M/giây trong mười phút tiếp theo. Nửa giờ đầu tiên đó sẽ giảm tốc độ trung bình khá nghiêm trọng, mặc dù thực tế bạn đang tải xuống khá nhanh.
Chúng tôi đã tạo bộ đệm tròn với mỗi ô giữ số tiền được tải xuống trong khoảng thời gian 1 giây. Kích thước bộ đệm tròn là 300, cho phép 5 phút dữ liệu lịch sử, và mỗi ô được khởi tạo bằng không. Trong trường hợp của bạn, bạn sẽ chỉ cần mười tế bào.
Chúng tôi cũng duy trì tổng số (tổng của tất cả các mục trong bộ đệm, do đó ban đầu là 0) và số đếm (ban đầu bằng không, rõ ràng).
Mỗi giây, chúng ta sẽ tìm ra bao nhiêu dữ liệu đã được tải về từ giây cuối cùng và sau đó:
- trừ ô hiện từ tổng số.
- đặt hình hiện tại vào ô đó và tiến lên con trỏ của ô.
- thêm con số hiện tại đó vào tổng số.
- tăng số lượng nếu nó không phải là 300.
- cập nhật hình được hiển thị cho người dùng, dựa trên tổng số/số.
Về cơ bản, trong pseudo-code:
def init (sz):
buffer = new int[sz]
for i = 0 to sz - 1:
buffer[i] = 0
total = 0
count = 0
index = 0
maxsz = sz
def update (kbps):
total = total - buffer[index] + kbps # Adjust sum based on deleted/inserted values.
buffer[index] = kbps # Insert new value.
index = (index + 1) % maxsz # Update pointer.
if count < maxsz: # Update count.
count = count + 1
return total/count # Return average.
Điều đó sẽ dễ dàng thích nghi với yêu cầu riêng của bạn. Tổng hợp là một tính năng tuyệt vời cho thông tin "bộ nhớ cache" có thể làm cho mã của bạn nhanh hơn. Ý tôi là: nếu bạn cần tính tổng hoặc trung bình, bạn chỉ có thể làm việc khi dữ liệu thay đổi và sử dụng các phép tính cần thiết tối thiểu.
Phương án thay thế sẽ là một hàm được cộng tất cả mười số khi được yêu cầu, cái gì đó sẽ chậm hơn số đơn trừ/thêm khi tải giá trị khác vào bộ đệm.
Có gì sai khi sử dụng trình thu thập thông tin? –
@ Brandon, tôi dự định sử dụng giá trị trung bình để hiển thị cho người dùng, dưới dạng chỉ báo về việc phân tích cú pháp đối tượng đang phân tích bao lâu. Đây là một phần của tiện ích dịch thuật đồ họa. – JYelton