Suggestion of fixing folly::to<std::string>(double/float) performance issue
authorBi Xue <bixue@fb.com>
Sun, 21 Aug 2016 04:10:36 +0000 (21:10 -0700)
committerFacebook Github Bot 5 <facebook-github-bot-5-bot@fb.com>
Sun, 21 Aug 2016 04:23:26 +0000 (21:23 -0700)
Summary:
When calling folly::to<SomeString>(double), generic implementation will
firstly reserve 24 (or 25 when negative value) bytes. This will introduce
a malloc call for most of mainstream string implementation.

But for most cases, a floating point doesn't need 24 (or 25) bytes to
be converted as a string.

This diff try to introduce a special version which does not do string reserve.

Reviewed By: ericniebler

Differential Revision: D3728171

fbshipit-source-id: d70ead396ad6c8d0df1f542c5516f7534e82cb97

folly/Conv.h

index 9fc196965763bfddcfb997c1f1e4b781abd2637c..09f762bc7d9f7638dfc40960ed65869420adebdd 100644 (file)
@@ -928,6 +928,27 @@ to(const Ts&... vs) {
   return result;
 }
 
+/**
+ * Special version of to<SomeString> for floating point. When calling
+ * folly::to<SomeString>(double), generic implementation above will
+ * firstly reserve 24 (or 25 when negative value) bytes. This will
+ * introduce a malloc call for most mainstream string implementations.
+ *
+ * But for most cases, a floating point doesn't need 24 (or 25) bytes to
+ * be converted as a string.
+ *
+ * This special version will not do string reserve.
+ */
+template <class Tgt, class Src>
+typename std::enable_if<
+    IsSomeString<Tgt>::value && std::is_floating_point<Src>::value,
+    Tgt>::type
+to(Src value) {
+  Tgt result;
+  toAppend(value, &result);
+  return result;
+}
+
 /**
  * toDelim<SomeString>(SomeString str) returns itself.
  */