続々global遅い件 (やっつけ解決編)
ちゅーっす。
というわけで,以下がdiff。
うわー,すげー冗長なコードだ。
そもそもcandidate が「/」かどうかの判定は1回やれば済むのに,4回もやってるよ。
その判定の結果をフラグ変数にもっておけばいい気もする。
けど,フォーマット文字列を変数にしたらいかんみたいなことを,
死んだばっちゃが言ってたような気もしないでもない。
オイラのテクでは,どうリファクタリングしたらいいかわからん!!
えっへん!! 突っ込み大歓迎!
diff -u ./libutil/getdbpath.c.org ./libutil/getdbpath.c --- ./libutil/getdbpath.c.org 2010-08-30 21:19:04.000000000 +0900 +++ ./libutil/getdbpath.c 2010-11-13 08:12:46.161750000 +0900 @@ -147,7 +147,13 @@ if (makeobjdir == NULL) setupvariables(verbose); - snprintf(path, sizeof(path), "%s/%s", candidate, dbname(GTAGS)); + if ((strnlen(candidate, MAXPATHLEN) == 1) && (*candidate == '/')) { + snprintf(path, sizeof(path), "%s%s", candidate, dbname(GTAGS)); + } + else { + snprintf(path, sizeof(path), "%s/%s", candidate, dbname(GTAGS)); + } + if (verbose) fprintf(stderr, "checking %s\n", path); if (test("fr", path)) { @@ -156,8 +162,16 @@ snprintf(dbpath, size, "%s", candidate); return 1; } - snprintf(path, sizeof(path), - "%s/%s/%s", candidate, makeobjdir, dbname(GTAGS)); + + if ((strnlen(candidate, MAXPATHLEN) == 1) && (*candidate == '/')) { + snprintf(path, sizeof(path), + "%s%s/%s", candidate, makeobjdir, dbname(GTAGS)); + } + else { + snprintf(path, sizeof(path), + "%s/%s/%s", candidate, makeobjdir, dbname(GTAGS)); + } + if (verbose) fprintf(stderr, "checking %s\n", path); if (test("fr", path)) { @@ -167,8 +181,14 @@ return 1; } #if !defined(_WIN32) && !defined(__DJGPP__) - snprintf(path, sizeof(path), - "%s%s/%s", makeobjdirprefix, candidate, dbname(GTAGS)); + if ((strnlen(candidate, MAXPATHLEN) == 1) && (*candidate == '/')) { + snprintf(path, sizeof(path), + "%s%s/%s", candidate, makeobjdir, dbname(GTAGS)); + } + else { + snprintf(path, sizeof(path), + "%s/%s/%s", candidate, makeobjdir, dbname(GTAGS)); + } if (verbose) fprintf(stderr, "checking %s\n", path); if (test("fr", path)) {
インストール後の結果
% /usr/bin/time global foo global: GTAGS not found. Command exited with non-zero status 3 0.03user 0.03system 0:00.03elapsed 176%CPU (0avgtext+0avgdata 332800maxresident)k 0inputs+0outputs (1300major+0minor)pagefaults 0swaps
ほらぁ,1秒かかってないじゃん。
とりあえず,解決ということでどうでしょう。