Skip to content

RegexpTesting

kouki-o-iij edited this page Mar 22, 2013 · 16 revisions

テスト

何を確認したいの?

  • iij/mruby iij と比較してデグレードが発生しないこと
    • メモリリークをしていないこと
    • 大量のオブジェクト生成時、大量のテキストマッチング時に異常が発生しないこと

オブジェクトを単体で作って、マッチさせて GC に回収させる

#!/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

大量のオブジェクトを生成して GC で回収させるケース

  • ソースコード
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

それなりのサイズのテキストを用意して、1/2 くらいマッチするケース

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

Clone this wiki locally