2011-11-20 37 views
8

Các benchmark mất một khối và trả về thời gian: http://ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.htmlBenchmarking một hoạt động ruby ​​trả về giá trị

require 'benchmark' 
puts Benchmark.measure { "a"*1_000_000 } 

gì nếu bạn muốn chuẩn phẫu thuật và có được cả hai giá trị trả về và thời gian trôi qua?

Hoặc, đã nêu một cách khác, việc đóng cửa có thể sửa đổi một đối tượng được truyền vào nó không?

Trả lời

9

Một đóng cửa có thể sửa đổi các đối tượng trong phạm vi của nó, như thế này:

require 'benchmark' 

a = nil 
puts Benchmark.measure { a = "a" * 1_000_000 } 
puts a.size 

# => 0.000000 0.000000 0.000000 ( 0.004865) 
# => 1000000 
+0

Vì vậy, các bao đóng có một con trỏ có thể ghi vào những gì được truyền cho chúng? Và đóng cửa cũng có thể sửa đổi @a và @@ a, giả sử rằng những điều đó được định nghĩa bên ngoài việc đóng cửa. – justingordon

+0

@justingordon: Có, họ có thể. – Miikka

+3

Yuck. Tôi thực sự muốn Benchmark sẽ trả về một cái gì đó như: '[thời gian, kết quả]'. Sau đó, bạn có thể: 'time, a = Benchmark.measure {...}' – devth

0

Với https://github.com/igorkasyanchuk/benchmark_methods

Không có mã như thế này:

t = Time.now 
user.calculate_report 
puts Time.now - t 

Bây giờ bạn có thể làm:

benchmark :calculate_report # in class 

Và chỉ cần gọi phương thức của bạn

user.calculate_report 
Các vấn đề liên quan