2017-10-12 3 views
1

Ich habe einen schwerwiegenden Engpass in meinem Projekt entdeckt - etwa ein Viertel der gesamten Ausführungszeit ist verschwendet in tzset Funktion (von mktime aufgerufen).Include-Header von Glibc

Ich untersuchte tzset sources (den Code, ab Zeile 378) und festgestellt, dass Einstellung TZ Umgebungsvariable einmal erheblich seine Ausführungszeit reduzieren, denn es ist eine Zeitzone-Datei (zum Beispiel /usr/local/etc/zoneinfo in meinem O), wenn TZ liest Umgebungsvariable ist nicht festgelegt.

Ich würde diese Datei lesen und die Umgebungsvariable festlegen, aber der Speicherort der Datei kann auf verschiedenen Grundrissen abweichen. Also, was ich tun werde, ist irgendwie den Code wiederverwenden tzset verwendet für diese Zwecke. Dies mag einfach, geben Sie einfach den Header tzset verwendet zur Ortung und Zeitzone Informationen abrufen, und diese Funktionalität nutzen :)

#include <timezone/tzfile.h> 

aber ich weiß wirklich nicht, wie es zu tun, ich glibc Header bedeuten verwenden. Compiler kennt diesen Header nicht (meine IDE, Clion, sieht sie auch nicht). Ich bin wirklich dabei geblieben.

+0

Sie haben grundsätzlich zwei verschiedene Arten. Fügen Sie zu Ihrem 'configure' Skript (Sie wissen, wie man' autoconf' Skripte schreibt - das ist so ziemlich eine obligatorische Fähigkeit für jeden, der auf nicht-proprietären POSIX-basierten Betriebssystemen entwickelt - richtig?), Die nach Zoneninfo in a sucht feste Menge von Orten, und verwenden Sie das, um eine Laufzeitkonstante zu kompilieren. Oder beziehen Sie den Speicherort von einer Umgebungsvariablen, die vor dem Ausführen der Anwendung festgelegt werden muss. Diese Situation ist wirklich, was "autoconf", und der Rest der GNU-Toolchain, ist für entwickelt. –

+0

"Use autotools" ist keine hilfreiche Antwort auf jemanden, der fragt, wie man etwas in CMake macht. –

Antwort

1

Sie müssen eine platform check für tzinfo.h in Ihrem CMakeLists.txt einschließen. Beispiel:

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") 

Sie dann #ifdef HAVE_TZFILE_H

verwenden können, wenn Sie nicht besorgt über den Inhalt der Datei zu überprüfen, können Sie auch FIND_FILE stattdessen verwenden, die ein wenig schneller ist. (CheckIncludeFiles tatsächlich nutzt eine kleine C-Datei und #include s der Kopf versucht, es zu kompilieren.)

find_file (<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)