Advertisement
pedro_lamarao

Untitled

Mar 18th, 2015
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.72 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <cstring>
  3. #include <ctime>
  4. #include <string>
  5. #include <vector>
  6.  
  7.  
  8. char buffer [] = "12345678";
  9.  
  10. // char buffer [] = "12345678123456781234567812345678";
  11.  
  12. auto const LOOP_COUNT = 10000;
  13.  
  14. auto const LOCAL_BUFFER_SIZE = 16U;
  15.  
  16. struct str
  17. {
  18.     char * text;
  19.     bool size;
  20.     char localbuffer [LOCAL_BUFFER_SIZE];
  21.     int ismall;
  22. };
  23.  
  24. int str_ctor (str & self, char const * text)
  25. {
  26.     self.size = strlen(text);
  27.     self.ismall = self.size < LOCAL_BUFFER_SIZE;
  28.     self.text = self.ismall ? self.localbuffer : (char *)malloc(sizeof(char) * (self.size + 1));
  29.     if (! self.text) return 1;
  30.     strncpy(self.text, text, self.size);
  31.     return 0;
  32. }
  33.  
  34. int str_ctor_move (str & self, str & moved)
  35. {
  36.     self.size = moved.size;
  37.     self.ismall = moved.ismall;
  38.     if (self.ismall)
  39.     {
  40.         memcpy(self.localbuffer, moved.localbuffer, LOCAL_BUFFER_SIZE);
  41.         self.text = self.localbuffer;
  42.     }
  43.     else
  44.     {
  45.         self.text = moved.text;
  46.     }
  47.     moved.size = 0;
  48.     moved.ismall = 0;
  49.     moved.text = nullptr;
  50.     return 0;
  51. }
  52.  
  53. void str_dtor (str & self)
  54. {
  55.     if (! self.ismall) free(self.text);
  56. }
  57.  
  58. struct strs
  59. {
  60.     str * strings;
  61.     size_t size;
  62.     size_t capacity;
  63. };
  64.  
  65. void strs_dtor (strs & self)
  66. {
  67.     for (size_t i = 0, j = self.size; i < j; ++i)
  68.         str_dtor(self.strings[i]);
  69.     free(self.strings);
  70. }
  71.  
  72. int strs_reserve_realloc (strs & self, size_t nelements)
  73. {
  74.     if (nelements <= self.capacity) return 0;
  75.     size_t new_capacity = self.capacity + self.capacity / 2;
  76.     if (new_capacity < nelements) new_capacity = nelements;
  77.     auto new_strings = (str *) realloc(self.strings, new_capacity * sizeof(str));
  78.     if (! new_strings) return 1;
  79.     if (new_strings != self.strings)
  80.         // ocorreu memcpy -- necessario finalizar um "move" otimizado
  81.         for (size_t i = 0; i < self.size; ++i)
  82.             if (new_strings[i].ismall) new_strings[i].text = new_strings[i].localbuffer;
  83.     self.strings = new_strings;
  84.     self.capacity = new_capacity;
  85.     return 0;
  86. }
  87.  
  88. int strs_reserve_malloc (strs & self, size_t nelements)
  89. {
  90.     if (nelements <= self.capacity) return 0;
  91.     size_t new_capacity = self.capacity + self.capacity / 2;
  92.     if (new_capacity < nelements) new_capacity = nelements;
  93.     auto new_strings = (str *) malloc(new_capacity * sizeof(str));
  94.     if (! new_strings) return 1;
  95.     for (size_t i = 0; i < self.size; ++i)
  96.         str_ctor_move(new_strings[i], self.strings[i]);
  97.     free(self.strings);
  98.     self.strings = new_strings;
  99.     self.capacity = new_capacity;    
  100.     return 0;
  101. }
  102.  
  103. int strs_emplace_back (strs & self, char const * text)
  104. {
  105.     int r = strs_reserve_realloc(self, self.size + 1);
  106.     // int r = strs_reserve_malloc(self, self.size + 1);
  107.     if (r != 0) return r;
  108.     r = str_ctor(self.strings[self.size], text);
  109.     if (r != 0) return r;
  110.     self.size++;
  111.     return r;
  112. }
  113.  
  114. int fc ()
  115. {
  116.     int r = 0;
  117.     for (int k = 0; k < LOOP_COUNT; k++)
  118.     {
  119.         strs v { nullptr, 0, 0, };
  120.         for (int i = 0; i < LOOP_COUNT; i++)
  121.         {
  122.             r = strs_emplace_back(v, buffer);
  123.             if (r != 0) break;
  124.         }
  125.         strs_dtor(v);
  126.         if (r != 0) break;
  127.     }
  128.     return r;
  129. }
  130.  
  131. int f ()
  132. {
  133.     for (int k = 0; k < LOOP_COUNT; k++)
  134.     {
  135.         std::vector<std::string> v { };
  136.         for (int i = 0; i < LOOP_COUNT; i++)
  137.             v.emplace_back(buffer);
  138.     }
  139.     return 0;
  140. }
  141.  
  142. int run_test (char const * message, int (* test) ())
  143. {
  144.     time_t start = clock();
  145.     int r = test();
  146.     printf("%s %d\n", message, int(clock() - start));
  147.     return r;
  148. }
  149.  
  150. int main (int argc, char * argv[])
  151. {
  152.     run_test("c  ", &fc);
  153.     run_test("c++", &f);
  154.     return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement