fork download
  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4. #include <chrono>
  5.  
  6. template<typename TimeT = std::chrono::milliseconds>
  7. struct measure {
  8. template<typename F, typename ...Args>
  9. static typename TimeT::rep execution(F&& func, Args&&... args) {
  10. auto start = std::chrono::system_clock::now();
  11. std::forward<decltype(func)>(func)(std::forward<Args>(args)...);
  12. auto duration = std::chrono::duration_cast< TimeT>
  13. (std::chrono::system_clock::now() - start);
  14. return duration.count();
  15. }
  16. };
  17.  
  18. std::string strAppend(const std::string &s, int cnt) {
  19. std::string str;
  20. for (int i = 0; i < cnt; ++i)
  21. str.append(s);
  22. return str;
  23. }
  24.  
  25. std::string strOp(const std::string &s, int cnt) {
  26. std::string str;
  27. for (int i = 0; i < cnt; ++i)
  28. str += s;
  29. return str;
  30. }
  31.  
  32. std::string strStream(const std::string &s, int cnt) {
  33. std::ostringstream oss;
  34. for (int i = 0; i < cnt; ++i)
  35. oss << s;
  36. return oss.str();
  37. }
  38.  
  39. std::string strReserveAndOp(const std::string &s, int cnt) {
  40. std::string str;
  41. str.reserve(s.size() * cnt);
  42. for (int i = 0; i < cnt; ++i)
  43. str += s;
  44. return str;
  45. }
  46.  
  47. std::string strReserveAndAppend(const std::string &s, int cnt) {
  48. std::string str;
  49. str.reserve(s.size() * cnt);
  50. for (int i = 0; i < cnt; ++i)
  51. str.append(s);
  52. return str;
  53. }
  54.  
  55. int main()
  56. {
  57. const std::string s("Hello world!");
  58. const int cnt = 1000000 * 5;
  59. std::cout << "ostringstream: " << measure<>::execution(strStream, s, cnt) << "ms" << std::endl;
  60. std::cout << "+= operator: " << measure<>::execution(strOp, s, cnt) << "ms" << std::endl;
  61. std::cout << "s.Append(): " << measure<>::execution(strAppend, s, cnt) << "ms" << std::endl;
  62. std::cout << "s.Reserve() & +=: " << measure<>::execution(strReserveAndOp, s, cnt) << "ms" << std::endl;
  63. std::cout << "s.Reserve() & s.Append(): " << measure<>::execution(strReserveAndAppend, s, cnt) << "ms" << std::endl;
  64. }
Success #stdin #stdout 1.66s 3416KB
stdin
Standard input is empty
stdout
ostringstream: 570ms
+= operator: 322ms
s.Append(): 323ms
s.Reserve() & +=: 231ms
s.Reserve() & s.Append(): 220ms