Chúng tôi có một số mã muốn gọi localtime
rất thường xuyên từ nhiều chủ đề. (Nền có liên quan: đó là máy chủ mà một trong những thứ bạn có thể yêu cầu là thời gian địa phương dưới dạng chuỗi và muốn có thể phân phát 100 nghìn yêu cầu mỗi giây.)API Linux/crossplatform cho các quy tắc múi giờ? (thay thế khóa localtime_r)
Chúng tôi đã phát hiện ra rằng trên Ubuntu Linux 12.04, hàm glibc localtime_r
("reentrant localtime") gọi __tz_convert
, mà still takes a global lock!
(Ngoài ra, nó trông giống như FreeBSD làm localtime_r
gọi tzset
trên mỗi gọi duy nhất, bởi vì họ đang hoang tưởng rằng chương trình có thể đã làm một setenv("TZ")
và/hoặc người dùng đã tải xuống phiên bản mới /etc/localtime
từ giờ đến lần cuối cùng localtime_r
được gọi. (Điều này ngược lại với việc ngồi uation được mô tả here; có vẻ như glibc gọi tzset
on every invocation of localtime
but not localtime_r
, chỉ để gây nhầm lẫn.)
Rõ ràng, điều này là khủng khiếp đối với hiệu suất. Vì mục đích của chúng tôi, chúng tôi muốn "chụp nhanh" các quy tắc cơ bản cho múi giờ hiện tại của chúng tôi khi máy chủ bắt đầu chạy và sau đó sử dụng ảnh chụp đó mãi mãi sau đó. Vì vậy, chúng tôi sẽ tiếp tục tôn trọng quy tắc Tiết kiệm ánh sáng ban ngày (vì các quy tắc cho khi chuyển sang DST sẽ là một phần của ảnh chụp nhanh), nhưng chúng tôi sẽ không bao giờ quay lại đĩa, thực hiện mutexes hoặc làm bất kỳ điều gì khác để ngăn chặn. (Chúng tôi không sao khi không tôn trọng các cập nhật đã tải xuống cho tzinfo và không tôn trọng các thay đổi đối với /etc/localtime
; chúng tôi không mong đợi máy chủ thay đổi múi giờ về mặt vật lý trong khi đang chạy.)
Tuy nhiên, tôi không thể tìm thấy bất kỳ thông tin nào trực tuyến về cách để xử lý các quy tắc múi giờ - cho dù có một API không gian người dùng để làm việc với chúng hay chúng tôi buộc phải thực hiện lại vài trăm dòng mã glibc để tự đọc dữ liệu múi giờ.
Chúng tôi có phải thực hiện lại mọi thứ ở hạ lưu của __tz_convert
- bao gồm tzfile_read
, vì dường như dường như không tiếp xúc với người dùng? Hoặc có một số giao diện POSIX và/hoặc thư viện của bên thứ ba mà chúng tôi có thể sử dụng để làm việc với các quy tắc múi giờ không?
(Tôi đã nhìn thấy http://www.iana.org/time-zones/repository/tz-link.html nhưng tôi không chắc chắn rằng nó rất hữu ích.)
Nó không phải là tất cả rõ ràng rằng khóa toàn cầu trong 'tzset' là" khủng khiếp cho hiệu suất "- bạn đã thực sự chuẩn nó? Trừ khi bạn chuẩn bị nó, nó dường như là một trường hợp tối ưu hóa ngôn ngữ sớm. Theo như tôi có thể nói, 'tzset' có một con đường nhanh mà về cơ bản không làm gì nếu múi giờ không thực sự thay đổi. Trong một ứng dụng thực tế, tôi mong chờ khóa sẽ không bao giờ được tranh luận. – user4815162342
Khóa được sử dụng bất cứ lúc nào hai chủ đề gọi '__tz_convert' cùng một lúc; kiểm tra mã. Và có, lý do duy nhất chúng tôi biết khóa này tồn tại là chúng tôi thấy nó là một nút cổ chai trong các bài kiểm tra perf (các bài kiểm tra cụ thể phục vụ rất nhiều yêu cầu địa phương). – Quuxplusone
Bạn đã xem [Boost] (http://www.boost.org/doc/libs/1_54_0/doc/html/date_time.html) hoặc [ICU] (http://userguide.icu-project.org/ ngày giờ)? –