Add DCHECKs for checking that underlying IOBuf wasn't modified
[folly.git] / folly / test / IPAddressBenchmark.cpp
index bf3433ce03ea20e33923fb4c4c7a27ece86d6f15..69bc9db4fbec6b7d96bbaec829056f90956a24fa 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017 Facebook, Inc.
+ * Copyright 2014-present Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <folly/Format.h>
 #include <folly/IPAddress.h>
 
 #include <glog/logging.h>
@@ -29,11 +30,9 @@ BENCHMARK(ipv4_to_string_inet_ntop, iters) {
   char outputString[INET_ADDRSTRLEN] = {0};
 
   while (iters--) {
-    const char* val = inet_ntop(
-      AF_INET,
-      &ip,
-      outputString,
-      sizeof(outputString));
+    const char* val =
+        inet_ntop(AF_INET, &ip, outputString, sizeof(outputString));
+    folly::doNotOptimizeAway(val);
   }
 }
 
@@ -41,6 +40,32 @@ BENCHMARK_RELATIVE(ipv4_to_fully_qualified, iters) {
   IPAddressV4 ip("127.0.0.1");
   while (iters--) {
     string outputString = ip.toFullyQualified();
+    folly::doNotOptimizeAway(outputString);
+    folly::doNotOptimizeAway(outputString.data());
+  }
+}
+
+BENCHMARK_DRAW_LINE()
+
+BENCHMARK(ipv4_to_fully_qualified_port, iters) {
+  IPAddressV4 ip("255.255.255.255");
+  while (iters--) {
+    string outputString = folly::sformat("{}:{}", ip.toFullyQualified(), 65535);
+    folly::doNotOptimizeAway(outputString);
+    folly::doNotOptimizeAway(outputString.data());
+  }
+}
+
+BENCHMARK_RELATIVE(ipv4_append_to_fully_qualified_port, iters) {
+  IPAddressV4 ip("255.255.255.255");
+  while (iters--) {
+    string outputString;
+    outputString.reserve(IPAddressV4::kMaxToFullyQualifiedSize + 1 + 5);
+    ip.toFullyQualifiedAppend(outputString);
+    outputString += ':';
+    folly::toAppend(65535, &outputString);
+    folly::doNotOptimizeAway(outputString);
+    folly::doNotOptimizeAway(outputString.data());
   }
 }
 
@@ -50,22 +75,90 @@ BENCHMARK(ipv6_to_string_inet_ntop, iters) {
   IPAddressV6 ipv6Addr("F1E0:0ACE:FB94:7ADF:22E8:6DE6:9672:3725");
   in6_addr ip = ipv6Addr.toAddr();
   char outputString[INET6_ADDRSTRLEN] = {0};
-  bool checkResult = (iters == 1);
 
   while (iters--) {
-    const char* val = inet_ntop(
-      AF_INET6,
-      &ip,
-      outputString,
-      sizeof(outputString));
+    const char* val =
+        inet_ntop(AF_INET6, &ip, outputString, sizeof(outputString));
+    folly::doNotOptimizeAway(val);
   }
 }
 
 BENCHMARK_RELATIVE(ipv6_to_fully_qualified, iters) {
   IPAddressV6 ip("F1E0:0ACE:FB94:7ADF:22E8:6DE6:9672:3725");
-  string outputString;
   while (iters--) {
-    outputString = ip.toFullyQualified();
+    string outputString = ip.toFullyQualified();
+    folly::doNotOptimizeAway(outputString);
+    folly::doNotOptimizeAway(outputString.data());
+  }
+}
+
+BENCHMARK_DRAW_LINE()
+
+BENCHMARK(ipv6_to_fully_qualified_port, iters) {
+  IPAddressV6 ip("F1E0:0ACE:FB94:7ADF:22E8:6DE6:9672:3725");
+  while (iters--) {
+    string outputString = folly::sformat("{}:{}", ip.toFullyQualified(), 65535);
+    folly::doNotOptimizeAway(outputString);
+    folly::doNotOptimizeAway(outputString.data());
+  }
+}
+
+BENCHMARK_RELATIVE(ipv6_append_to_fully_qualified_port, iters) {
+  IPAddressV6 ip("F1E0:0ACE:FB94:7ADF:22E8:6DE6:9672:3725");
+  while (iters--) {
+    string outputString;
+    outputString.reserve(folly::IPAddressV6::kToFullyQualifiedSize + 1 + 5);
+    ip.toFullyQualifiedAppend(outputString);
+    outputString += ':';
+    folly::toAppend(65535, &outputString);
+    folly::doNotOptimizeAway(outputString);
+    folly::doNotOptimizeAway(outputString.data());
+  }
+}
+
+BENCHMARK_DRAW_LINE()
+
+BENCHMARK(ipv6_ctor_valid, iters) {
+  while (iters--) {
+    try {
+      IPAddressV6 ip("2803:6082:18e0:2c49:1a23:9ee0:5c87:9800");
+      doNotOptimizeAway(ip);
+    } catch (const IPAddressFormatException& ex) {
+      doNotOptimizeAway(ex);
+    }
+  }
+}
+
+BENCHMARK_RELATIVE(ipv6_ctor_invalid, iters) {
+  while (iters--) {
+    try {
+      IPAddressV6 ip("2803:6082:18e0:2c49:1a23:9ee0:5c87:980r");
+      doNotOptimizeAway(ip);
+    } catch (const IPAddressFormatException& ex) {
+      doNotOptimizeAway(ex);
+    }
+  }
+}
+
+BENCHMARK_DRAW_LINE()
+
+BENCHMARK(ipv6_try_from_string_valid, iters) {
+  while (iters--) {
+    auto maybeIp =
+        IPAddressV6::tryFromString("2803:6082:18e0:2c49:1a23:9ee0:5c87:9800");
+    CHECK(maybeIp.hasValue());
+    doNotOptimizeAway(maybeIp);
+    doNotOptimizeAway(maybeIp.value());
+  }
+}
+
+BENCHMARK_RELATIVE(ipv6_try_from_string_invalid, iters) {
+  while (iters--) {
+    auto maybeIp =
+        IPAddressV6::tryFromString("2803:6082:18e0:2c49:1a23:9ee0:5c87:980r");
+    CHECK(maybeIp.hasError());
+    doNotOptimizeAway(maybeIp);
+    doNotOptimizeAway(maybeIp.error());
   }
 }
 
@@ -73,14 +166,26 @@ BENCHMARK_RELATIVE(ipv6_to_fully_qualified, iters) {
 // ============================================================================
 // folly/test/IPAddressBenchmark.cpp               relative  time/iter  iters/s
 // ============================================================================
-// ipv4_to_string_inet_ntop                                   237.87ns    4.20M
-// ipv4_to_fully_qualified                          362.31%    65.65ns   15.23M
+// ipv4_to_string_inet_ntop                                   227.13ns    4.40M
+// ipv4_to_fully_qualified                         1418.95%    16.01ns   62.47M
+// ----------------------------------------------------------------------------
+// ipv4_to_fully_qualified_port                                77.51ns   12.90M
+// ipv4_append_to_fully_qualified_port              133.72%    57.96ns   17.25M
+// ----------------------------------------------------------------------------
+// ipv6_to_string_inet_ntop                                   750.53ns    1.33M
+// ipv6_to_fully_qualified                          608.68%   123.30ns    8.11M
+// ----------------------------------------------------------------------------
+// ipv6_to_fully_qualified_port                               150.76ns    6.63M
+// ipv6_append_to_fully_qualified_port              178.73%    84.35ns   11.86M
+// ----------------------------------------------------------------------------
+// ipv6_ctor_valid                                            379.97ns    2.63M
+// ipv6_ctor_invalid                                 10.38%     3.66us  273.22K
 // ----------------------------------------------------------------------------
-// ipv6_to_string_inet_ntop                                   768.60ns    1.30M
-// ipv6_to_fully_qualified                          821.81%    93.53ns   10.69M
+// ipv6_try_from_string_valid                                 375.34ns    2.66M
+// ipv6_try_from_string_invalid                     111.93%   335.34ns    2.98M
 // ============================================================================
 
-int main(int argc, char *argv[]) {
+int main(int argc, charargv[]) {
   gflags::ParseCommandLineFlags(&argc, &argv, true);
   runBenchmarks();
   return 0;