我在我的项目中发现了一个严重的瓶颈 - tzset
函数浪费了大约四分之一的总执行时间(由mktime
调用)。
我检查了tzset sources(代码,从第378行开始),发现设置 TZ 环境变量一次会大大减少执行时间,因为它会读取一个时区文件(例如如果 TZ 环境变量未设置,则在我的操作系统中/usr/local/etc/zoneinfo
。
我会读取此文件并设置环境变量,但文件的位置可能因不同的平面图而异。所以,我要做的是以某种方式重用代码tzset
用于这些目的。
这可能看起来很简单,只需包含标题tzset
用于查找和检索时区信息,并使用此功能:)
#include <timezone/tzfile.h>
但我真的不知道该怎么做,我的意思是使用glibc标头。编译器不知道这个标题(我的IDE,Clion,也没有看到它)。我真的坚持这个。
答案 0 :(得分:1)
您需要在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)