mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* test/profile_test_all.rb: refactoring memory profiling tool for
test-all. Add profiling targets /proc/meminfo and /proc/self/status. * test/runner.rb: accept other than 'true'. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42584 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d51138ddad
commit
769715bda5
3 changed files with 66 additions and 27 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
Fri Aug 16 17:32:02 2013 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* test/profile_test_all.rb: refactoring memory profiling tool for
|
||||||
|
test-all.
|
||||||
|
Add profiling targets /proc/meminfo and /proc/self/status.
|
||||||
|
|
||||||
|
* test/runner.rb: accept other than 'true'.
|
||||||
|
|
||||||
Fri Aug 16 11:23:35 2013 NAKAMURA Usaku <usa@ruby-lang.org>
|
Fri Aug 16 11:23:35 2013 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||||
|
|
||||||
* file.c (rb_file_size, rb_file_flock): improve performance of Winodws.
|
* file.c (rb_file_size, rb_file_flock): improve performance of Winodws.
|
||||||
|
|
|
@ -1,52 +1,83 @@
|
||||||
require 'objspace'
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# purpose:
|
# purpose:
|
||||||
# Profile memory usage of each tests.
|
# Profile memory usage of each tests.
|
||||||
#
|
#
|
||||||
# usage:
|
# usage:
|
||||||
# RUBY_TEST_ALL_PROFILE=true make test-all
|
# RUBY_TEST_ALL_PROFILE=[file] make test-all
|
||||||
#
|
#
|
||||||
# output:
|
# output:
|
||||||
# ./test_all_profile
|
# [file] specified by RUBY_TEST_ALL_PROFILE
|
||||||
|
# If [file] is 'true', then it is ./test_all_profile
|
||||||
#
|
#
|
||||||
# collected information:
|
# collected information:
|
||||||
# - ObjectSpace.memsize_of_all
|
# - ObjectSpace.memsize_of_all
|
||||||
# - GC.stat
|
# - GC.stat
|
||||||
# - /proc/self/statm (if it exists)
|
# - /proc/meminfo (some fields, if exists)
|
||||||
|
# - /proc/self/status (some fields, if exists)
|
||||||
|
# - /proc/self/statm (if exists)
|
||||||
#
|
#
|
||||||
|
|
||||||
|
require 'objspace'
|
||||||
|
|
||||||
class MiniTest::Unit::TestCase
|
class MiniTest::Unit::TestCase
|
||||||
alias orig_run run
|
alias orig_run run
|
||||||
|
|
||||||
$test_all_profile_out = open('test_all_profile', 'w')
|
file = ENV['RUBY_TEST_ALL_PROFILE']
|
||||||
$test_all_profile_gc_stat_hash = {}
|
file = 'test-all-profile-result' if file == 'true'
|
||||||
|
TEST_ALL_PROFILE_OUT = open(file, 'w')
|
||||||
|
TEST_ALL_PROFILE_GC_STAT_HASH = {}
|
||||||
|
TEST_ALL_PROFILE_BANNER = ['name']
|
||||||
|
TEST_ALL_PROFILE_PROCS = []
|
||||||
|
|
||||||
|
def self.add *name, &b
|
||||||
|
TEST_ALL_PROFILE_BANNER.concat name
|
||||||
|
TEST_ALL_PROFILE_PROCS << b
|
||||||
|
end
|
||||||
|
|
||||||
|
add 'emsize_of_all', *GC.stat.keys do |result|
|
||||||
|
result << ObjectSpace.memsize_of_all
|
||||||
|
GC.stat(TEST_ALL_PROFILE_GC_STAT_HASH)
|
||||||
|
result.concat TEST_ALL_PROFILE_GC_STAT_HASH.values
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.add_proc_meminfo file, fields
|
||||||
|
return unless FileTest.exist?(file)
|
||||||
|
regexp = /(#{fields.join("|")}):\s*(\d+) kB/
|
||||||
|
# check = {}; fields.each{|e| check[e] = true}
|
||||||
|
add *fields do |result|
|
||||||
|
text = File.read(file)
|
||||||
|
text.gsub(regexp){
|
||||||
|
# check.delete $1
|
||||||
|
result << $2
|
||||||
|
''
|
||||||
|
}
|
||||||
|
# raise check.inspect unless check.empty?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
add_proc_meminfo '/proc/meminfo', %w(MemTotal MemFree)
|
||||||
|
add_proc_meminfo '/proc/self/status', %w(VmPeak VmSize VmHWM VmRSS)
|
||||||
|
|
||||||
if FileTest.exist?('/proc/self/statm')
|
if FileTest.exist?('/proc/self/statm')
|
||||||
# for Linux (only?)
|
add *%w(size resident share text lib data dt) do |result|
|
||||||
$test_all_profile_out.puts "name\tmemsize_of_all\t" +
|
result.concat File.read('/proc/self/statm').split(/\s+/)
|
||||||
(GC.stat.keys +
|
end
|
||||||
%w(size resident share text lib data dt)).join("\t")
|
end
|
||||||
|
|
||||||
def memprofile_test_all_result_result
|
def memprofile_test_all_result_result
|
||||||
"#{self.class}\##{self.__name__}\t" \
|
result = ["#{self.class}\##{self.__name__}"]
|
||||||
"#{ObjectSpace.memsize_of_all}\t" \
|
TEST_ALL_PROFILE_PROCS.each{|proc|
|
||||||
"#{GC.stat($test_all_profile_gc_stat_hash).values.join("\t")}\t" \
|
proc.call(result)
|
||||||
"#{File.read('/proc/self/statm').split(/\s+/).join("\t")}"
|
}
|
||||||
end
|
result.join("\t")
|
||||||
else
|
|
||||||
$test_all_profile_out.puts "name\tmemsize_of_alls\t" + GC.stat.keys.join("\t")
|
|
||||||
def memprofile_test_all_result_result
|
|
||||||
"#{self.class}\##{self.__name__}\t" \
|
|
||||||
"#{ObjectSpace.memsize_of_all}\t" \
|
|
||||||
"#{GC.stat($test_all_profile_gc_stat_hash).values.join("\t")}"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def run runner
|
def run runner
|
||||||
result = orig_run(runner)
|
result = orig_run(runner)
|
||||||
$test_all_profile_out.puts memprofile_test_all_result_result
|
TEST_ALL_PROFILE_OUT.puts memprofile_test_all_result_result
|
||||||
$test_all_profile_out.flush
|
TEST_ALL_PROFILE_OUT.flush
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
TEST_ALL_PROFILE_OUT.puts TEST_ALL_PROFILE_BANNER.join("\t")
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,7 +12,7 @@ end
|
||||||
|
|
||||||
ENV["GEM_SKIP"] = ENV["GEM_HOME"] = ENV["GEM_PATH"] = "".freeze
|
ENV["GEM_SKIP"] = ENV["GEM_HOME"] = ENV["GEM_PATH"] = "".freeze
|
||||||
|
|
||||||
require_relative 'profile_test_all' if ENV['RUBY_TEST_ALL_PROFILE'] == 'true'
|
require_relative 'profile_test_all' if ENV.has_key?('RUBY_TEST_ALL_PROFILE')
|
||||||
|
|
||||||
module Test::Unit
|
module Test::Unit
|
||||||
module ZombieHunter
|
module ZombieHunter
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue