Advertisement
Guest User

Untitled

a guest
May 29th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.81 KB | None | 0 0
  1. #pragma once
  2. #include <vector>
  3. #include <string>
  4.  
  5.  
  6. class container_test
  7. {
  8. protected:
  9.     int container_size;
  10.     std::vector<std::string> ops;
  11. public:
  12.     std::vector<std::string> get_results()
  13.     {
  14.         return ops;
  15.     }
  16.     virtual void run()
  17.     {
  18.         insert_beg();
  19.         insert_end();
  20.         sequential_access();
  21.         random_access();
  22.     }  
  23.     virtual void insert_beg() = 0;
  24.     virtual void insert_end() = 0;
  25.     virtual void sequential_access() = 0;
  26.     virtual void random_access() = 0;
  27. };
  28.  
  29. //////////////////////////////////////////////
  30. class deque_test : public container_test
  31. {
  32. private:
  33.     std::deque<int> my_deque;
  34. public:
  35.     explicit deque_test(int size)
  36.     {
  37.         container_size = size;
  38.         ops.push_back("Deque(" + std::to_string(size) + ")");
  39.     }
  40.     virtual void insert_beg() override;
  41.     void insert_mid();
  42.     virtual void run() override;
  43.     virtual void insert_end() override;
  44.     virtual void sequential_access() override;
  45.     virtual void random_access() override;
  46. };
  47. ////////////////////////////////////////////
  48. #pragma once
  49. #include "container_test.h"
  50. #include <set>
  51.  
  52.  
  53. class set_test : public container_test
  54. {
  55. private:
  56.     std::set<int> my_set;
  57. public:
  58.     explicit set_test(int size)
  59.     {
  60.         container_size = size;
  61.         ops.push_back("Set(" + std::to_string(size) + ")");
  62.     }
  63.     virtual void insert_beg() override;
  64.     virtual void insert_end() override;
  65.     virtual void sequential_access() override;
  66.     virtual void random_access() override;
  67. };
  68. /////////////////////////////////////////////////////////////
  69. #pragma once
  70. #include "container_test.h"
  71. #include <unordered_map>
  72.  
  73.  
  74. class unordered_map_test : public container_test
  75. {
  76. private:
  77.     std::unordered_map<int, int> my_unordered_map;
  78. public:
  79.     explicit unordered_map_test(int size)
  80.     {
  81.         container_size = size;
  82.         ops.push_back("Hashmap(" + std::to_string(size) + ")");
  83.     }
  84.     virtual void insert_beg() override;
  85.     virtual void insert_end() override;
  86.     virtual void sequential_access() override;
  87.     virtual void random_access() override;
  88. };
  89. ///////////////////////////////////////////////////////////
  90. #pragma once
  91. #include <vector>
  92. #include <string>
  93. #include <iostream>
  94.  
  95. class Statistics
  96. {
  97. private:
  98.     std::vector<std::string> results;
  99. public:
  100.     Statistics(){}
  101.  
  102.     void add_result(std::vector<std::string>& res)
  103.     {
  104.         for (auto str : res)
  105.             results.push_back(str + "\n");
  106.         results.push_back("\n");
  107.     }
  108.     void print_results()
  109.     {
  110.         for (auto str : results)
  111.             std::cout << str;
  112.     }
  113. };
  114. ////////////////////////////////////////////////////////////
  115. #include "deque_test.h"
  116. #include <chrono>
  117. #include <sstream>
  118. #include <random>
  119. #include <iostream>
  120.  
  121. void deque_test::insert_beg()
  122. {
  123.     std::chrono::time_point<std::chrono::system_clock> beg;
  124.     std::chrono::time_point<std::chrono::system_clock> end;
  125.     std::chrono::duration<double> dur;
  126.     std::chrono::nanoseconds dts;
  127.  
  128.     beg = std::chrono::system_clock::now();
  129.     for (int i = 0; i < container_size; i++)
  130.     {
  131.         my_deque.push_front(i);
  132.     }
  133.     end = std::chrono::system_clock::now();
  134.     dur = end - beg;
  135.     dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  136.     std::stringstream stream;
  137.     stream << "push front " << dts.count() / container_size << " ns";
  138.     ops.push_back(stream.str());
  139.     my_deque.clear();
  140. }
  141.  
  142. void deque_test::insert_mid()
  143. {
  144.     std::chrono::time_point<std::chrono::system_clock> beg;
  145.     std::chrono::time_point<std::chrono::system_clock> end;
  146.     std::chrono::duration<double> dur;
  147.     std::chrono::nanoseconds dts;
  148.  
  149.     for (int i = 0; i < container_size/2; i++)
  150.     {
  151.         my_deque.push_back(i);
  152.     }
  153.  
  154.     beg = std::chrono::system_clock::now();
  155.     for (int i = 0; i < container_size / 2; i++)
  156.     {
  157.         int mid = my_deque.size();
  158.         my_deque.insert(my_deque.begin() + mid, i);
  159.     }
  160.     end = std::chrono::system_clock::now();
  161.     dur = end - beg;
  162.     dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  163.     std::stringstream stream;
  164.     stream << "insert mid " << dts.count() / container_size / 2 << " ns";
  165.     ops.push_back(stream.str());
  166.     my_deque.clear();
  167. }
  168.  
  169. void deque_test::run()
  170. {
  171.     insert_beg();
  172.     insert_mid();
  173.     insert_end();
  174.     sequential_access();
  175.     random_access();
  176. }
  177.  
  178.  
  179. void deque_test::insert_end()
  180. {
  181.     std::chrono::time_point<std::chrono::system_clock> beg;
  182.     std::chrono::time_point<std::chrono::system_clock> end;
  183.     std::chrono::duration<double> dur;
  184.     std::chrono::nanoseconds dts;
  185.  
  186.     beg = std::chrono::system_clock::now();
  187.     for (int i = 0; i < container_size; i++)
  188.     {
  189.         my_deque.push_back(i);
  190.     }
  191.     end = std::chrono::system_clock::now();
  192.     dur = end - beg;
  193.     dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  194.     std::stringstream stream;
  195.     stream << "push back " << dts.count() / container_size << " ns";
  196.     ops.push_back(stream.str());
  197.     my_deque.clear();
  198.  
  199. }
  200.  
  201. void deque_test::sequential_access()
  202. {
  203.     std::chrono::time_point<std::chrono::high_resolution_clock> beg;
  204.     std::chrono::time_point<std::chrono::high_resolution_clock> end;
  205.     std::chrono::duration<double> dur;
  206.     std::chrono::nanoseconds dts;
  207.  
  208.     for (int i = 0; i < container_size; i++)
  209.     {
  210.         my_deque.push_front(i);
  211.     }
  212.  
  213.     beg = std::chrono::high_resolution_clock::now();
  214.     for (auto num : my_deque)
  215.         num++;
  216.     end = std::chrono::high_resolution_clock::now();
  217.     dur =std::chrono::duration_cast<std::chrono::duration<double>>(end - beg);
  218.     //dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  219.     std::stringstream stream;
  220.     stream << "seq access " << dur.count() / container_size << " sec";
  221.     ops.push_back(stream.str());
  222.     my_deque.clear();
  223.  
  224. }
  225.  
  226. void deque_test::random_access()
  227. {
  228.     std::chrono::time_point<std::chrono::system_clock> beg;
  229.     std::chrono::time_point<std::chrono::system_clock> end;
  230.     std::chrono::duration<double> dur;
  231.     std::chrono::nanoseconds dts;
  232.  
  233.     std::random_device rd;
  234.     std::mt19937 gen(rd());
  235.     std::uniform_int_distribution<> dis(0, container_size-1);
  236.  
  237.     for (int i = 0; i < container_size; i++)
  238.     {
  239.         my_deque.push_front(i);
  240.     }
  241.  
  242.     beg = std::chrono::system_clock::now();
  243.     for (int i = 0; i < container_size; i++)
  244.         my_deque[dis(gen)]++;
  245.     end = std::chrono::system_clock::now();
  246.     dur = end - beg;
  247.     dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  248.     std::stringstream stream;
  249.     stream << "random access " << dts.count() / container_size << " ns";
  250.     ops.push_back(stream.str());
  251.     my_deque.clear();
  252. }
  253. //////////////////////////////////////////
  254. #include "set_test.h"
  255. #include <chrono>
  256. #include <sstream>
  257.  
  258. void set_test::insert_beg()
  259. {
  260.     std::chrono::time_point<std::chrono::system_clock> beg;
  261.     std::chrono::time_point<std::chrono::system_clock> end;
  262.     std::chrono::duration<double> dur;
  263.     std::chrono::nanoseconds dts;
  264.  
  265.     beg = std::chrono::system_clock::now();
  266.     for (int i = 0; i < container_size; i++)
  267.         my_set.insert(i);
  268.     end = std::chrono::system_clock::now();
  269.     dur = end - beg;
  270.     dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  271.     std::stringstream stream;
  272.     stream << "insert " << dts.count() / container_size << " ns";
  273.     ops.push_back(stream.str());
  274.     my_set.clear();
  275. }
  276.  
  277.  
  278. void set_test::insert_end()
  279. {
  280.     std::chrono::time_point<std::chrono::system_clock> beg;
  281.     std::chrono::time_point<std::chrono::system_clock> end;
  282.     std::chrono::duration<double> dur;
  283.     std::chrono::nanoseconds dts;
  284.  
  285.     beg = std::chrono::system_clock::now();
  286.     for (int i = 0; i < container_size; i++)
  287.         my_set.emplace_hint(my_set.end(), i);
  288.     end = std::chrono::system_clock::now();
  289.     dur = end - beg;
  290.     dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  291.     std::stringstream stream;
  292.     stream << "insert end(hint) " << dts.count() / container_size << " ns";
  293.     ops.push_back(stream.str());
  294.     my_set.clear();
  295. }
  296.  
  297. void set_test::sequential_access()
  298. {
  299.     std::chrono::time_point<std::chrono::system_clock> beg;
  300.     std::chrono::time_point<std::chrono::system_clock> end;
  301.     std::chrono::duration<double> dur;
  302.     std::chrono::nanoseconds dts;
  303.  
  304.     for (int i = 0; i < container_size; i++)
  305.         my_set.insert(i);
  306.  
  307.     beg = std::chrono::system_clock::now();
  308.     for (auto num : my_set)
  309.         num++;
  310.     end = std::chrono::system_clock::now();
  311.     dur = end - beg;
  312.     dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  313.     std::stringstream stream;
  314.     stream << "seq access " << dts.count() / container_size << " ns";
  315.     ops.push_back(stream.str());
  316.     my_set.clear();
  317. }
  318.  
  319. void set_test::random_access()
  320. {
  321.     std::chrono::time_point<std::chrono::system_clock> beg;
  322.     std::chrono::time_point<std::chrono::system_clock> end;
  323.     std::chrono::duration<double> dur;
  324.     std::chrono::nanoseconds dts;
  325.  
  326.     for (int i = 0; i < container_size; i++)
  327.         my_set.insert(i);
  328.  
  329.     beg = std::chrono::system_clock::now();
  330.     for (int i = 0; i < container_size; i++)
  331.         my_set.find(i);
  332.     end = std::chrono::system_clock::now();
  333.     dur = end - beg;
  334.     dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  335.     std::stringstream stream;
  336.     stream << "random access " << dts.count() / container_size << " ns";
  337.     ops.push_back(stream.str());
  338.     my_set.clear();
  339. }
  340. ///////////////////////////////////////////////////////////////
  341. #include "unordered_map_test.h"
  342. #include <chrono>
  343. #include <sstream>
  344. #include <random>
  345.  
  346.  
  347. void unordered_map_test::insert_beg()
  348. {
  349.     std::chrono::time_point<std::chrono::system_clock> beg;
  350.     std::chrono::time_point<std::chrono::system_clock> end;
  351.     std::chrono::duration<double> dur;
  352.     std::chrono::nanoseconds dts;
  353.  
  354.     beg = std::chrono::system_clock::now();
  355.     for (int i = 0; i < container_size; i++)
  356.         my_unordered_map.insert({ i, i });
  357.     end = std::chrono::system_clock::now();
  358.     dur = end - beg;
  359.     dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  360.     std::stringstream stream;
  361.     stream << "insert " << dts.count() / container_size << " ns";
  362.     ops.push_back(stream.str());
  363.     my_unordered_map.clear();
  364. }
  365.  
  366. void unordered_map_test::insert_end()
  367. {
  368.     std::chrono::time_point<std::chrono::system_clock> beg;
  369.     std::chrono::time_point<std::chrono::system_clock> end;
  370.     std::chrono::duration<double> dur;
  371.     std::chrono::nanoseconds dts;
  372.  
  373.     beg = std::chrono::system_clock::now();
  374.     for (int i = 0; i < container_size; i++)
  375.         my_unordered_map.insert(my_unordered_map.end(), { i, i });
  376.     end = std::chrono::system_clock::now();
  377.     dur = end - beg;
  378.     dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  379.     std::stringstream stream;
  380.     stream << "insert end(hint) " << dts.count() / container_size << " ns";
  381.     ops.push_back(stream.str());
  382.     my_unordered_map.clear();
  383. }
  384.  
  385. void unordered_map_test::sequential_access()
  386. {
  387.     std::chrono::time_point<std::chrono::high_resolution_clock> beg;
  388.     std::chrono::time_point<std::chrono::high_resolution_clock> end;
  389.     std::chrono::duration<double> dur;
  390.     std::chrono::nanoseconds dts;
  391.  
  392.     for (int i = 0; i < container_size; i++)
  393.         my_unordered_map.insert({ i, i });
  394.  
  395.     beg = std::chrono::high_resolution_clock::now();
  396.     for (auto pair : my_unordered_map)
  397.         pair.second++;
  398.     end = std::chrono::high_resolution_clock::now();
  399.     dur = end - beg;
  400.     //dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  401.     std::stringstream stream;
  402.     stream << "seq access " << dur.count() / container_size << " sec";
  403.     ops.push_back(stream.str());
  404.     my_unordered_map.clear();
  405. }
  406.  
  407. void unordered_map_test::random_access()
  408. {
  409.     std::chrono::time_point<std::chrono::high_resolution_clock> beg;
  410.     std::chrono::time_point<std::chrono::high_resolution_clock> end;
  411.     std::chrono::duration<double> dur;
  412.     std::chrono::nanoseconds dts;
  413.  
  414.     std::random_device rd;
  415.     std::mt19937 gen(rd());
  416.     std::uniform_int_distribution<> dis(0, container_size - 1);
  417.  
  418.     for (int i = 0; i < container_size; i++)
  419.         my_unordered_map.insert({ i, i });
  420.  
  421.     beg = std::chrono::high_resolution_clock::now();
  422.     for (int i = 0; i < container_size; i++)
  423.         my_unordered_map.at(dis(gen));
  424.     end = std::chrono::high_resolution_clock::now();
  425.     dur = end - beg;
  426.     dts = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
  427.     std::stringstream stream;
  428.     stream << "random access " << dts.count() / container_size << " ns";
  429.     ops.push_back(stream.str());
  430.     my_unordered_map.clear();
  431.  
  432. }
  433. /////////////////////////
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement