2010-02-17 35 views
5

Tôi đang tìm kiếm một ví dụ trực tuyến thể hiện một bộ đếm thời gian bằng ruby ​​và đi qua đoạn mã bên dưới. Nó hoạt động như mong đợi nhưng nó có ý nghĩa rằng chương trình đơn giản này sử dụng 30Mo bộ nhớ (như được hiển thị trong cửa sổ công việc quản lý) và cách quá nhiều CPU?Timer trong hiệu suất Ruby

Thanks a lot

def time_block 
    start_time = Time.now 
    Thread.new { yield } 
    Time.now - start_time 
end 

def repeat_every(seconds) 
    while true do 
    time_spent = time_block { yield } # To handle -ve sleep interaval 
    sleep(seconds - time_spent) if time_spent < seconds 
    end 
end 

repeat_every(5) { 
} 
+1

Tôi không thể tưởng tượng mã đó có ý nghĩa như thế nào ... Chủ đề không bao giờ tham gia, vì vậy time_spent sẽ luôn là 0 và vòng lặp chỉ chồng lên luồng chạy song song nếu khối lượng công việc mất hơn 5 giây. – hurikhan77

+0

Cảm ơn hurikhan77, bạn có nhớ chỉ cho tôi một tài liệu hoặc một cuốn sách về chủ đề vì vậy tôi không phải đặt câu hỏi ngu ngốc;)? – Elsanto

+0

http://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html –

Trả lời

11

Như đã đề cập trong các ý kiến ​​cho câu hỏi, tất cả những gì cần thiết để làm cho nó làm việc là bạn tham gia vào các chủ đề:

#!/usr/bin/ruby1.8 

def repeat_every(interval, &block) 
    loop do 
    start_time = Time.now 
    Thread.new(&block).join 
    elapsed = Time.now - start_time 
    sleep([interval - elapsed, 0].max) 
    end 
end 

repeat_every(5) do 
    puts Time.now.to_i 
end 

# => 1266437822 
# => 1266437827 
# => 1266437832 
... 

Tuy nhiên, vì nó ngồi , không có lý do gì để sử dụng các chuỗi cho câu hỏi trong câu hỏi:

def repeat_every(interval) 
    loop do 
    start_time = Time.now 
    yield 
    elapsed = Time.now - start_time 
    sleep([interval - elapsed, 0].max) 
    end 
end 

repeat_every(5) do 
    puts Time.now.to_i 
end 

# => 1266437911 
# => 1266437916 
# => 1266437921 

Bây giờ, nếu bạn muốn là chủ đề thứ tại một thời điểm nào đó, để chương trình chính có thể làm một cái gì đó khác, sau đó bạn sẽ quấn toàn bộ vòng lặp đó trong một chuỗi.

def repeat_every(interval) 
    Thread.new do 
    loop do 
     start_time = Time.now 
     yield 
     elapsed = Time.now - start_time 
     sleep([interval - elapsed, 0].max) 
    end 
    end 
end 

thread = repeat_every(5) do 
    puts Time.now.to_i 
end 
puts "Doing other stuff..." 
thread.join 

# => 1266438037 
# => Doing other stuff... 
# => 1266438042 
# => 1266438047 
+0

Cảm ơn rất nhiều Wayne. Câu hỏi cuối cùng: mã vẫn chiếm 30Mo trong bộ nhớ ảo trong cửa sổ, điều đó có bình thường không? Cảm ơn rất nhiều! – Elsanto

+0

@Elsanto, tôi không biết điều gì bình thường trong Windows. Trong Linux, "ngủ 10; thoát" chiếm khoảng 9MB; mã trên, khoảng 16MB. –

+0

Mất nhiều bộ nhớ vì Ruby là một ngôn ngữ động chạy trên Máy ảo Ruby. Nếu bạn dịch nó thành C, tôi đặt cược bạn sẽ không nhận được hơn 1 Mb bộ nhớ usag (trừ khi bạn có rò rỉ bộ nhớ). Nhưng trong một thế giới mà 8.000.000 Mb chi phí khoảng 50 đô la, tôi nghĩ rằng 30 Mb ($ 0,0001875 dllrs) không phải là một vấn đề. –