事あるごとに性能測定ログを埋め込んでは無効化してってのを最近よくやるので、ライブラリを作ろうと思い立ちました。
せっかく作ったので覚書。
2017/4/23 型定義違いがあったので修正 && configure化
##どんなものか?
printfのイメージで使ってもらうと、時刻付きのログを保存します。
ログは関数実行時すぐに出力するのではなく、一旦確保済みのメモリ上に保存し、最後にまとめて吐き出すようにしています。
処理実行の都度ログを吐かず、memcpyでログを吐いてるので単純にログを入れ込むよりも速度への影響は少ないと思うので、
ミドルウェアのアプリケーションレベルだったら十分使えるんじゃないかなと思っています。
##使い方
基本は以下です。
- 初期化関数timetestlog_initを実行
- printf代わりの関数timetestlog_store_printfをログを入れ込みたい箇所に追加
- 終了関数timetestlog_exitを実行し、ログを出力
void * timetestlog_init(char *delimiter, size_t maxloglen, unsigned long maxstoresize);
int timetestlog_store_printf(void * handle, const char *format, ...);
void timetestlog_exit(void * handle);
timetestlog_init:初期化関数
- input
- delimiter[in] timestampログ間の区切り文字指定が出来るようにしています。NULLの場合は" "。
- maxloglen[in] 出力ログ1行の最大長。この長さ以上のログは切り捨てられます。
- maxstoresize[in] ためておくログの最大数。この数以上のログは切り捨てられます。
- return
- その後のAPIで使用するhandle。NULLはエラー
timetestlog_store_printf:ログ保存関数。
printfの第1引数にtimetestlog_initで取得したhandleを指定するだけです。
timetestlog_exit:終了関数。
timetestlog_initで取得したhandleを指定します。
##コード
以下githubにあげています。
https://github.com/developer-kikikaikai/speedtest
cloneもしくはコードダウンロード後、
cd speedtest/lib
make
でbuild。同フォルダ内にlibtimelog.so, libtimelog.aが作成されます。
##動作環境
Ubuntu 14.04 Desctop 64bitで動作確認済み
Linux OS上なら動作すると思います。
##その他
・allocateはinit時だけにするなど、オーバーヘッドが少ないように気を付けていますが、va_startやmemcpyといった普通の関数に対するオーバーヘッドまでは気にしてないです。