ベンチマーク
備忘録。
404 Blog Not Found:perl - $scalarの中身が数値か否かを判定する
実は、これが一番高速だったりします。
sub is_a_num { $_[0] != 0 }
よし確かめてみよう。ネタを見つけたら試す俺子供
#!/usr/bin/env perl use strict; #use warnings; use Benchmark qw/:all/; use Scalar::Util qw/looks_like_number/; use Regexp::Common; my @words = qw/1 hoge 1_0 100huga 3.0/; cmpthese(50000, { is_a_num => sub { is_a_num($_) for @words }, looks_like_number => sub { looks_like_number($_) for @words }, is_an_integer => sub { is_an_integer($_) for @words }, is_an_integer2 => sub { is_an_integer2($_) for @words }, RE_num_real => sub { RE_num_real($_) for @words }, }); sub is_an_integer { $_[0] =~ /\-?\d+\z/ } sub is_an_integer2 { $_[0] =~ /\A[\+\-]?\d+\z/ } # +3 sub is_a_num { $_[0] != 0 } sub RE_num_real { /$RE{num}{real}/ }
% perl is_integer.pl (warning: too few iterations for a reliable count) (warning: too few iterations for a reliable count) (warning: too few iterations for a reliable count) Rate RE_num_real is_an_integer is_an_integer2 looks_like_number is_a_num RE_num_real 1404/s -- -98% -99% -99% -99% is_an_integer 90909/s 6375% -- -38% -60% -62% is_an_integer2 147059/s 10374% 62% -- -35% -38% looks_like_number 227273/s 16086% 150% 55% -- -5% is_a_num 238095/s 16857% 162% 62% 5% --
too few iterationsって怒られず、かつ実行時間が長すぎないループ回数が探せない。