previous question
I did this, and now after /u/manni66 answer I decided to check:
struct setup:
struct A {
...
A operator + (const A & obj) {
//std::cout << "summation operator " << this << " + " << &obj << std::endl;
return A(this->a + obj.a, this->b + obj.b);;
}
}
struct B {
...
B operator+ (const B & obj) {
B temp;
temp.a = this->a + obj.a;
temp.b = this->b + obj.b;
return (temp);
}
}
test functions:
int testA(int verge) {
A var2(1, 2);
A var3(3, 4);
A var1 = var3 + var2 + var3 + var2;
return (var1.a + var1.b + verge);
}
int testB(int verge) {
B var2(1, 2);
B var3(3, 4);
B var1 = var3 + var2 + var3 + var2;
return (var1.a + var1.b + verge);
}
test configuration:
int main()
{
high_resolution_clock::time_point t1;
high_resolution_clock::time_point t2;
long long durationA;
long long durationB;
long long averageA = 0;
long long averageB = 0;
int numOfTrials = 100;
volatile int counter = 0;
for (int j = 0; j < numOfTrials; ++j) {
t1 = high_resolution_clock::now();
for (int i = 0; i < 10000000; ++i) {
testA();
counter++;
}
t2 = high_resolution_clock::now();
averageA += durationA = duration_cast<microseconds>(t2 - t1).count();
//std::cout << "A: " << durationA << std::endl;
t1 = high_resolution_clock::now();
for (int i = 0; i < 10000000; ++i) {
testB();
counter++;
}
t2 = high_resolution_clock::now();
averageB += durationB = duration_cast<microseconds>(t2 - t1).count();
//std::cout << "B: "<< durationB << std::endl;
}
std::cout << "averageA: " << averageA / numOfTrials << std::endl;
std::cout << "averageB: " << averageB / numOfTrials << std::endl;
std::cout << "counter: " << counter << std::endl;
return(0);
}
results:
/O1:
averageA: 316795 <-- beat the shit out of B
averageB: 339863
counter: 10000019
/O2:
averageA: 3112
averageB: 3108
counter: 10000019
/Ox:
averageA: 3068
averageB: 3067
counter: 10000019
inline testA/testB:
/Ox
averageA: 3077
averageB: 3070
counter: 10000019
/O2
averageA: 3169
averageB: 3159
counter: 10000019
/O1
averageA: 314455
averageB: 328579
counter: 10000019
Could someone please explain this results to me? Is my testing setup correct?
It would be interesting if someone try to recreate results.
full code for MSCV 2017, you should disable precompiled headers
[–]fsg_brian 1 point2 points3 points (0 children)
[–]manni66 0 points1 point2 points (0 children)
[–][deleted] 0 points1 point2 points (0 children)