search_bench.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. // Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. // $Id$
  15. #include <unistd.h> // for getpid
  16. #include <cstdlib> // for rand
  17. #include <algorithm>
  18. #include <iostream>
  19. #include <vector>
  20. #include <set>
  21. #include <exceptions/exceptions.h>
  22. #include <bench/benchmark.h>
  23. using namespace std;
  24. using namespace isc::bench;
  25. namespace {
  26. template <bool Sorted>
  27. class VectorSearchBenchMark {
  28. public:
  29. VectorSearchBenchMark(const vector<int>& data,
  30. const vector<int>& keys) :
  31. data_(data), keys_(keys)
  32. {}
  33. unsigned int run() {
  34. vector<int>::const_iterator iter;
  35. vector<int>::const_iterator end_key = keys_.end();
  36. for (iter = keys_.begin(); iter != end_key; ++iter) {
  37. if (Sorted) {
  38. binary_search(data_.begin(), data_.end(), *iter);
  39. } else {
  40. find(data_.begin(), data_.end(), *iter);
  41. }
  42. }
  43. return (keys_.size());
  44. }
  45. private:
  46. const vector<int>& data_;
  47. const vector<int>& keys_;
  48. };
  49. class SetSearchBenchMark {
  50. public:
  51. SetSearchBenchMark(const set<int>& data, const vector<int>& keys) :
  52. data_(data), keys_(keys)
  53. {}
  54. unsigned int run() {
  55. vector<int>::const_iterator iter;
  56. vector<int>::const_iterator end_key = keys_.end();
  57. for (iter = keys_.begin(); iter != end_key; ++iter) {
  58. data_.find(*iter);
  59. }
  60. return (keys_.size());
  61. }
  62. public: // make it visible to the BenchMark class
  63. const set<int>& data_;
  64. private:
  65. const vector<int>& keys_;
  66. };
  67. }
  68. namespace isc {
  69. namespace bench {
  70. template<>
  71. void
  72. BenchMark<SetSearchBenchMark>::setUp() {
  73. cout << "Benchmark for searching std::set (size="
  74. << target_.data_.size() << ")" << endl;
  75. }
  76. }
  77. }
  78. namespace {
  79. const int DEFAULT_ITERATION = 100;
  80. const int DEFAULT_SIZE = 10000;
  81. void
  82. usage() {
  83. cerr << "Usage: search_bench [-n iterations] [-s data_size]" << endl;
  84. exit (1);
  85. }
  86. }
  87. int
  88. main(int argc, char* argv[]) {
  89. int ch;
  90. int iteration = DEFAULT_ITERATION;
  91. int size = DEFAULT_SIZE;
  92. while ((ch = getopt(argc, argv, "n:s:")) != -1) {
  93. switch (ch) {
  94. case 'n':
  95. iteration = atoi(optarg);
  96. break;
  97. case 's':
  98. size = atoi(optarg);
  99. break;
  100. case '?':
  101. default:
  102. usage();
  103. }
  104. }
  105. argc -= optind;
  106. argv += optind;
  107. if (argc != 0) {
  108. usage();
  109. }
  110. srand(getpid());
  111. vector<int> data_vector;
  112. set<int> data_set;
  113. vector<int> keys;
  114. for (int i = 0; i < size; ++i) {
  115. data_vector.push_back(i);
  116. data_set.insert(i);
  117. keys.push_back(rand() % size);
  118. }
  119. cout << "Benchmark for linear search" << endl;
  120. BenchMark<VectorSearchBenchMark<false> >(iteration,
  121. VectorSearchBenchMark<false>(
  122. data_vector, keys));
  123. cout << "Benchmark for binary search" << endl;
  124. BenchMark<VectorSearchBenchMark<true> >(iteration,
  125. VectorSearchBenchMark<true>(
  126. data_vector, keys));
  127. BenchMark<SetSearchBenchMark>(iteration,
  128. SetSearchBenchMark(data_set, keys));
  129. return (0);
  130. }