続々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秒かかってないじゃん。


とりあえず,解決ということでどうでしょう。