DateTime-Lite

 view release on metacpan or  search on metacpan

lib/DateTime/Lite/JA.pod  view on Meta::CPAN

        use_cache_mem => 1,
    );

メモリキャッシュが有効な場合、同じゾーンに対する繰り返しのC<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

実用上の指針:

=over 4

=item *

名前付きゾーンを持つdatetimeオブジェクトを構築する長時間稼働サービスでは、起動時に一度C<< DateTime::Lite::TimeZone->enable_mem_cache >>を呼び出してください。
これにより、3層のキャッシュが有効になります。

=over 4

=item 1. オブジェクトキャッシュ(SQLite構築を回避します)。

=item 2. spanキャッシュ(UTCオフセットクエリを回避します)。

=item 3. footerキャッシュ(POSIX DST規則計算を回避します)。

=back

すべての層が準備完了してから、C<new(named zone)>のコストは約14µsで、C<DateTime>(約25µs)より高速です。

=item *

明示的な制御を好む場合は、個々のC<new()>呼び出しごとにC<< use_cache_mem => 1 >>を渡すか、1つのC<TimeZone>オブジェクトを構築して再利用してください。

    my $tz = DateTime::Lite::TimeZone->new( name => 'America/New_York' );
    my $dt = DateTime::Lite->new( ..., time_zone => $tz );

=item *

バッチ処理(ログ解析、ETL、レポート生成)では、タイムゾーン構築は総I/O時間のごく一部であることが多いため、どの選択肢を選んでも差は体感できません。

=item *

短命なスクリプトやコマンドラインツールでは、C<DateTime::Lite>は起動時間(約120ms 対 約320ms)とメモリ(約19MB 対 約28MB)の両方で有利です。

=back

=head2 ベンチマークの実行

自己完結したベンチマークスクリプトが配布物に含まれています。

    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

=head1 使用方法

=head2 0起点の数値と1起点の数値

C<DateTime::Lite>は、0起点と1起点の数値について単純な規則に従います。

月、月内の日、曜日、年内通算日はB<1起点>です。すべての1起点メソッドにはC<_0>版もあります。たとえば、C<day_of_week>は1(月曜日)から7(日曜日)までを返しますが、C<day_of_week_0>は0か...

すべてのI<時刻>関連の値(時、分、秒)はB<0起点>です。

年はどちらでもありません。正の値にも負の値にもなり得ます。年0も存在します。

C<quarter_0>メソッドはありません。

=head2 Floating DateTimes(タイムゾーン非固定の日時)

新しいC<DateTime::Lite>オブジェクトのデフォルトタイムゾーンは、特に明記されていない限り、C<floating>タイムゾーンです。この概念はiCal標準に由来します。floating datetimeは特定のタイムゾ...

floating datetimeと実際のタイムゾーンを持つdatetimeの間で日付計算や比較を行うと、結果の妥当性は限定的になります。一方はうるう秒を含み、もう一方は含まないためです。

実際のタイムゾーンを持つオブジェクトを使用する予定がある場合は、floating datetimeと混在させないことをB<強く推奨します>。

=head2 ローカルタイムゾーンの判定は遅い場合があります

C<$ENV{TZ}>が設定されていない場合、ローカルタイムゾーンの検索にはF</etc>以下の複数のファイルを読む必要があることがあります。プログラムの実行中にローカルタイムゾーンが変わらã...

    my $local_tz = DateTime::Lite::TimeZone->new( name => 'local' );

    my $dt = DateTime::Lite->new( ..., time_zone => $local_tz );

C<DateTime::Lite::TimeZone>は、このコストを完全に取り除くプロセスレベルのキャッシュも提供しています。

    DateTime::Lite::TimeZone->enable_mem_cache;
    my $dt = DateTime::Lite->new( ..., time_zone => 'local' );

=head2 遠い将来の DST

現在から数千年後のような非常に遠い将来の日付では、名前付きタイムゾーンを使うC<DateTime>は大量のメモリを消費することがあります。これはC<DateTime::TimeZone>が、現在からその日付まã...

C<DateTime::Lite>はこの問題の影響を受けません。C<DateTime::Lite::TimeZone>は、コンパクトなSQLiteデータベースとPOSIX footer TZ文字列を使用して、完全な遷移テーブルを展開することなく、任意のå°...

=head2 デフォルトタイムゾーンをグローバルに設定する

B<警告: これは非常に危険です。自己責任で使用してください。>

次のように設定することで、C<DateTime::Lite>に特定のデフォルトタイムゾーンを強制できます。

    $ENV{PERL_DATETIME_DEFAULT_TZ} = 'America/New_York';

これは、使用しているCPANモジュールを含め、C<DateTime::Lite>オブジェクトを作成するすべてのコードに影響します。本番環境で使用する前に、依存関係を監査してください。

=head2 上限と下限

内部的には、日付はC<0001-01-01>の前後の日数として保存され、Perl整数に保持されます。利用可能な範囲は、プラットフォームの整数サイズ(C<$Config{ivsize}>)に依存します。

=over 4



( run in 0.504 second using v1.01-cache-2.11-cpan-71847e10f99 )