fork(3) download
  1. #include <iostream>
  2. #include <chrono>
  3. #include <vector>
  4. #include <numeric>
  5.  
  6. using namespace std;
  7. using namespace std::chrono;
  8.  
  9.  
  10. #define N 10000000
  11. int main()
  12. {
  13. //constexpr int N = 10000000;
  14. vector<int> v(N);
  15. for (int i = 0; i<N; ++i)
  16. v[i] = i;
  17.  
  18.  
  19.  
  20. //looping with iterators
  21. {
  22. high_resolution_clock::time_point t1 = high_resolution_clock::now();
  23.  
  24. long long int sum = 0;
  25. for (auto it = v.begin(); it != v.end(); ++it)
  26. sum+=*it;
  27.  
  28. high_resolution_clock::time_point t2 = high_resolution_clock::now();
  29.  
  30. auto duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
  31.  
  32. cout << duration << "microseconds output = " << sum << " (Iterators)\n";
  33. }
  34.  
  35. //using std::accumulate
  36. {
  37. high_resolution_clock::time_point t1 = high_resolution_clock::now();
  38. long long int start = 0;
  39. long long int sum = accumulate(v.begin(), v.end(), start);
  40.  
  41. high_resolution_clock::time_point t2 = high_resolution_clock::now();
  42.  
  43. auto duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
  44.  
  45. cout << duration << "microseconds output = " << sum << " (std::accumulate)\n";
  46. }
  47.  
  48. //looping with integers
  49. {
  50. high_resolution_clock::time_point t1 = high_resolution_clock::now();
  51.  
  52. long long int sum = 0;
  53. for (int i = 0; i<N; ++i)
  54. sum+=v[i];
  55.  
  56. high_resolution_clock::time_point t2 = high_resolution_clock::now();
  57.  
  58. auto duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
  59.  
  60. cout << duration << "microseconds output = " << sum << " (integer index)\n";
  61. }
  62.  
  63. //looping with integers (UNROLL 2)
  64. {
  65. high_resolution_clock::time_point t1 = high_resolution_clock::now();
  66.  
  67. long long int sum = 0;
  68. for (int i = 0; i<N; i+=2)
  69. sum+=v[i]+v[i+1];
  70.  
  71. high_resolution_clock::time_point t2 = high_resolution_clock::now();
  72.  
  73. auto duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
  74.  
  75. cout << duration << "microseconds output = " << sum << " (integer index, UNROLL 2)\n";
  76. }
  77.  
  78. //looping with integers (UNROLL 4)
  79. {
  80. high_resolution_clock::time_point t1 = high_resolution_clock::now();
  81.  
  82. long long int sum = 0;
  83. for (int i = 0; i<N; i+=4)
  84. sum+=v[i]+v[i+1]+v[i+2]+v[i+3];
  85.  
  86. high_resolution_clock::time_point t2 = high_resolution_clock::now();
  87.  
  88. auto duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
  89.  
  90. cout << duration << "microseconds output = " << sum << " (integer index, UNROLL 4)\n";
  91. }
  92.  
  93.  
  94. return 0;
  95. }
Success #stdin #stdout 0.13s 3140KB
stdin
Standard input is empty
stdout
16532microseconds  output = 49999995000000 (Iterators)
16305microseconds  output = 49999995000000 (std::accumulate)
17227microseconds  output = 49999995000000 (integer index)
15919microseconds  output = 49999995000000 (integer index, UNROLL 2)
12807microseconds  output = 49999995000000 (integer index, UNROLL 4)