2011-02-21 61 views
6

Tôi đang tìm cách cải thiện bộ thu gom rác D bằng cách thêm một số chẩn đoán để tránh việc thu gom rác thải không có khả năng dẫn đến việc giải phóng đáng kể. Một heuristic tôi muốn thêm là GC không nên chạy nhiều hơn một lần cho mỗi khoảng thời gian X (có thể một lần mỗi giây hoặc lâu hơn). Để thực hiện việc này, tôi cần bộ hẹn giờ có các thuộc tính sau:Bộ hẹn giờ nhanh, đa nền tảng?

  1. Phải có thời gian chính xác với chi phí tối thiểu. Gọi số core.stdc.time mất một khoảng thời gian tương đương với phân bổ bộ nhớ nhỏ, do đó, nó không phải là một lựa chọn tốt.

  2. Lý tưởng nhất, nên là nền tảng chéo (cả hệ điều hành và CPU), để bảo trì sự đơn giản.

  3. Độ phân giải siêu cao không quá quan trọng. Nếu thời gian chính xác có thể là 1/4 trong một giây, điều đó là đủ tốt.

  4. Phải hoạt động trong ngữ cảnh đa luồng/đa CPU. Hướng dẫn x86 rdtsc sẽ không hoạt động.

EDIT: Hàm C cũ đơn giản clock() có vẻ đủ nhanh. Tuy nhiên, ở đây tràn là một vấn đề. Trên Windows và Linux 32 bit, clock_t được định nghĩa là số nguyên có ký hiệu 32 bit. Khi nó tràn, nó có trở thành tiêu cực hay không, hoặc chức năng clock() có sử dụng logic bổ sung để làm cho nó được bọc bằng không? Nếu nó kết thúc tốt đẹp bằng không, thì điều này sẽ thực hiện thủ thuật. Nếu nó kết thúc thành tiêu cực (cũng đại diện cho mã lỗi, vv) thì nó sẽ không hoạt động.

Chỉnh sửa # 2: Tôi đã thử phương pháp heuristic bằng cách nào đó, sử dụng clock() và bỏ qua vấn đề tràn, giống như thử nghiệm. Nó hoạt động rất kém đến nỗi nó không đáng để điều tra thêm.

Trả lời

3

Lý tưởng nhất, nên là nền tảng chéo (cả hệ điều hành và CPU), để bảo trì sự đơn giản.

Tôi nghĩ rằng sẽ đưa bạn đến bất cứ điều gì bạn có thể tìm thấy trong thư viện C chuẩn.

Có lẽ clock?

3

Vâng, đề xuất đầu tiên của tôi là sử dụng core.time hoặc std.datetime. Nó có một StopWatch. Nó không đủ nhanh sao? Nó sử dụng bất cứ điều gì đồng hồ đơn điệu tiêu chuẩn là cho hệ thống, và tôi sẽ hy vọng rằng đó sẽ là đủ nhanh. Đó chắc chắn là độ chính xác cao nhất mà bạn sẽ nhận được (mặc dù độ chính xác cao ảnh hưởng đến tốc độ như thế nào, tôi không biết). Tuy nhiên, nếu nó không đủ nhanh, tôi không chắc chắn rằng các lựa chọn khác của bạn là tốt hơn. Nó thường là trường hợp bạn có được độ chính xác thứ hai hoặc độ chính xác cao. Không có nhiều ở giữa. Và với độ chính xác cao, nó thường có độ chính xác tối thiểu là một phần nghìn giây với câu hỏi là nó vượt xa mức độ mà nó đi xa. Độ chính xác 1/4 giây không chính xác bình thường.

Đề xuất của Cybershadow là clock có thể là mẹo - chắc chắn đó là lựa chọn duy nhất của bạn là tiêu chuẩn C theo như tôi biết - nhưng có thể hoặc không đủ nhanh.

Ngoài clock ... Trên Linux, nếu bạn muốn có cách không đơn điệu để có thời gian với độ chính xác cao hơn một giây, tôi tin rằng gettimeofday là lựa chọn duy nhất của bạn, nhưng tôi không biết nó là.Trên Windows, giải pháp không đơn điệu tốt nhất mà tôi biết là getSystemTimeAsFiletime, nhưng Windows có several time functions mà bạn có thể chơi cùng.

Bạn có thể xem số Clock.currStdTime của std.datetime để xem cách thực hiện (mặc dù nó sử dụng clock_gettime trên Posix nếu có sẵn, đó là những gì core.time sử dụng - mặc dù với một đồng hồ khác - vì vậy bạn có thể muốn else phần chức năng đó cho Linux nếu StopWatch quá chậm đối với bạn). Tuy nhiên, nó chuyển đổi thành hnsecs từ nửa đêm ngày 1 tháng 1, 1 giờ sáng, do đó, tùy thuộc vào những gì bạn làm với số, bạn sẽ muốn bỏ qua phần đó của phép tính.

+0

Tôi không muốn báo động bất kỳ ai, nhưng tôi đã đọc một số bài viết về vấn đề QueryPerformanceCounter trên Windows (StopWatch sử dụng nó trong quá trình triển khai). Chỉnh sửa: Tôi tiếp tục quên nhấn shift + enter và tôi kết thúc đăng .. Xin lỗi. Dưới đây là một vài điều: http://support.microsoft.com/kb/895980 http://www.virtualdub.org/blog/pivot/entry.php?id=106 https: // jongampark.wordpress.com/2008/04/19/weirdness-of-the-high-resolution-counter-ie-queryperformancecounter/ –

+0

Đây là một số khác: http://www.mindcontrol.org/~hplus/pc-timers. html –

+0

Tôi sẽ xem xét các liên kết này sau, nhưng theo như tôi biết, 'QueryPerformanceCounter' hoạt động tốt cho công cụ định thời gian. Nó đang cố gắng sử dụng nó để có được thời gian hiện tại là một vấn đề lớn. Nếu bạn cố gắng và làm điều đó, kết quả của bạn trôi dạt, rõ ràng là xấu. –

Các vấn đề liên quan