2017-10-12 155 views
1

我發現了一個嚴重的瓶頸 - 我的項目中大約有四分之一的執行時間浪費在tzset函數中(由mktime調用)。包含來自glibc的頭文件

我檢查tzset sources(代碼,從行378起),發現設置TZ環境變量,如果一旦將大大減少它的執行時間,因爲它(在我的OS例如/usr/local/etc/zoneinfo)讀取時區文件TZ環境變量未設置。

我會讀這個文件並設置環境變量,但文件的位置可能會因不同的平面圖而有所不同。所以,我要做的是以某種方式重用代碼tzset用於這些目的。 這看似簡單,只需包含頭tzset用於定位和檢索時區信息,並使用此功能:)

#include <timezone/tzfile.h> 

,但我真的不知道該怎麼做了,我的意思是使用glibc的頭。編譯器不知道這個頭(我的IDE,Clion,也沒有看到它)。我真的堅持這一點。

+0

你有兩個基本的選擇。添加到你的'configure'腳本中(你知道如何編寫'autoconf'腳本 - 這對任何在非專有POSIX操作系統上開發的人來說都是必備的技能 - 對嗎?固定的一組位置,並使用它來編譯運行時常量。或者,從運行應用程序之前必須設置的某個環境變量中獲取位置。這種情況實際上是'autoconf'和GNU工具鏈的其餘部分的設計目的。 –

+0

「使用自動工具」對於詢問如何在CMake中執行某些操作的人不是有用的答案。 –

回答

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)