forked from mruby/mruby
-
Notifications
You must be signed in to change notification settings - Fork 4
RegexpTesting
kouki-o-iij edited this page Mar 22, 2013
·
16 revisions
- iij/mruby iij と比較してデグレードが発生しないこと
- メモリリークをしていないこと
- 大量のオブジェクト生成時、大量のテキストマッチング時に異常が発生しないこと
#!/bin/sh
BEFORE_MRUBY="${HOME}/work/mruby-iij/bin/mruby"
AFTER_MRUBY="${HOME}/work/iij-mruby/bin/mruby"
TIME_CMD="/usr/bin/time -f %Mkb"
COUNT_LIST="3000 5000 10000 15000 20000 50000 100000"
printf "|%010s|%010s|%010s|\n" count before after
printf "|-----------|-----------|-----------|\n"
for count in $COUNT_LIST
do
# generate
cat << EOS >> $count.rb
test = /abc/
$count.times{
test =~ "abc"
GC.start
}
EOS
# run
BEFORE=`${TIME_CMD} ${BEFORE_MRUBY} $count.rb 2>&1`
AFTER=`${TIME_CMD} ${AFTER_MRUBY} $count.rb 2>&1`
printf "|%010s|%010s|%010s|\n" $count $BEFORE $AFTER
# cleanup
rm $count.rb
done- 結果
| count | before | after |
|---|---|---|
| 3000 | 2552kb | 1368kb |
| 5000 | 2552kb | 1364kb |
| 10000 | 2552kb | 1364kb |
| 15000 | 2552kb | 1368kb |
| 20000 | 2552kb | 1368kb |
| 50000 | 2552kb | 1368kb |
| 100000 | 2552kb | 1368kb |
- ソースコード
BEFORE_MRUBY="${HOME}/work/mruby-iij/bin/mruby"
AFTER_MRUBY="${HOME}/work/iij-mruby/bin/mruby"
TIME_CMD="/usr/bin/time -f %Mkb"
COUNT_LIST="3000 5000 10000 15000 20000 50000 100000"
printf "|%010s|%010s|%010s|\n" count before after
printf "|----------|----------|----------|\n"
for count in $COUNT_LIST
do
# generate
cat << EOS >> $count.rb
$count.times{
test = /abc$count/
test =~ "abc$count"
GC.start
}
EOS
# run
BEFORE=`${TIME_CMD} ${BEFORE_MRUBY} $count.rb 2>&1`
AFTER=`${TIME_CMD} ${AFTER_MRUBY} $count.rb 2>&1`
printf "|%010s|%010s|%010s|\n" $count $BEFORE $AFTER
# cleanup
rm $count.rb
done- 結果
| count | before | after |
|---|---|---|
| 3000 | 2556kb | 1364kb |
| 5000 | 2556kb | 1368kb |
| 10000 | 2552kb | 1364kb |
| 15000 | 2556kb | 1368kb |
| 20000 | 2556kb | 1368kb |
| 50000 | 2556kb | 1368kb |
| 100000 | 2556kb | 1364kb |
- iij/mruby mruby-support-regexp の File は mruby-support-io を利用
- alice.txt は ここから取得(http://gaia.cs.umass.edu/wireshark-labs/alice.txt)
- alice.txt 総行数: 3598
- (the|The)マッチ行数: 1555
- ソースコード
BEFORE_MRUBY="${HOME}/work/mruby-iij/bin/mruby"
AFTER_MRUBY="${HOME}/work/iij-mruby/bin/mruby"
TIME_CMD="/usr/bin/time -f %Mkb"
COUNT_LIST="3000 5000 10000 15000 20000 50000 100000"
printf "|%010s|%010s|%010s|\n" count before after
printf "|----------|----------|----------|\n"
for count in $COUNT_LIST
do
# generate
cat << EOS >> $count.rb
File.open("alice.txt") { |f|
f.each_line { |line|
/ the / =~ line
GC.start
}
}
EOS
# run
BEFORE=`${TIME_CMD} ${BEFORE_MRUBY} $count.rb 2>&1`
AFTER=`${TIME_CMD} ${AFTER_MRUBY} $count.rb 2>&1`
printf "|%010s|%010s|%010s|\n" $count $BEFORE $AFTER
# cleanup
rm $count.rb
done- 結果
| count | before | after |
|---|---|---|
| 3000 | 2640kb | 1476kb |
| 5000 | 2640kb | 1480kb |
| 10000 | 2640kb | 1480kb |
| 15000 | 2640kb | 1476kb |
| 20000 | 2640kb | 1480kb |
| 50000 | 2640kb | 1480kb |
| 100000 | 2640kb | 1476kb |
/usr/bin/time -f "%M kb" ../mruby-iij/bin/mruby bench_regex.rb
test = 0
t1 = Time.now
100.times {
10000.times {
test += 1
re = Regexp.new(test.to_s)
e = re.match(test.to_s)
}
GC.start
}
puts "Regexp #{Time.now - t1} sec"| repo | time | memory |
|---|---|---|
| iij/mruby | 45.655449 sec | 3164 kb |
| mruby-support-regexp | 10.551873 sec | 1760 kb |
| ruby1.9.3 | 3.325488378 sec | 6160 kb |