From 5df0c9714e235fc704cfd03aea833fe8163d0058 Mon Sep 17 00:00:00 2001 From: Philip Pronin Date: Fri, 17 Aug 2012 16:21:26 -0700 Subject: [PATCH] one more simple folly::join optimization Summary: Before: _bin/folly/test/string_test --benchmark --bm_regex=join --bm_min_usec=1000000 ============================================================================ folly/test/StringTest.cpp relative time/iter iters/s ============================================================================ joinCharStr 3.59us 278.29K joinStrStr 4.44us 225.09K joinInt 10.55us 94.76K ============================================================================ And after: _bin/folly/test/string_test --benchmark --bm_regex=join --bm_min_usec=1000000 ============================================================================ folly/test/StringTest.cpp relative time/iter iters/s ============================================================================ joinCharStr 3.61us 277.01K joinStrStr 3.77us 264.97K joinInt 9.92us 100.81K ============================================================================ Test Plan: unittests, benchmark Reviewed By: tudorb@fb.com FB internal diff: D552364 --- folly/String-inl.h | 5 +++++ folly/test/StringTest.cpp | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/folly/String-inl.h b/folly/String-inl.h index 02d376d8..4bff753e 100644 --- a/folly/String-inl.h +++ b/folly/String-inl.h @@ -312,6 +312,11 @@ void internalJoinAppend(Delim delimiter, Iterator end, String& output) { assert(begin != end); + if (std::is_same::value && + delimSize(delimiter) == 1) { + internalJoinAppend(delimFront(delimiter), begin, end, output); + return; + } toAppend(*begin, &output); while (++begin != end) { toAppend(delimiter, *begin, &output); diff --git a/folly/test/StringTest.cpp b/folly/test/StringTest.cpp index ec01eb6c..04281c65 100644 --- a/folly/test/StringTest.cpp +++ b/folly/test/StringTest.cpp @@ -761,7 +761,16 @@ BENCHMARK(boost_splitOnSingleChar, iters) { } } -BENCHMARK(joinStr, iters) { +BENCHMARK(joinCharStr, iters) { + static const std::vector input = { + "one", "two", "three", "four", "five", "six", "seven" }; + for (int i = 0; i < iters << 4; ++i) { + std::string output; + folly::join(':', input, output); + } +} + +BENCHMARK(joinStrStr, iters) { static const std::vector input = { "one", "two", "three", "four", "five", "six", "seven" }; for (int i = 0; i < iters << 4; ++i) { -- 2.34.1