2017-10-12 3 views
1

私のプロジェクトでは、深刻なボトルネックが発見されました。​​関数(mktimeが呼び出されました)では、全体の実行時間の約4分の1が無駄になっています。glibcのヘッダを含めてください

TZ場合、私は(ライン378から始まるコード)tzset sourcesを検討し、それが(私のOSの例/usr/local/etc/zoneinfo用)のタイムゾーンファイルを読み込むためTZ環境変数を設定すると、一度大きく、その実行時間を削減することがわかりました環境変数が設定されていません。

私はこのファイルを読んで環境変数を設定しましたが、ファイルの場所は異なる平面で異なる場合があります。だから、私は何とかこれらの目的のためにコードtzsetを再利用することでしょう。 これは簡単に見えるかもしれませんが、ちょうどヘッダtzsetは、タイムゾーン情報を検索および取得するために使用し、この機能を使用する:)

#include <timezone/tzfile.h> 

が、私は本当にglibcのヘッダを使用して、私が意味する、どのように行うのか分からない含まれています。コンパイラはこのヘッダを知りません(私のIDE、Clion、それも見えません)。私は本当にこれに固執した。

+0

次の2つの基本的な選択肢があります。 'autoconf'スクリプトを書く方法を知っている' configure'スクリプトに加えてください。これは、非プロプライエタリPOSIXベースのオペレーティングシステムで開発している人にとって必須のスキルです。固定された場所のセットを使用して、ランタイム定数をコンパイルするために使用します。または、アプリケーションを実行する前に設定する必要のある環境変数から場所を取得します。この状況は本当に 'autoconf'とGNUツールチェーンの残りの部分が設計されたものです。 –

+0

"autotoolsを使う"は、CMakeで何かをする方法を尋ねる人にとって有益な答えではありません。 –

答えて

1

CMakeLists.txtには、tzinfo.hにplatform checkを含める必要があります。例:あなたは、ファイルの内容を確認する心配されていない場合あなたはその後、#ifdef HAVE_TZFILE_H

を使用することができます

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

、あなたも少し速くなる代わりにFIND_FILEを使用することができます。 (CheckIncludeFilesは、実際には小さな.cファイルを使用し、#includeはそれをコンパイルしようとするヘッダね。)

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

関連する問題