From 5cd0eb179d2adf639e7ca2e25d313232192d5583 Mon Sep 17 00:00:00 2001 From: Zhu Yuejun Date: Mon, 9 Jan 2017 16:17:44 +0800 Subject: [PATCH 1/5] Update namespace.cc: re-implement the member function NormalizePath Update namespace.cc: re-implement the member function NormalizePath, which increased efficiency by at least 10% --- src/nameserver/namespace.cc | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/nameserver/namespace.cc b/src/nameserver/namespace.cc index f9d06912..9bf3f110 100644 --- a/src/nameserver/namespace.cc +++ b/src/nameserver/namespace.cc @@ -731,23 +731,30 @@ bool NameSpace::RebuildBlockMap(std::function callback) } std::string NameSpace::NormalizePath(const std::string& path) { - // Is there a better implementation? - std::string ret; + string ret; if (path.empty() || path[0] != '/') { ret = "/"; } - bool slash = false; - for (uint32_t i = 0; i < path.size(); i++) { + uint32_t len = path.size(); + uint32_t i = 1; + for (; i < len; ) { if (path[i] == '/') { - if (slash) continue; - slash = true; - } else { - slash = false; + if (path[i-1] == '/') { + ret.push_back(path[i-1]); + } + i++; + } + else { + ret.push_back(path[i-1]); + ret.push_back(path[i]); + i += 2; } - ret.push_back(path[i]); } - if (ret.size() > 1U && ret[ret.size() - 1] == '/') { - ret.resize(ret.size() - 1); + if (i == len && path[len-1] != '/') { + ret.push_back(path[len-1]); + } + if (ret.empty()) { + ret = "/"; } return ret; } From 29bf8810831ea308cf1265d6726957ab7dc6a313 Mon Sep 17 00:00:00 2001 From: Zhu Yuejun Date: Mon, 9 Jan 2017 16:40:10 +0800 Subject: [PATCH 2/5] Update namesapce.cc: re-implement the member function NormalizePath --- src/nameserver/namespace.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nameserver/namespace.cc b/src/nameserver/namespace.cc index 9bf3f110..be1cc3e2 100644 --- a/src/nameserver/namespace.cc +++ b/src/nameserver/namespace.cc @@ -731,7 +731,7 @@ bool NameSpace::RebuildBlockMap(std::function callback) } std::string NameSpace::NormalizePath(const std::string& path) { - string ret; + std::string ret; if (path.empty() || path[0] != '/') { ret = "/"; } From 5bf3fe3badfad2cdeb3e413696095ff2fdac030e Mon Sep 17 00:00:00 2001 From: Zhu Yuejun Date: Mon, 9 Jan 2017 16:45:44 +0800 Subject: [PATCH 3/5] Update namespace.cc: re-implement the member function, NormalizePath. --- src/nameserver/namespace.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/nameserver/namespace.cc b/src/nameserver/namespace.cc index be1cc3e2..2b535714 100644 --- a/src/nameserver/namespace.cc +++ b/src/nameserver/namespace.cc @@ -743,8 +743,7 @@ std::string NameSpace::NormalizePath(const std::string& path) { ret.push_back(path[i-1]); } i++; - } - else { + } else { ret.push_back(path[i-1]); ret.push_back(path[i]); i += 2; From 7678091242881f28f89779bafbf280b52459c595 Mon Sep 17 00:00:00 2001 From: Zhu Yuejun Date: Mon, 9 Jan 2017 18:00:41 +0800 Subject: [PATCH 4/5] Update namespace.cc --- src/nameserver/namespace.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nameserver/namespace.cc b/src/nameserver/namespace.cc index 2b535714..dd57a33a 100644 --- a/src/nameserver/namespace.cc +++ b/src/nameserver/namespace.cc @@ -739,7 +739,7 @@ std::string NameSpace::NormalizePath(const std::string& path) { uint32_t i = 1; for (; i < len; ) { if (path[i] == '/') { - if (path[i-1] == '/') { + if (path[i-1] != '/') { ret.push_back(path[i-1]); } i++; From be5c28915c4af34af21c0f6f65c7eb6e26549823 Mon Sep 17 00:00:00 2001 From: Zhu Yuejun Date: Mon, 9 Jan 2017 18:03:52 +0800 Subject: [PATCH 5/5] re-implement the member function NormalizePath --- src/nameserver/namespace.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nameserver/namespace.cc b/src/nameserver/namespace.cc index dd57a33a..1fc427a1 100644 --- a/src/nameserver/namespace.cc +++ b/src/nameserver/namespace.cc @@ -739,7 +739,7 @@ std::string NameSpace::NormalizePath(const std::string& path) { uint32_t i = 1; for (; i < len; ) { if (path[i] == '/') { - if (path[i-1] != '/') { + if (path[i-1] != '/') { ret.push_back(path[i-1]); } i++;