collector_test.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //
  2. // collector_test.cpp
  3. //
  4. // Copyright (c) 2003 Peter Dimov
  5. //
  6. // Distributed under the Boost Software License, Version 1.0. (See
  7. // accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. #include <boost/shared_ptr.hpp>
  11. #include <vector>
  12. #include <iostream>
  13. #include <cstdlib>
  14. #include <ctime>
  15. // sp_collector.cpp exported functions
  16. std::size_t find_unreachable_objects(bool report);
  17. void free_unreachable_objects();
  18. struct X
  19. {
  20. void* fill[32];
  21. boost::shared_ptr<X> p;
  22. };
  23. void report()
  24. {
  25. std::cout << "Calling find_unreachable_objects:\n";
  26. std::clock_t t = std::clock();
  27. std::size_t n = find_unreachable_objects(false);
  28. t = std::clock() - t;
  29. std::cout << n << " unreachable objects.\n";
  30. std::cout << " " << static_cast<double>(t) / CLOCKS_PER_SEC << " seconds.\n";
  31. }
  32. void free()
  33. {
  34. std::cout << "Calling free_unreachable_objects:\n";
  35. std::clock_t t = std::clock();
  36. free_unreachable_objects();
  37. t = std::clock() - t;
  38. std::cout << " " << static_cast<double>(t) / CLOCKS_PER_SEC << " seconds.\n";
  39. }
  40. int main()
  41. {
  42. std::vector< boost::shared_ptr<X> > v1, v2;
  43. int const n = 256 * 1024;
  44. std::cout << "Filling v1 and v2\n";
  45. for(int i = 0; i < n; ++i)
  46. {
  47. v1.push_back(boost::shared_ptr<X>(new X));
  48. v2.push_back(boost::shared_ptr<X>(new X));
  49. }
  50. report();
  51. std::cout << "Creating the cycles\n";
  52. for(int i = 0; i < n - 1; ++i)
  53. {
  54. v2[i]->p = v2[i+1];
  55. }
  56. v2[n-1]->p = v2[0];
  57. report();
  58. std::cout << "Resizing v2 to size of 1\n";
  59. v2.resize(1);
  60. report();
  61. std::cout << "Clearing v2\n";
  62. v2.clear();
  63. report();
  64. std::cout << "Clearing v1\n";
  65. v1.clear();
  66. report();
  67. free();
  68. report();
  69. }