localtime
複数のスレッドから非常に頻繁に呼び出したいコードがあります。(関連する背景: これは、要求できるものの 1 つが文字列としての現地時間であり、1 秒あたり 100K の要求を処理できるようにしたいサーバーです。)
localtime_r
Ubuntu Linux 12.04 では、glibc 関数(「リエントラント ローカルタイム」) が を呼び出し__tz_convert
ており、これが引き続きグローバル ロックを使用することを発見しました。
(また、 FreeBSDはlocaltime_r
呼び出しtzset
ごとに呼び出しを行うように見えます。これは、プログラムが実行した可能性があること、および/またはユーザーが今から最後に呼び出されたときまでsetenv("TZ")
の間に の新しいバージョンをダウンロードしたことに偏執的であるためです。(これは逆です)ここで説明されている状況の; glibc はのすべての呼び出しを呼び出しているようですが、混乱を招くだけです。)/etc/localtime
localtime_r
tzset
localtime
localtime_r
明らかに、これはパフォーマンスにとってひどいものです。私たちの目的のために、基本的に、サーバーが実行を開始したときに現在のタイムゾーンのルールを「スナップショット」し、その後そのスナップショットを永久に使用したいと考えています。したがって、夏時間のルールは引き続き尊重しますが (DST にいつ切り替えるかのルールはスナップショットの一部になるため)、ディスクに戻ったり、ミューテックスを取得したり、スレッドを引き起こすようなことをしたりすることは決してありません。封鎖する。(ダウンロードされた tzinfo の更新を尊重しなくても、 への変更を尊重しなくても/etc/localtime
問題ありません。サーバーが実行中にタイムゾーンを物理的に変更するとは考えていません。)
しかし、タイムゾーンのルールを処理する方法に関する情報をオンラインで見つけることができません。それらを操作するためのユーザー空間 API があるかどうか、またはタイムゾーン データを自分で読み取るために数百行の glibc コードを再実装する必要があるかどうかです。 .
ユーザーに公開されていないように見えるため、__tz_convert
を含む下流のすべてを再実装する必要がありますか? tzfile_read
または、タイムゾーンのルールを操作するために使用できる POSIX インターフェイスやサードパーティ ライブラリはありますか?
( http://www.iana.org/time-zones/repository/tz-link.htmlを見たことがありますが、役に立つかどうかはわかりません。)