#include <iostream>
#include <chrono>
#include <vector>
using namespace std;
class B2{
public: int randomNumber=((double) rand() / (RAND_MAX))*10;
virtual ~B2() = default;
virtual int f(int n){return -n+randomNumber;}
int g(int n){return -n+randomNumber;}
};
class C : public B2{
public: int f(int n) override {return n-randomNumber;}
};
int main() {
std::vector<B2*> bs;
const int numTest=1000000;
for(int n=0;n<numTest;n++){
if(((double) rand() / (RAND_MAX))>0.5){
bs.push_back(new B2());
}else{
bs.push_back(new C());
}
};
auto t1 = std::chrono::system_clock::now();
int s=0;
for(int n=0;n<numTest;n++){
s+=bs[n]->f(n);
};
auto t2= std::chrono::system_clock::now();
for(int n=0;n<numTest;n++){
s+=bs[n]->g(n);
};
auto t3= std::chrono::system_clock::now();
auto t21=t2-t1;
auto t32=t3-t2;
std::cout<<t21.count()<<" "<<t32.count()<<" ratio="<< (((float)t21.count())/t32.count()) << std::endl;
std::cout<<s<<std::endl;
for(int n=0;n<numTest;n++){
delete bs[n];
};
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjbGFzcyBCMnsKCQlwdWJsaWM6IGludCByYW5kb21OdW1iZXI9KChkb3VibGUpIHJhbmQoKSAvIChSQU5EX01BWCkpKjEwOwoJCXZpcnR1YWwgfkIyKCkgPSBkZWZhdWx0OwoJCXZpcnR1YWwgaW50IGYoaW50IG4pe3JldHVybiAtbityYW5kb21OdW1iZXI7fQoJCWludCBnKGludCBuKXtyZXR1cm4gLW4rcmFuZG9tTnVtYmVyO30KfTsKY2xhc3MgQyA6IHB1YmxpYyBCMnsKCXB1YmxpYzogaW50IGYoaW50IG4pIG92ZXJyaWRlIHtyZXR1cm4gbi1yYW5kb21OdW1iZXI7fQp9OwppbnQgbWFpbigpIHsKCXN0ZDo6dmVjdG9yPEIyKj4gYnM7Cgljb25zdCBpbnQgbnVtVGVzdD0xMDAwMDAwOwoJZm9yKGludCBuPTA7bjxudW1UZXN0O24rKyl7CgkJaWYoKChkb3VibGUpIHJhbmQoKSAvIChSQU5EX01BWCkpPjAuNSl7CgkJCWJzLnB1c2hfYmFjayhuZXcgQjIoKSk7CgkJfWVsc2V7CgkJCWJzLnB1c2hfYmFjayhuZXcgQygpKTsKCQl9Cgl9OwoJYXV0byB0MSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwoJaW50IHM9MDsKCWZvcihpbnQgbj0wO248bnVtVGVzdDtuKyspeyAKCQlzKz1ic1tuXS0+ZihuKTsKCX07CglhdXRvIHQyPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKCWZvcihpbnQgbj0wO248bnVtVGVzdDtuKyspewoJCXMrPWJzW25dLT5nKG4pOwoJfTsKCWF1dG8gdDM9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwoJYXV0byB0MjE9dDItdDE7CglhdXRvIHQzMj10My10MjsKCXN0ZDo6Y291dDw8dDIxLmNvdW50KCk8PCIgIjw8dDMyLmNvdW50KCk8PCIgcmF0aW89Ijw8ICgoKGZsb2F0KXQyMS5jb3VudCgpKS90MzIuY291bnQoKSkgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0PDxzPDxzdGQ6OmVuZGw7Cglmb3IoaW50IG49MDtuPG51bVRlc3Q7bisrKXsKCQlkZWxldGUgYnNbbl07Cgl9Owp9