From e5afacba700b4404e3bd97534d32390a5ef3ee82 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Thu, 24 Mar 2016 23:25:58 +0000 Subject: [PATCH] Optimize split implementation, avoid growing strings char by char --- src/string.cc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/string.cc b/src/string.cc index 2e09be2e3..15abcb388 100644 --- a/src/string.cc +++ b/src/string.cc @@ -135,6 +135,7 @@ Vector split(StringView str, char separator, char escape) { Vector res; auto it = str.begin(); + auto start = it; while (it != str.end()) { res.emplace_back(); @@ -144,21 +145,24 @@ Vector split(StringView str, char separator, char escape) auto c = *it; if (c == escape and it + 1 != str.end() and *(it+1) == separator) { - element += separator; + element += StringView{start, it+1}; + element.back() = separator; it += 2; + start = it; } else if (c == separator) { + element += StringView{start, it}; ++it; + start = it; break; } else - { - element += c; ++it; - } } } + if (start != str.end()) + res.back() += StringView{start, str.end()}; return res; }