fork(5) download
  1. #include <iostream>
  2. #include <string>
  3. #include <utility>
  4. #include <time.h>
  5.  
  6. std::string func1(const std::string& arg) {
  7. std::string test(arg);
  8. return test;
  9. }
  10.  
  11. template <typename T>
  12. std::string func2(T&& arg) {
  13. std::string test(std::forward<T&>(arg));
  14. return test;
  15. }
  16.  
  17. void wrap1(const std::string& arg) {
  18. func1(arg);
  19. }
  20.  
  21. template <typename T>
  22. void wrap2(T&& arg) {
  23. func2(std::forward<T&>(arg));
  24. }
  25.  
  26. int main()
  27. {
  28. auto n = 100000000;
  29.  
  30. /// Passing rvalue
  31. std::cout << "Passing rvalue!" << std::endl;
  32.  
  33. // Test const l value
  34. auto t = clock();
  35. for (int i = 0; i < n; ++i)
  36. wrap1("test");
  37. std::cout << "const l value: " << clock() - t << std::endl;
  38.  
  39. // Test rvalue forwarding
  40. t = clock();
  41. for (int i = 0; i < n; ++i)
  42. wrap2("test");
  43. std::cout << "rvalue forwarding: " << clock() - t << std::endl;
  44.  
  45. std::cout << "Passing lvalue!" << std::endl;
  46.  
  47. /// Passing lvalue
  48. std::string arg = "test";
  49.  
  50. // Test const l value
  51. t = clock();
  52. for (int i = 0; i < n; ++i)
  53. wrap1(arg);
  54. std::cout << "const l value: " << clock() - t << std::endl;
  55.  
  56. // Test rvalue forwarding
  57. t = clock();
  58. for (int i = 0; i < n; ++i)
  59. wrap2(arg);
  60. std::cout << "rvalue forwarding: " << clock() - t << std::endl;
  61.  
  62. }
Success #stdin #stdout 3.48s 15240KB
stdin
Standard input is empty
stdout
Passing rvalue!
const l value: 1357465
rvalue forwarding: 669589
Passing lvalue!
const l value: 744105
rvalue forwarding: 713189