FBStringBenchmark.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /*
  2. * Copyright 2012-present 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. // Author: andrei.alexandrescu@fb.com
  18. #include <folly/FBString.h>
  19. #include <cstdlib>
  20. #include <fstream>
  21. #include <list>
  22. #include <sstream>
  23. #include <boost/random.hpp>
  24. #include <folly/Benchmark.h>
  25. #include <folly/Random.h>
  26. #include <folly/container/Foreach.h>
  27. #include <folly/portability/GFlags.h>
  28. using namespace std;
  29. using namespace folly;
  30. static const int seed = folly::randomNumberSeed();
  31. typedef boost::mt19937 RandomT;
  32. static RandomT rng(seed);
  33. template <class Integral1, class Integral2>
  34. Integral2 random(Integral1 low, Integral2 up) {
  35. boost::uniform_int<> range(low, up);
  36. return range(rng);
  37. }
  38. template <class String>
  39. void randomString(String* toFill, size_t size = 1000) {
  40. assert(toFill);
  41. toFill->resize(size);
  42. FOR_EACH (i, *toFill) { *i = random('a', 'z'); }
  43. }
  44. template <class String>
  45. void randomBinaryString(String* toFill, size_t size = 1000) {
  46. assert(toFill);
  47. toFill->resize(size);
  48. FOR_EACH (i, *toFill) { *i = random('0', '1'); }
  49. }
  50. template <class String, class Integral>
  51. void Num2String(String& str, Integral n) {
  52. str.resize(30, '\0');
  53. sprintf(&str[0], "%lu", static_cast<unsigned long>(n));
  54. str.resize(strlen(str.c_str()));
  55. }
  56. std::list<char> RandomList(unsigned int maxSize) {
  57. std::list<char> lst(random(0u, maxSize));
  58. std::list<char>::iterator i = lst.begin();
  59. for (; i != lst.end(); ++i) {
  60. *i = random('a', 'z');
  61. }
  62. return lst;
  63. }
  64. #define CONCAT(A, B) CONCAT_HELPER(A, B)
  65. #define CONCAT_HELPER(A, B) A##B
  66. #define BENCHFUN(F) CONCAT(CONCAT(BM_, F), CONCAT(_, STRING))
  67. #define STRING string
  68. #include <folly/test/FBStringTestBenchmarks.cpp.h> // nolint
  69. #undef STRING
  70. #define STRING fbstring
  71. #include <folly/test/FBStringTestBenchmarks.cpp.h> // nolint
  72. #undef STRING
  73. int main(int argc, char** argv) {
  74. gflags::ParseCommandLineFlags(&argc, &argv, true);
  75. folly::runBenchmarks();
  76. return 0;
  77. }
  78. /*
  79. malloc
  80. BENCHFUN(defaultCtor) 100000 1.426 s 14.26 us 68.47 k
  81. BM_copyCtor_string/32k 100000 63.48 ms 634.8 ns 1.502 M
  82. BM_ctorFromArray_string/32k 100000 303.3 ms 3.033 us 321.9 k
  83. BM_ctorFromChar_string/1M 100000 9.915 ms 99.15 ns 9.619 M
  84. BM_assignmentOp_string/256 100000 69.09 ms 690.9 ns 1.38 M
  85. BENCHFUN(assignmentFill) 100000 1.775 ms 17.75 ns 53.73 M
  86. BM_resize_string/512k 100000 1.667 s 16.67 us 58.58 k
  87. BM_findSuccessful_string/512k 100000 287.3 ms 2.873 us 339.9 k
  88. BM_findUnsuccessful_string/512k 100000 320.3 ms 3.203 us 304.9 k
  89. BM_replace_string/256 100000 69.68 ms 696.8 ns 1.369 M
  90. BM_push_back_string/1k 100000 433.1 ms 4.331 us 225.5 k
  91. BENCHFUN(defaultCtor) 100000 1.086 s 10.86 us 89.91 k
  92. BM_copyCtor_fbstring/32k 100000 4.218 ms 42.18 ns 22.61 M
  93. BM_ctorFromArray_fbstring/32k 100000 145.2 ms 1.452 us 672.7 k
  94. BM_ctorFromChar_fbstring/1M 100000 9.21 ms 92.1 ns 10.35 M
  95. BM_assignmentOp_fbstring/256 100000 61.95 ms 619.5 ns 1.54 M
  96. BENCHFUN(assignmentFill) 100000 1.41 ms 14.1 ns 67.64 M
  97. BM_resize_fbstring/512k 100000 1.668 s 16.68 us 58.56 k
  98. BM_findSuccessful_fbstring/512k 100000 20.6 ms 206 ns 4.629 M
  99. BM_findUnsuccessful_fbstring/512k 100000 141.3 ms 1.413 us 691.1 k
  100. BM_replace_fbstring/256 100000 77.12 ms 771.2 ns 1.237 M
  101. BM_push_back_fbstring/1k 100000 1.745 s 17.45 us 55.95 k
  102. jemalloc
  103. BENCHFUN(defaultCtor) 100000 1.426 s 14.26 us 68.5 k
  104. BM_copyCtor_string/32k 100000 275.7 ms 2.757 us 354.2 k
  105. BM_ctorFromArray_string/32k 100000 270 ms 2.7 us 361.7 k
  106. BM_ctorFromChar_string/1M 100000 10.36 ms 103.6 ns 9.206 M
  107. BM_assignmentOp_string/256 100000 70.44 ms 704.3 ns 1.354 M
  108. BENCHFUN(assignmentFill) 100000 1.766 ms 17.66 ns 54 M
  109. BM_resize_string/512k 100000 1.675 s 16.75 us 58.29 k
  110. BM_findSuccessful_string/512k 100000 90.89 ms 908.9 ns 1.049 M
  111. BM_findUnsuccessful_string/512k 100000 315.1 ms 3.151 us 309.9 k
  112. BM_replace_string/256 100000 71.14 ms 711.4 ns 1.341 M
  113. BM_push_back_string/1k 100000 425.1 ms 4.251 us 229.7 k
  114. BENCHFUN(defaultCtor) 100000 1.082 s 10.82 us 90.23 k
  115. BM_copyCtor_fbstring/32k 100000 4.213 ms 42.13 ns 22.64 M
  116. BM_ctorFromArray_fbstring/32k 100000 113.2 ms 1.132 us 863 k
  117. BM_ctorFromChar_fbstring/1M 100000 9.162 ms 91.62 ns 10.41 M
  118. BM_assignmentOp_fbstring/256 100000 61.34 ms 613.4 ns 1.555 M
  119. BENCHFUN(assignmentFill) 100000 1.408 ms 14.08 ns 67.73 M
  120. BM_resize_fbstring/512k 100000 1.671 s 16.71 us 58.43 k
  121. BM_findSuccessful_fbstring/512k 100000 8.723 ms 87.23 ns 10.93 M
  122. BM_findUnsuccessful_fbstring/512k 100000 141.3 ms 1.413 us 691.2 k
  123. BM_replace_fbstring/256 100000 77.83 ms 778.3 ns 1.225 M
  124. BM_push_back_fbstring/1k 100000 1.744 s 17.44 us 55.99 k
  125. */