Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1. class Benchwarmer
  2. attr_reader :results
  3.  
  4. class << self
  5. def run(options = {gc: :enable})
  6. if options[:gc] == :disable
  7. GC.disable
  8. elsif options[:gc] == :enable
  9. # collect memory allocated during library loading
  10. # and our own code before the measurement
  11. GC.start
  12. end
  13.  
  14. memory_before = memory_snapshot
  15.  
  16. gc_stat_before = GC.stat
  17. time = Benchmark.realtime do
  18. yield
  19. end
  20.  
  21. gc_stat_after = GC.stat
  22. GC.start if options[:gc] == :enable
  23.  
  24. memory_after = memory_snapshot
  25.  
  26. new(
  27. {
  28. ruby_version: RUBY_VERSION,
  29. time: time.round(2),
  30. gc: options[:gc],
  31. gc_count_after: gc_stat_after[:count].to_i,
  32. gc_count_before: gc_stat_before[:count].to_i,
  33. memory_after: memory_after,
  34. memory_before: memory_before
  35. }
  36. )
  37. end
  38.  
  39. private
  40.  
  41. def memory_snapshot
  42. `ps -o rss= -p #{Process.pid}`.to_i/1024
  43. end
  44. end
  45.  
  46.  
  47. def initialize(results)
  48. @results = results
  49. end
  50.  
  51. def gc
  52. @results[:gc]
  53. end
  54.  
  55. def time(round_by:2)
  56. @results[:time].round(round_by)
  57. end
  58.  
  59. def gc_count
  60. @results[:gc_count_after] - @results[:gc_count_before]
  61. end
  62.  
  63. def ruby_version
  64. @results[:ruby_version]
  65. end
  66.  
  67. def memory
  68. @results[:memory_after] - @results[:memory_before]
  69. end
  70.  
  71. def save_report(location:nil, name:, format: nil)
  72.  
  73. location = location.nil? ? "#{Rails.root}/benchmarks" : "#{Rails.root}/#{location}"
  74. output = print_report(format: format)
  75. extension = format == :json ? 'json' : 'txt'
  76. file_name = "#{name}.#{extension}"
  77.  
  78. File.open("#{location}/#{file_name}", "w+") do |f|
  79. f.puts output
  80. end
  81. end
  82.  
  83. def report
  84. {
  85. ruby_version: ruby_version,
  86. gc: gc.to_s,
  87. time: time,
  88. gc_count: gc_count,
  89. memory: "%d MB" % memory
  90. }
  91. end
  92.  
  93. def print_report(format: nil)
  94. return "Please choose :json, :text" unless [:json, :text, nil].include?(format)
  95. return text_report unless format == :json
  96. json_report
  97. end
  98.  
  99. private
  100.  
  101. def text_report
  102. printed_report = ""
  103. report.each { |k, v| printed_report << "#{k}: #{report.fetch(k)} " }
  104. printed_report
  105. end
  106.  
  107. def json_report
  108. report.to_json
  109. end
  110.  
  111.  
  112. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement