ベンチマーク

備忘録。

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って怒られず、かつ実行時間が長すぎないループ回数が探せない。