Revamped the profiling setup.
This removes the need for dozens of standalone gnuplot scripts, adds extra profiling data and makes the actual profiling easier.
This commit is contained in:
parent
e54d77fc2f
commit
1c35317165
|
@ -0,0 +1,21 @@
|
||||||
|
# The `sample_file` variable should contain the path to the variable to plot.
|
||||||
|
|
||||||
|
set title sample_file
|
||||||
|
|
||||||
|
set xlabel "Time"
|
||||||
|
set ylabel "Memory (MB)"
|
||||||
|
|
||||||
|
set xdata time
|
||||||
|
set timefmt "%Y-%m-%dT%H:%M:%S"
|
||||||
|
|
||||||
|
set yrange [0:*]
|
||||||
|
|
||||||
|
set term qt persist size 900,600
|
||||||
|
set grid
|
||||||
|
|
||||||
|
set style line 1 lc rgb "#0060ad" lt 1 lw 2 pt 7 ps 1
|
||||||
|
|
||||||
|
plot sample_file \
|
||||||
|
using 1:($2 / 1024 ** 2) \
|
||||||
|
with linespoints ls 1 \
|
||||||
|
title "Memory"
|
|
@ -1,8 +1,7 @@
|
||||||
require_relative '../profile_helper'
|
require_relative '../profile_helper'
|
||||||
|
|
||||||
xml = read_big_xml
|
xml = read_big_xml
|
||||||
lexer = Oga::XML::Lexer.new(xml)
|
|
||||||
|
|
||||||
profile_memory('lexer/big_xml')
|
profile_memory('lexer/big_xml') do
|
||||||
|
Oga::XML::Lexer.new(xml).advance { }
|
||||||
lexer.advance { |tok| }
|
end
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
require_relative '../profile_helper'
|
require_relative '../profile_helper'
|
||||||
|
|
||||||
xml = read_big_xml
|
xml = read_big_xml
|
||||||
parser = Oga::XML::Parser.new(xml)
|
|
||||||
|
|
||||||
profile_memory('parser/big_xml')
|
profile_memory('parser/big_xml') do
|
||||||
|
Oga::XML::Parser.new(xml).parse
|
||||||
parser.parse
|
end
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
sample_file="$1"
|
||||||
|
plot_script="$2"
|
||||||
|
|
||||||
|
if [[ ! -f "$sample_file" ]]
|
||||||
|
then
|
||||||
|
echo "The sample file ${sample_file} does not exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f "$plot_script" ]]
|
||||||
|
then
|
||||||
|
echo "The gnuplot script ${plot_script} does not exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
gnuplot -e "sample_file='${sample_file}'" "${plot_script}"
|
|
@ -1,20 +0,0 @@
|
||||||
#!/usr/bin/env gnuplot
|
|
||||||
|
|
||||||
set title "Lexing 10MB of XML"
|
|
||||||
|
|
||||||
set xlabel "Sample"
|
|
||||||
set ylabel "Memory (MB)"
|
|
||||||
|
|
||||||
set yrange [0:*]
|
|
||||||
|
|
||||||
set term qt persist size 900,600
|
|
||||||
set grid
|
|
||||||
|
|
||||||
set style line 1 lc rgb "#0060ad" lt 1 lw 2 pt 7 ps 1
|
|
||||||
|
|
||||||
plot "profile/samples/lexer/big_xml.txt" \
|
|
||||||
using 0:($1 / 1024 ** 2) \
|
|
||||||
with linespoints ls 1 \
|
|
||||||
title "Memory"
|
|
||||||
|
|
||||||
# vim: set ft=gnuplot:
|
|
|
@ -1,20 +0,0 @@
|
||||||
#!/usr/bin/env gnuplot
|
|
||||||
|
|
||||||
set title "DOM parsing 10MB of XML"
|
|
||||||
|
|
||||||
set xlabel "Sample"
|
|
||||||
set ylabel "Memory (MB)"
|
|
||||||
|
|
||||||
set yrange [0:*]
|
|
||||||
|
|
||||||
set term qt persist size 900,600
|
|
||||||
set grid
|
|
||||||
|
|
||||||
set style line 1 lc rgb "#0060ad" lt 1 lw 2 pt 7 ps 1
|
|
||||||
|
|
||||||
plot "profile/samples/parser/big_xml.txt" \
|
|
||||||
using 0:($1 / 1024 ** 2) \
|
|
||||||
with linespoints ls 1 \
|
|
||||||
title "Memory"
|
|
||||||
|
|
||||||
# vim: set ft=gnuplot:
|
|
|
@ -1,20 +0,0 @@
|
||||||
#!/usr/bin/env gnuplot
|
|
||||||
|
|
||||||
set title "Pull parsing 10MB of XML"
|
|
||||||
|
|
||||||
set xlabel "Sample"
|
|
||||||
set ylabel "Memory (MB)"
|
|
||||||
|
|
||||||
set yrange [0:*]
|
|
||||||
|
|
||||||
set term qt persist size 900,600
|
|
||||||
set grid
|
|
||||||
|
|
||||||
set style line 1 lc rgb "#0060ad" lt 1 lw 2 pt 7 ps 1
|
|
||||||
|
|
||||||
plot "profile/samples/pull_parser/big_xml.txt" \
|
|
||||||
using 0:($1 / 1024 ** 2) \
|
|
||||||
with linespoints ls 1 \
|
|
||||||
title "Memory"
|
|
||||||
|
|
||||||
# vim: set ft=gnuplot:
|
|
|
@ -1,5 +1,10 @@
|
||||||
|
require 'timeout'
|
||||||
|
require 'time'
|
||||||
|
|
||||||
require_relative '../lib/oga'
|
require_relative '../lib/oga'
|
||||||
|
|
||||||
|
Thread.abort_on_exception = true
|
||||||
|
|
||||||
##
|
##
|
||||||
# Returns memory usage in bytes. This relies on the /proc filesystem, it won't
|
# Returns memory usage in bytes. This relies on the /proc filesystem, it won't
|
||||||
# work without it.
|
# work without it.
|
||||||
|
@ -20,22 +25,52 @@ def read_big_xml
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Writes memory samples to a file until the thread is killed.
|
# Runs the specified block for at least N seconds while profiling memory usage
|
||||||
|
# at semi random intervals.
|
||||||
#
|
#
|
||||||
# @param [String] name The name of the samples file.
|
# @param [String] name The name of the samples file.
|
||||||
# @param [Fixnum] interval The sample interval. The default is 200 ms.
|
# @param [String] duration The amount of seconds to run.
|
||||||
# @return [Thread]
|
|
||||||
#
|
#
|
||||||
def profile_memory(name, interval = 0.2)
|
def profile_memory(name, duration = 30)
|
||||||
return Thread.new do
|
monitor = true
|
||||||
|
threads = []
|
||||||
|
|
||||||
|
threads << Thread.new do
|
||||||
|
puts 'Starting sampler...'
|
||||||
|
|
||||||
path = File.expand_path("../samples/#{name}.txt", __FILE__)
|
path = File.expand_path("../samples/#{name}.txt", __FILE__)
|
||||||
handle = File.open(path, 'w')
|
handle = File.open(path, 'w')
|
||||||
handle.sync = true
|
handle.sync = true
|
||||||
|
|
||||||
loop do
|
while monitor
|
||||||
handle.write("#{memory_usage}\n")
|
usage = memory_usage
|
||||||
|
usage_mb = (usage / 1024 / 1024).round(2)
|
||||||
|
time = Time.now.strftime('%Y-%m-%dT%H:%M:%S')
|
||||||
|
|
||||||
sleep(interval)
|
handle.write("#{time} #{usage}\n")
|
||||||
|
|
||||||
|
puts "#{time}: #{usage_mb} MB"
|
||||||
|
|
||||||
|
sleep(rand)
|
||||||
|
end
|
||||||
|
|
||||||
|
puts 'Stopping sampler...'
|
||||||
|
|
||||||
|
handle.close
|
||||||
|
end
|
||||||
|
|
||||||
|
threads << Thread.new do
|
||||||
|
start = Time.now
|
||||||
|
|
||||||
|
begin
|
||||||
|
Timeout.timeout(duration) { loop { yield} }
|
||||||
|
rescue Timeout::Error
|
||||||
|
diff = Time.now - start
|
||||||
|
monitor = false
|
||||||
|
|
||||||
|
puts "Finished running after #{diff.round(3)} seconds"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
threads.each(&:join)
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
require_relative '../profile_helper'
|
require_relative '../profile_helper'
|
||||||
|
|
||||||
xml = read_big_xml
|
xml = read_big_xml
|
||||||
parser = Oga::XML::PullParser.new(xml)
|
|
||||||
|
|
||||||
profile_memory('pull_parser/big_xml')
|
profile_memory('pull_parser/big_xml') do
|
||||||
|
Oga::XML::PullParser.new(xml).parse { }
|
||||||
|
end
|
||||||
|
|
||||||
parser.parse { |node| }
|
|
||||||
|
|
Loading…
Reference in New Issue