あいつの日誌β

働きながら旅しています。

はじめての defined-or 演算子

はじめての defined-or 演算子

defined-or 演算子が登場した時には「別に使わなくてもいいなあ」と思っていました。
あれからだいぶ時間がたったのですが、まだ使ったことないです。

まあベンチとってみて速度が変わらなければ使わなければいいやと思いました。

ベンチコード

#!/usr/bin/env perl
use strict;
use warnings;
use 5.010001;

use Benchmark qw/cmpthese timethese/;

my $count = 10_000_000;

my ( $j, $k ) = ( 1, 2 );

cmpthese timethese $count, {
    'defined' => sub {
        my $i = defined $j ? $j : $k; 
        $i == 1 or die;
    },  
    'defined or' => sub {
        my $i = $j // $k; 
        $i == 1 or die;
    },  
};

結果

一回目

:!perl bench/defined.pl
Benchmark: timing 10000000 iterations of defined, defined or...
   defined:  3 wallclock secs ( 1.51 usr +  0.00 sys =  1.51 CPU) @ 6622516.56/s (n=10000000)
defined or:  1 wallclock secs ( 1.22 usr +  0.00 sys =  1.22 CPU) @ 8196721.31/s (n=10000000)
                Rate    defined defined or
defined    6622517/s         --       -19%
defined or 8196721/s        24%         --

2回目

:!perl bench/defined.pl                                                      
Benchmark: timing 10000000 iterations of defined, defined or...
   defined:  2 wallclock secs ( 1.59 usr +  0.00 sys =  1.59 CPU) @ 6289308.18/s (n=10000000)
defined or:  2 wallclock secs ( 1.28 usr +  0.00 sys =  1.28 CPU) @ 7812500.00/s (n=10000000)
                Rate    defined defined or
defined    6289308/s         --       -19%
defined or 7812500/s        24%         --

3回目

:!perl bench/defined.pl                                                      
Benchmark: timing 10000000 iterations of defined, defined or...
   defined:  1 wallclock secs ( 1.56 usr +  0.00 sys =  1.56 CPU) @ 6410256.41/s (n=10000000)
defined or:  1 wallclock secs ( 1.31 usr +  0.00 sys =  1.31 CPU) @ 7633587.79/s (n=10000000)
                Rate    defined defined or
defined    6410256/s         --       -16%
defined or 7633588/s        19%         --

感想

defined-or演算子は覚えておく必要があるなあ。