POSIXのstrftimeが生perlcodeよりも速い件について

2010年8月17日
| コメント(0) | トラックバック(0) POSIXのstrftimeが生perlcodeよりも速い件について

しばらく前に、POSIXにstrftimeという便利なコマンドがあるのを発見した。
DateTime等とのベンチマークだったと思う。
はてブしたハズなのだが、見つからず。
タグのつけ方が安定しない…。

ともかく。
日付時刻を表示するときは、localtimeをスカラーコンテキストで表示することが多いのだが、日本風に表示しようとすると、それなりに面倒。

my @now = localtime;
$now[5] += 1900;
$now[4]++;
printf qq{%04d/%02d/%02d %02d:%02d:%02d}, reverse(@now[0..5]);

そこで便利なのが、POSIXのstrftimeですよ。

use POSIX;
print POSIX::strftime '%Y/%m/%d %H:%M:%S', localtime;

これで同じ出力を得ることが出来る。
しかも、手元の環境では、strftimeを使ったほうが速い。

生のコードは2種類。
先ほどのスライスを使ったものと、配列を展開したもの。
それらとstrftimeを比較してみた。
結果は以下のとおり、POSIXを使ったほうが2割程度速かった。

Benchmark: running coding1, coding2, posix for at least 3 CPU seconds...
   coding1:  4 wallclock secs ( 3.10 usr +  0.00 sys =  3.10 CPU) @ 75042.20/s (n=232931)
   coding2:  4 wallclock secs ( 3.15 usr +  0.00 sys =  3.15 CPU) @ 84113.30/s (n=265041)
     posix:  4 wallclock secs ( 3.14 usr +  0.00 sys =  3.14 CPU) @ 103140.63/s (n=323449)
            Rate coding1 coding2   posix
coding1  75042/s      --    -11%    -27%
coding2  84113/s     12%      --    -18%
posix   103141/s     37%     23%      --

ソースコードも見た目にわかりやすいので、今後は重宝しそうです。

ベンチマークに使ったソースは以下のとおり。

#utf8
use strict;
use warnings;
use utf8;
use Benchmark ':all';
use POSIX;
 
use Perl6::Say;
 
say posix();
say coding();
say coding2();
 
cmpthese(timethese( -3, {
    'posix'   => \&posix,
    'coding1' => \&coding,
    'coding2' => \&coding2,
}));
 
sub posix {
    POSIX::strftime '%Y/%m/%d %H:%M:%S', localtime;
}
 
sub coding {
    my @now = localtime;
    $now[5] += 1900;
    $now[4]++;
    sprintf qq{%04d/%02d/%02d %02d:%02d:%02d}, reverse(@now[0..5]);
}
 
sub coding2 {
    my @now = localtime;
    sprintf qq{%04d/%02d/%02d %02d:%02d:%02d},
        $now[5] + 1900, $now[4] + 1, $now[3], $now[2], $now[1], $now[0];
}

トラックバック(0)

このブログ記事に対するトラックバックURL:

コメントする

Google検索

Last.fm

このブログ記事について

このページは、のぶりんが2010年8月17日 00:05に書いたブログ記事です。

ひとつ前のブログ記事は「今さらだけどCGI::Carp::DebugScreenを覚えた」です。

次のブログ記事は「推し進める事と裾野を広げる事」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログのライセンスは クリエイティブ・コモンズライセンス.
Powered by Movable Type