Avoid copy in folly::toJson
authorBen Maurer <bmaurer@fb.com>
Mon, 25 Nov 2013 19:28:40 +0000 (11:28 -0800)
committerPeter Griess <pgriess@fb.com>
Tue, 26 Nov 2013 15:05:17 +0000 (07:05 -0800)
Summary: Adding const avoids a copy constuctor.

Test Plan:
Unit tests, new benchmark:
toJson        1.83us  546.15K
toJson        1.54us  649.98K

Reviewed By: tudorb@fb.com

FB internal diff: D1071781

folly/json.cpp
folly/test/JsonTest.cpp

index 7711a20332c85d05978554bd7c11919e29d69833..5fe44a59b208ac8810f9e6d06851a1b2da4e3626 100644 (file)
@@ -149,7 +149,7 @@ struct Printer {
   }
 
 private:
-  void printKV(const std::pair<dynamic, dynamic>& p) const {
+  void printKV(const std::pair<const dynamic, dynamic>& p) const {
     if (!opts_.allow_non_string_keys && !p.first.isString()) {
       throw std::runtime_error("folly::toJson: JSON object key was not a "
         "string");
index 6ab9768672d81c1a1cad7e6ae527f524fc970239..cfa84f4c3ef5380af1c51bbcfc89a6a624b18646 100644 (file)
@@ -419,6 +419,16 @@ BENCHMARK(parseBigString, iters) {
   }
 }
 
+BENCHMARK(toJson, iters) {
+  dynamic something = parseJson(
+    "{\"old_value\":40,\"changed\":true,\"opened\":false,\"foo\":[1,2,3,4,5,6]}"
+  );
+
+  for (int i = 0; i < iters; i++) {
+    toJson(something);
+  }
+}
+
 int main(int argc, char** argv) {
   testing::InitGoogleTest(&argc, argv);
   google::ParseCommandLineFlags(&argc, &argv, true);