我发现我的项目中有一个严重的瓶颈——大约四分之一的总执行时间浪费在tzset
函数中(由mktime
调用)。
我检查了tzset sources(从第378行开始的代码),发现如果没有设置TZ环境变量,设置一次TZ环境变量将大大缩短其执行时间,因为它会读取时区文件(例如,在我的操作系统中的/usr/local/etc/zoneinfo
)。
我会读取此文件并设置环境变量,但文件的位置可能因平面形状而异。因此,我要做的是以某种方式重用tzset
用于这些目的的代码。
这看起来很简单,只需包含用于定位和检索时区信息的头,并使用此功能:)
#include <timezone/tzfile.h>
但我真的不知道怎么做,我是说用glibc头。编译器不知道这个头(我的IDE,Clion,也看不到它)。我真的坚持了。
最佳答案
您需要在CMakeLists.txt
中包含tzinfo.h的platform check。例子:
INCLUDE (CheckIncludeFiles)
# usage: CHECK_INCLUDE_FILES (<possible header locations> <RESULT_VARIABLE> )
if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
CHECK_INCLUDE_FILES("timezone/tzfile.h;sys/tzfile.h" HAVE_TZFILE_H)
endif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
然后您可以使用
#ifdef HAVE_TZFILE_H
如果您不担心验证文件的内容,也可以使用
FIND_FILE
来代替,这样会快一些。(CheckIncludeFiles
实际上使用一个小的.c文件,而#include
是试图编译它的头文件。)find_file (<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)