Optimize getline(istream&, fbstring&) implementation
[folly.git] / folly / test / FBStringBenchmark.cpp
1 /*
2  * Copyright 2015 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 //
18 // Author: andrei.alexandrescu@fb.com
19
20 #include <folly/FBString.h>
21
22 #include <cstdlib>
23
24 #include <list>
25 #include <fstream>
26 #include <sstream>
27 #include <boost/algorithm/string.hpp>
28 #include <boost/random.hpp>
29
30 #include <gflags/gflags.h>
31
32 #include <folly/Foreach.h>
33 #include <folly/Random.h>
34 #include <folly/Benchmark.h>
35
36 using namespace std;
37 using namespace folly;
38
39 static const int seed = folly::randomNumberSeed();
40 typedef boost::mt19937 RandomT;
41 static RandomT rng(seed);
42 static const size_t maxString = 100;
43 static const bool avoidAliasing = true;
44
45 template <class Integral1, class Integral2>
46 Integral2 random(Integral1 low, Integral2 up) {
47   boost::uniform_int<> range(low, up);
48   return range(rng);
49 }
50
51 template <class String>
52 void randomString(String* toFill, unsigned int maxSize = 1000) {
53   assert(toFill);
54   toFill->resize(random(0, maxSize));
55   FOR_EACH (i, *toFill) {
56     *i = random('a', 'z');
57   }
58 }
59
60 template <class String>
61 void randomBinaryString(String* toFill, unsigned int maxSize = 1000) {
62   assert(toFill);
63   toFill->resize(random(0, maxSize));
64   FOR_EACH (i, *toFill) {
65     *i = random('0', '1');
66   }
67 }
68
69 template <class String, class Integral>
70 void Num2String(String& str, Integral n) {
71   str.resize(30, '\0');
72   sprintf(&str[0], "%lu", static_cast<unsigned long>(n));
73   str.resize(strlen(str.c_str()));
74 }
75
76 std::list<char> RandomList(unsigned int maxSize) {
77   std::list<char> lst(random(0u, maxSize));
78   std::list<char>::iterator i = lst.begin();
79   for (; i != lst.end(); ++i) {
80     *i = random('a', 'z');
81  }
82   return lst;
83 }
84
85 #define CONCAT(A, B) CONCAT_HELPER(A, B)
86 #define CONCAT_HELPER(A, B) A##B
87 #define BENCHFUN(F) CONCAT(CONCAT(BM_, F), CONCAT(_, STRING))
88
89 #define STRING string
90 #include <folly/test/FBStringTestBenchmarks.cpp.h> // nolint
91 #undef STRING
92 #define STRING fbstring
93 #include <folly/test/FBStringTestBenchmarks.cpp.h> // nolint
94 #undef STRING
95
96 int main(int argc, char** argv) {
97   gflags::ParseCommandLineFlags(&argc, &argv, true);
98   folly::runBenchmarks();
99   return 0;
100 }
101
102 /*
103 malloc
104
105 BENCHFUN(defaultCtor)                  100000  1.426 s   14.26 us  68.47 k
106 BM_copyCtor_string/32k                 100000  63.48 ms  634.8 ns  1.502 M
107 BM_ctorFromArray_string/32k            100000  303.3 ms  3.033 us  321.9 k
108 BM_ctorFromChar_string/1M              100000  9.915 ms  99.15 ns  9.619 M
109 BM_assignmentOp_string/256             100000  69.09 ms  690.9 ns   1.38 M
110 BENCHFUN(assignmentFill)               100000  1.775 ms  17.75 ns  53.73 M
111 BM_resize_string/512k                  100000  1.667 s   16.67 us  58.58 k
112 BM_findSuccessful_string/512k          100000  287.3 ms  2.873 us  339.9 k
113 BM_findUnsuccessful_string/512k        100000  320.3 ms  3.203 us  304.9 k
114 BM_replace_string/256                  100000  69.68 ms  696.8 ns  1.369 M
115 BM_push_back_string/1k                 100000  433.1 ms  4.331 us  225.5 k
116
117 BENCHFUN(defaultCtor)                  100000  1.086 s   10.86 us  89.91 k
118 BM_copyCtor_fbstring/32k               100000  4.218 ms  42.18 ns  22.61 M
119 BM_ctorFromArray_fbstring/32k          100000  145.2 ms  1.452 us  672.7 k
120 BM_ctorFromChar_fbstring/1M            100000   9.21 ms   92.1 ns  10.35 M
121 BM_assignmentOp_fbstring/256           100000  61.95 ms  619.5 ns   1.54 M
122 BENCHFUN(assignmentFill)               100000   1.41 ms   14.1 ns  67.64 M
123 BM_resize_fbstring/512k                100000  1.668 s   16.68 us  58.56 k
124 BM_findSuccessful_fbstring/512k        100000   20.6 ms    206 ns  4.629 M
125 BM_findUnsuccessful_fbstring/512k      100000  141.3 ms  1.413 us  691.1 k
126 BM_replace_fbstring/256                100000  77.12 ms  771.2 ns  1.237 M
127 BM_push_back_fbstring/1k               100000  1.745 s   17.45 us  55.95 k
128
129 jemalloc
130
131 BENCHFUN(defaultCtor)                  100000  1.426 s   14.26 us   68.5 k
132 BM_copyCtor_string/32k                 100000  275.7 ms  2.757 us  354.2 k
133 BM_ctorFromArray_string/32k            100000    270 ms    2.7 us  361.7 k
134 BM_ctorFromChar_string/1M              100000  10.36 ms  103.6 ns  9.206 M
135 BM_assignmentOp_string/256             100000  70.44 ms  704.3 ns  1.354 M
136 BENCHFUN(assignmentFill)               100000  1.766 ms  17.66 ns     54 M
137 BM_resize_string/512k                  100000  1.675 s   16.75 us  58.29 k
138 BM_findSuccessful_string/512k          100000  90.89 ms  908.9 ns  1.049 M
139 BM_findUnsuccessful_string/512k        100000  315.1 ms  3.151 us  309.9 k
140 BM_replace_string/256                  100000  71.14 ms  711.4 ns  1.341 M
141 BM_push_back_string/1k                 100000  425.1 ms  4.251 us  229.7 k
142
143 BENCHFUN(defaultCtor)                  100000  1.082 s   10.82 us  90.23 k
144 BM_copyCtor_fbstring/32k               100000  4.213 ms  42.13 ns  22.64 M
145 BM_ctorFromArray_fbstring/32k          100000  113.2 ms  1.132 us    863 k
146 BM_ctorFromChar_fbstring/1M            100000  9.162 ms  91.62 ns  10.41 M
147 BM_assignmentOp_fbstring/256           100000  61.34 ms  613.4 ns  1.555 M
148 BENCHFUN(assignmentFill)               100000  1.408 ms  14.08 ns  67.73 M
149 BM_resize_fbstring/512k                100000  1.671 s   16.71 us  58.43 k
150 BM_findSuccessful_fbstring/512k        100000  8.723 ms  87.23 ns  10.93 M
151 BM_findUnsuccessful_fbstring/512k      100000  141.3 ms  1.413 us  691.2 k
152 BM_replace_fbstring/256                100000  77.83 ms  778.3 ns  1.225 M
153 BM_push_back_fbstring/1k               100000  1.744 s   17.44 us  55.99 k
154 */