DateTime-Lite
view release on metacpan or search on metacpan
README-ja-JP.md view on Meta::CPAN
UTCã§ã®æ§ç¯ã`now()`ãã¢ã¯ã»ãµãç®è¡æ¼ç®ããã©ã¼ãããã«ã¤ãã¦ã¯ã`DateTime::Lite`ã¯åçã¾ãã¯é«éã§ããç®è¡æ¼ç®ã§ã®åä¸ã¯ãXSã§é«éåãããcloneã¨ããã軽éãªããªãã¼ã·ã§ã³å±¤ã«ã...
## TimeZone ãã£ãã·ã¥ã¢ãã«
ããã¯çè§£ãã¹ãæãéè¦ãªãã¬ã¼ããªãã§ãã
**DateTime::TimeZone**ã¯ãååä»ãã¾ã¼ã³ãåãã¦æ§ç¯ãããæç¹ã§ãIANAã¿ã¤ã ã¾ã¼ã³è¦åä¸å¼ãRAMã«èªã¿è¾¼ã¿ã¾ãï¼èµ·åç´180msãã¡ã¢ãªä¸ã®ããã·ã¥æ§é ç´4MBï¼ããã®å¾ã®`DateTime::TimeZone->new...
**DateTime::Lite::TimeZone**ã¯ãåãIANAãã¼ã¿ãã³ã³ãã¯ããªSQLiteãã¼ã¿ãã¼ã¹ï¼é
å¸ç©ã«å«ã¾ãã`tz.sqlite3`ï¼ã«æ ¼ç´ãã¾ããããã¾ã¼ã³åã«å¯¾ããæåã®å¼ã³åºãã§ã¯ã¯ã¨ãªãå®è¡ããï¼ç´22...
**ä»»æã®ã¡ã¢ãªãã£ãã·ã¥:**`DateTime::Lite::TimeZone`ã¯ãããã»ã¹ã¬ãã«ã®ã¡ã¢ãªãã£ãã·ã¥ãopt-inã§æä¾ãã¾ããããã«ãããå¼ã³åºããã¨ã®é度ã¯`DateTime::TimeZone`ã¨åçãã¾ãã¯ãã以ä¸ã...
# ã¢ããªã±ã¼ã·ã§ã³èµ·åæã«ä¸åº¦ã ãæå¹åãã¾ã:
DateTime::Lite::TimeZone->enable_mem_cache;
# ã¾ãã¯å¼ã³åºããã¨ã«æå®ãã¾ã:
my $tz = DateTime::Lite::TimeZone->new(
name => 'America/New_York',
use_cache_mem => 1,
);
ã¡ã¢ãªãã£ãã·ã¥ãæå¹ãªå ´åãåãã¾ã¼ã³ã«å¯¾ããç¹°ãè¿ãã®`new()`å¼ã³åºãã¯ãåç´ãªããã·ã¥åç
§ãããã£ãã·ã¥æ¸ã¿ãªãã¸ã§ã¯ããè¿ããç´0.8µsã§å®äºãã¾ãã
DateTime::TimeZone DateTime::Lite::TimeZone
------ ----------------- ------------------------
Cold first call ~225 ms ~22 ms
Warm (no mem cache) ~2 µs ~19 µs
Warm (mem cache only) ~2 µs ~0.4 µs
Warm (mem+span+footer cache) ~2 µs ~0.4 µs
new(named zone, all caches) ~25 µs ~14 µs
å®ç¨ä¸ã®æé:
- ååä»ãã¾ã¼ã³ãæã¤datetimeãªãã¸ã§ã¯ããæ§ç¯ããé·æé稼åãµã¼ãã¹ã§ã¯ãèµ·åæã«ä¸åº¦`DateTime::Lite::TimeZone->enable_mem_cache`ãå¼ã³åºãã¦ãã ããã
ããã«ããã3層ã®ãã£ãã·ã¥ãæå¹ã«ãªãã¾ãã
- 1. ãªãã¸ã§ã¯ããã£ãã·ã¥ï¼SQLiteæ§ç¯ãåé¿ãã¾ãï¼ã
- 2. spanãã£ãã·ã¥ï¼UTCãªãã»ããã¯ã¨ãªãåé¿ãã¾ãï¼ã
- 3. footerãã£ãã·ã¥ï¼POSIX DSTè¦åè¨ç®ãåé¿ãã¾ãï¼ã
ãã¹ã¦ã®å±¤ãæºåå®äºãã¦ããã`new(named zone)`ã®ã³ã¹ãã¯ç´14µsã§ã`DateTime`ï¼ç´25µsï¼ããé«éã§ãã
- æç¤ºçãªå¶å¾¡ã好ãå ´åã¯ãåã
ã®`new()`å¼ã³åºããã¨ã«`use_cache_mem => 1`ãæ¸¡ããã1ã¤ã®`TimeZone`ãªãã¸ã§ã¯ããæ§ç¯ãã¦åå©ç¨ãã¦ãã ããã
my $tz = DateTime::Lite::TimeZone->new( name => 'America/New_York' );
my $dt = DateTime::Lite->new( ..., time_zone => $tz );
- ãããå¦çï¼ãã°è§£æãETLãã¬ãã¼ãçæï¼ã§ã¯ãã¿ã¤ã ã¾ã¼ã³æ§ç¯ã¯ç·I/Oæéã®ããä¸é¨ã§ãããã¨ãå¤ããããã©ã®é¸æè¢ãé¸ãã§ãå·®ã¯ä½æã§ãã¾ããã
- çå½ãªã¹ã¯ãªãããã³ãã³ãã©ã¤ã³ãã¼ã«ã§ã¯ã`DateTime::Lite`ã¯èµ·åæéï¼ç´120ms 対 ç´320msï¼ã¨ã¡ã¢ãªï¼ç´19MB 対 ç´28MBï¼ã®ä¸¡æ¹ã§æå©ã§ãã
## ãã³ããã¼ã¯ã®å®è¡
èªå·±å®çµãããã³ããã¼ã¯ã¹ã¯ãªãããé
å¸ç©ã«å«ã¾ãã¦ãã¾ãã
cd DateTime-Lite-vX.X.X
perl Makefile.PL && make # XS ã³ã¼ããã³ã³ãã¤ã«ããã¦ãããã¨ã確èªãã¾ã
perl -Iblib/lib -Iblib/arch scripts/benchmark.pl
# ããå®å®ããæ°å¤ãå¾ãããã«å復忰ãå¢ãã:
perl -Iblib/lib -Iblib/arch scripts/benchmark.pl --iterations 50000
# æ©æ¢°å¯èªãª CSV åºå:
perl -Iblib/lib -Iblib/arch scripts/benchmark.pl --csv > results.csv
# ä½¿ç¨æ¹æ³
## 0èµ·ç¹ã®æ°å¤ã¨1èµ·ç¹ã®æ°å¤
`DateTime::Lite`ã¯ã0èµ·ç¹ã¨1èµ·ç¹ã®æ°å¤ã«ã¤ãã¦åç´ãªè¦åã«å¾ãã¾ãã
æãæå
ã®æ¥ãææ¥ãå¹´å
éç®æ¥ã¯**1èµ·ç¹**ã§ãããã¹ã¦ã®1èµ·ç¹ã¡ã½ããã«ã¯`_0`çãããã¾ãããã¨ãã°ã`day_of_week`ã¯1ï¼æææ¥ï¼ãã7ï¼æ¥ææ¥ï¼ã¾ã§ãè¿ãã¾ããã`day_of_week_0`ã¯0ãã...
ãã¹ã¦ã®_æå»_é¢é£ã®å¤ï¼æãåãç§ï¼ã¯**0èµ·ç¹**ã§ãã
å¹´ã¯ã©ã¡ãã§ãããã¾ãããæ£ã®å¤ã«ãè² ã®å¤ã«ããªãå¾ã¾ããå¹´0ãåå¨ãã¾ãã
`quarter_0`ã¡ã½ããã¯ããã¾ããã
## Floating DateTimesï¼ã¿ã¤ã ã¾ã¼ã³éåºå®ã®æ¥æï¼
æ°ãã`DateTime::Lite`ãªãã¸ã§ã¯ãã®ããã©ã«ãã¿ã¤ã ã¾ã¼ã³ã¯ãç¹ã«æè¨ããã¦ããªãéãã`floating`ã¿ã¤ã ã¾ã¼ã³ã§ãããã®æ¦å¿µã¯iCalæ¨æºã«ç±æ¥ãã¾ããfloating datetimeã¯ç¹å®ã®ã¿ã¤ã ã¾ã...
floating datetimeã¨å®éã®ã¿ã¤ã ã¾ã¼ã³ãæã¤datetimeã®éã§æ¥ä»è¨ç®ãæ¯è¼ãè¡ãã¨ãçµæã®å¦¥å½æ§ã¯éå®çã«ãªãã¾ãã䏿¹ã¯ãããç§ãå«ã¿ããã䏿¹ã¯å«ã¾ãªãããã§ãã
å®éã®ã¿ã¤ã ã¾ã¼ã³ãæã¤ãªãã¸ã§ã¯ãã使ç¨ããäºå®ãããå ´åã¯ãfloating datetimeã¨æ··å¨ãããªããã¨ã**å¼·ãæ¨å¥¨ãã¾ã**ã
## ãã¼ã«ã«ã¿ã¤ã ã¾ã¼ã³ã®å¤å®ã¯é
ãå ´åãããã¾ã
`$ENV{TZ}`ãè¨å®ããã¦ããªãå ´åããã¼ã«ã«ã¿ã¤ã ã¾ã¼ã³ã®æ¤ç´¢ã«ã¯`/etc`以ä¸ã®è¤æ°ã®ãã¡ã¤ã«ãèªãå¿
è¦ããããã¨ãããã¾ããããã°ã©ã ã®å®è¡ä¸ã«ãã¼ã«ã«ã¿ã¤ã ã¾ã¼ã³ãå¤ãããª...
my $local_tz = DateTime::Lite::TimeZone->new( name => 'local' );
my $dt = DateTime::Lite->new( ..., time_zone => $local_tz );
`DateTime::Lite::TimeZone`ã¯ããã®ã³ã¹ããå®å
¨ã«åãé¤ãããã»ã¹ã¬ãã«ã®ãã£ãã·ã¥ãæä¾ãã¦ãã¾ãã
DateTime::Lite::TimeZone->enable_mem_cache;
my $dt = DateTime::Lite->new( ..., time_zone => 'local' );
## é ãå°æ¥ã® DST
ç¾å¨ããæ°åå¹´å¾ã®ãããªé常ã«é ãå°æ¥ã®æ¥ä»ã§ã¯ãååä»ãã¿ã¤ã ã¾ã¼ã³ã使ã`DateTime`ã¯å¤§éã®ã¡ã¢ãªãæ¶è²»ãããã¨ãããã¾ããããã¯`DateTime::TimeZone`ããç¾å¨ãããã®æ¥ä»ã¾ã§ã...
`DateTime::Lite`ã¯ãã®åé¡ã®å½±é¿ãåãã¾ããã`DateTime::Lite::TimeZone`ã¯ãã³ã³ãã¯ããªSQLiteãã¼ã¿ãã¼ã¹ã¨POSIX footer TZæååã使ç¨ãã¦ãå®å
¨ãªé·ç§»ãã¼ãã«ãå±éãããã¨ãªããä»»æã®å°æ...
## ããã©ã«ãã¿ã¤ã ã¾ã¼ã³ãã°ãã¼ãã«ã«è¨å®ãã
**è¦å: ããã¯é常ã«å±éºã§ããèªå·±è²¬ä»»ã§ä½¿ç¨ãã¦ãã ããã**
次ã®ããã«è¨å®ãããã¨ã§ã`DateTime::Lite`ã«ç¹å®ã®ããã©ã«ãã¿ã¤ã ã¾ã¼ã³ãå¼·å¶ã§ãã¾ãã
$ENV{PERL_DATETIME_DEFAULT_TZ} = 'America/New_York';
ããã¯ã使ç¨ãã¦ããCPANã¢ã¸ã¥ã¼ã«ãå«ãã`DateTime::Lite`ãªãã¸ã§ã¯ãã使ãããã¹ã¦ã®ã³ã¼ãã«å½±é¿ãã¾ããæ¬çªç°å¢ã§ä½¿ç¨ããåã«ãä¾åé¢ä¿ãç£æ»ãã¦ãã ããã
## ä¸éã¨ä¸é
å
é¨çã«ã¯ãæ¥ä»ã¯`0001-01-01`ã®åå¾ã®æ¥æ°ã¨ãã¦ä¿åãããPerlæ´æ°ã«ä¿æããã¾ããå©ç¨å¯è½ãªç¯å²ã¯ããã©ãããã©ã¼ã ã®æ´æ°ãµã¤ãºï¼`$Config{ivsize}`ï¼ã«ä¾åãã¾ãã
- **32ãããPerl:**ããã`+/-1,469,903`å¹´
( run in 0.650 second using v1.01-cache-2.11-cpan-71847e10f99 )