#include <iostream>
#include <vector>
#include <chrono>
using namespace std;
size_t creation1_ns = 0;
size_t creation2_ns = 0;
size_t iteration1_ns = 0;
size_t iteration2_ns = 0;
double test1(size_t w, size_t h){
auto start = chrono::steady_clock::now();
vector<vector<double>> data;
data.reserve(h);
for(size_t row = 0; row < h; ++row){
data.emplace_back(vector<double>(w));
}
creation1_ns += chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now() - start).count();
start = chrono::steady_clock::now();
for(size_t row = 0; row < h; ++row){
for(size_t col = 0; col < w; ++col){
data[row][col] += rand(); // Write something
}
}
double sum = 0.0;
for(size_t row = 0; row < h; ++row){
for(size_t col = 0; col < w; ++col){
sum += data[row][col]; // Read something
}
}
iteration1_ns += chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now() - start).count();
return sum;
}
double test2(size_t w, size_t h){
auto start = chrono::steady_clock::now();
vector<double> data(w*h);
creation2_ns += chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now() - start).count();
start = chrono::steady_clock::now();
for(size_t row = 0; row < h; ++row){
size_t offs = row*w;
for(size_t col = 0; col < w; ++col){
data[offs + col] += rand(); // Write something
}
}
double sum = 0.0;
for(size_t row = 0; row < h; ++row){
size_t offs = row*w;
for(size_t col = 0; col < w; ++col){
sum += data[offs + col]; // Read something
}
}
iteration2_ns += chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now() - start).count();
return sum;
}
int main() {
srand(2);
const auto thoroughness = 50000.0;
auto s = 0;
for(int h = 16; h < 10000; h *= 8){
for(int w = 16; w < 10000; w *= 8){
creation1_ns = 0;
creation2_ns = 0;
iteration1_ns = 0;
iteration2_ns = 0;
auto trials = thoroughness/(w*h);
for(int r = 0; r < trials; ++r){
s+= test1(w, h);
s+= test2(w, h);
}
cout<<w<<"x"<<h
<<" alloc speed up: "<< (double(creation1_ns) / creation2_ns)<<"x"
<<" iter speed up: "<< (double(iteration1_ns) / iteration2_ns)<<"x" <<endl;
}
}
cout<<"print sum to avoid the code from being removed: "<<s<<endl;
return 0;
}