我发现我的项目中有一个严重的瓶颈——大约四分之一的总执行时间浪费在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)

09-07 08:08