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> | ||||
| 
 | ||||
| 	* file.c (rb_file_size, rb_file_flock): improve performance of Winodws. | ||||
|  |  | |||
|  | @ -1,52 +1,83 @@ | |||
| require 'objspace' | ||||
| 
 | ||||
| # | ||||
| # purpose: | ||||
| #  Profile memory usage of each tests. | ||||
| # | ||||
| # usage: | ||||
| #   RUBY_TEST_ALL_PROFILE=true make test-all | ||||
| #   RUBY_TEST_ALL_PROFILE=[file] make test-all | ||||
| # | ||||
| # output: | ||||
| #   ./test_all_profile | ||||
| #   [file] specified by RUBY_TEST_ALL_PROFILE | ||||
| #   If [file] is 'true', then it is ./test_all_profile | ||||
| # | ||||
| # collected information: | ||||
| #   - ObjectSpace.memsize_of_all | ||||
| #   - 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 | ||||
|   alias orig_run run | ||||
| 
 | ||||
|   $test_all_profile_out = open('test_all_profile', 'w') | ||||
|   $test_all_profile_gc_stat_hash = {} | ||||
|   file = ENV['RUBY_TEST_ALL_PROFILE'] | ||||
|   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') | ||||
|     # for Linux (only?) | ||||
|     $test_all_profile_out.puts "name\tmemsize_of_all\t" + | ||||
|                                  (GC.stat.keys + | ||||
|                                   %w(size resident share text lib data dt)).join("\t") | ||||
|     add *%w(size resident share text lib data dt) do |result| | ||||
|       result.concat File.read('/proc/self/statm').split(/\s+/) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|     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")}\t" \ | ||||
|       "#{File.read('/proc/self/statm').split(/\s+/).join("\t")}" | ||||
|     end | ||||
|   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 | ||||
|   def memprofile_test_all_result_result | ||||
|     result = ["#{self.class}\##{self.__name__}"] | ||||
|     TEST_ALL_PROFILE_PROCS.each{|proc| | ||||
|       proc.call(result) | ||||
|     } | ||||
|     result.join("\t") | ||||
|   end | ||||
| 
 | ||||
|   def run runner | ||||
|     result = orig_run(runner) | ||||
|     $test_all_profile_out.puts memprofile_test_all_result_result | ||||
|     $test_all_profile_out.flush | ||||
|     TEST_ALL_PROFILE_OUT.puts memprofile_test_all_result_result | ||||
|     TEST_ALL_PROFILE_OUT.flush | ||||
|     result | ||||
|   end | ||||
| 
 | ||||
|   TEST_ALL_PROFILE_OUT.puts TEST_ALL_PROFILE_BANNER.join("\t") | ||||
| end | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ end | |||
| 
 | ||||
| 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 ZombieHunter | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 ko1
						ko1