Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Inside of Time::Strptime

Inside of Time::Strptime

Shibuya.pm #18 LT

karupanerura

July 05, 2018
Tweet

More Decks by karupanerura

Other Decks in Technology

Transcript

  1. Inside of
    Time::Strptime
    id:karupanerura
    Shibuya.pm #18 LT

    View Slide

  2. Time::Strptime

    View Slide

  3. use Time::Strptime qw/strptime/;
    # function
    my ($epoch_f, $offset_f)
    = strptime('%Y-%m-%d %H:%M:%S', '2014-01-01 00:00:00');
    # OO style
    my $fmt = Time::Strptime::Format->new('%Y-%m-%d %H:%M:%S');
    my ($epoch_o, $offset_o)
    = $fmt->parse('2014-01-01 00:00:00');
    Time::Strptime

    View Slide

  4. Time::Strptime
    • strptime(3) ͷ Pure Perl ࣮૷
    • Time::MomentͰ೚ҙϑΥʔϚοτͷύʔε͕
    Ͱ͖ͳ͔ͬͨͷͰ࡞ͬͨ
    • ߴ଎

    View Slide

  5. Pure Perlͳͷʹߴ଎ʁʁʁ

    View Slide

  6. ϕϯνϚʔΫ

    View Slide

  7. ৚݅
    • OS X High Sierra
    • Perl 5.28.0
    • Time::Local: 1.28
    • Time::Moment: 0.44
    • Time::Piece: 1.3204
    • Time::Strptime: 1.03

    View Slide

  8. ৚݅
    • %Y-%m-%d %H:%M:%S Ͱparse͢Δ
    • epochͱoffsetΛऔಘ
    • Parser͸Ωϟογϡͯ͠ྑ͍(cachedͱ໌ه)
    • GMTͰ࣮ߦ(offsetܭࢉͷ࠷దԽ͸Մೳ)

    View Slide

  9. Benchmark: running pt, tm, tp, tp(cached), ts(cached) for at least 10 CPU seconds...
    pt: 11 wallclock secs (10.41 usr + 0.01 sys = 10.42 CPU) @ 297345.59/s (n=3098341)
    tm: 10 wallclock secs (10.17 usr + 0.01 sys = 10.18 CPU) @ 2481673.28/s (n=25263434)
    tp: 10 wallclock secs (10.52 usr + 0.01 sys = 10.53 CPU) @ 56390.98/s (n=593797)
    tp(cached): 11 wallclock secs (10.53 usr + 0.01 sys = 10.54 CPU) @ 80838.24/s (n=852035)
    ts(cached): 11 wallclock secs (10.60 usr + 0.01 sys = 10.61 CPU) @ 267686.15/s (n=2840150)
    Rate tp tp(cached) ts(cached) pt ™
    tp 56391/s -- -30% -79% -81% -98%
    tp(cached) 80838/s 43% -- -70% -73% -97%
    ts(cached) 267686/s 375% 231% -- -10% -89%
    pt 297346/s 427% 268% 11% -- -88%
    tm 2481673/s 4301% 2970% 827% 735% --
    tp=Time::Piece(XS)
    ts=Time::Strptime(PP)
    pt=POSIX::strptime
    tm=Time::Moment(XS)

    View Slide

  10. ݁Ռ
    • Time::Piece(cached)ʹରͯ͠231%ߴ଎
    • POSIX::strptimeʹରͯ͠10%௿଎
    • ※DateTime͸ൺֱͷܻ͕ҧ͏ͷͰআ֎ͯ͠Δ
    • ͓ͦ͗͢Δ

    View Slide

  11. ͳͥ଎͍ʁ

    View Slide

  12. Ξϓϩʔν
    • ࠷దԽͨ͠ίʔυΛੜ੒ͯ͠Ωϟογϡ
    • ෼ذͱϝϞϦΞϩέʔγϣϯΛ࠷খԽ
    • ಉ͡Ξϓϩʔνͷ࣮૷
    • Text::MicroTemplate
    • Apache::LogFormat::Compiler

    View Slide

  13. ੜ੒ίʔυྫ
    my ($year, $month, $day, $hour24, $minute, $second,
    $offset, $epoch);
    $offset = 0;
    sub {
    ($year, $month, $day, $hour24, $minute, $second) =
    $_[0] =~ m{\A([0-9]{4})\-(0[1-9]|1[0-2])\-(0[1-9]|[12]
    [0-9]|3[01])T([01][0-9]|2[0-3])\:([0-5][0-9])\:([0-5][0-9]|
    60)\z}mo
    or Carp::croak 'cannot parse datetime. text: "'.
    $_[0].'", format: '."\"%FT%T\"";
    $epoch = timegm_nocheck($second, $minute, $hour24,
    $day, $month - 1, $year);
    $offset = $time_zone->offset($epoch);
    $epoch -= $offset;
    ($epoch, $offset);
    };

    View Slide

  14. ͜ΕΛText Evalͯ݁͠Ռͷ
    CodeRefΛΩϟογϡ

    View Slide

  15. ଎͍ʂʂʂʂʂʂ

    View Slide

  16. ·ͱΊ
    eval͸ศར

    View Slide

  17. ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide