Tôi để lại một chương trình xử lý hồ sơ của tôi chạy trong vài phút dưới strace.Làm thế nào để tránh các lệnh stat quá mức (/ etc/localtime) trong strftime() trên linux?
Điều này thể hiện trong những phút đó trên 200 000 000 cuộc gọi đến stat("/etc/localtime",..)
có vẻ hơi quá mức và không cần thiết.
Sản lượng strace trông như thế này:
write(1, "C137015 393393093052629137110 47"..., 16384) = 16384
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2225, ...}) = 0
read(0, "\224q\1\207\0\0\202\1\4\203\1\4\204\1\1\205\1\1\206\1\7\207\1\6\211\1\22\212\1\22\213\1"..., 16384) = 16384
Về cơ bản nó bật ra được 1 stat() gọi cho tất cả các kỷ lục xử lý và thủ phạm hóa ra là dòng này khá bình thường mã
strftime(call->date_time,DATELEN,"%Y%m%d %H%M%S",&tm_buf);
Vậy - làm thế nào tôi có thể tránh strftime() gọi stat (/ etc/localtime) tại mọi cuộc gọi?
Bạn có bất kỳ bằng chứng nào cho thấy điều này thực sự gây ra một vấn đề có thể đo lường (tức là chi phí thời gian chạy đáng kể được đo bởi một hồ sơ) không? Bạn không nên cố gắng tối ưu hóa dựa trên * cảm xúc * (như "âm thanh hơi quá mức"). Nhận số đo và sử dụng sự kiện. –
+1 cho câu hỏi về việc nhận được dưới cùng của bloib glibc. :-) –
Việc thêm 'xuất TZ =:/etc/localtime' vào tập lệnh shell của tôi đã loại bỏ các syscalls lặp lại cho tôi. – shuckc