#include <iostream>
#include <vector>
#include <cstdlib>
#include <chrono>
using namespace std;
struct base
{
int type;
virtual ~base() {}
};
struct class1 : base
{
class1() { type = 1; }
int get() { return 11; }
};
struct class2 : public base
{
class2() { type = 2; }
int get() { return 27; }
};
class timer
{
using T = std::chrono::time_point<std::chrono::steady_clock>;
T t1, t2;
public:
void start() { t1 = std::chrono::steady_clock::now(); }
void stop() { t2 = std::chrono::steady_clock::now(); }
void print() const { std::cout << "Time: " << (t2 - t1).count() << endl; }
};
int main()
{
vector <base *> v;
int s = 0;
timer t;
srand(time(0));
for (unsigned q=0; q<50000000; ++q) v.push_back(rand()&1 ? (base*)new class1() : (base*)new class2());
t.start();
for (auto x : v)
switch (x->type)
{
case 1: s += ((class1*)x)->get(); break;
case 2: s += ((class2*)x)->get(); break;
}
t.stop();
cout << s << endl;
t.print();
for (auto x : v) delete x;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGNocm9ubz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgYmFzZQp7CiAgaW50IHR5cGU7CiAgdmlydHVhbCB+YmFzZSgpIHt9Cn07CgpzdHJ1Y3QgY2xhc3MxIDogYmFzZQp7CiAgY2xhc3MxKCkgeyB0eXBlID0gMTsgfQogIGludCBnZXQoKSB7IHJldHVybiAxMTsgfQp9OwoKc3RydWN0IGNsYXNzMiA6IHB1YmxpYyBiYXNlCnsKICBjbGFzczIoKSB7IHR5cGUgPSAyOyB9CiAgaW50IGdldCgpIHsgcmV0dXJuIDI3OyB9Cn07CgpjbGFzcyB0aW1lcgp7CiAgdXNpbmcgVCA9IHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s+OwogIFQgdDEsIHQyOwpwdWJsaWM6CiAgdm9pZCBzdGFydCgpIHsgdDEgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsgfQogIHZvaWQgc3RvcCgpIHsgdDIgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsgfQogIHZvaWQgcHJpbnQoKSBjb25zdCB7IHN0ZDo6Y291dCA8PCAiVGltZTogIiA8PCAodDIgLSB0MSkuY291bnQoKSA8PCBlbmRsOyB9Cn07CgppbnQgbWFpbigpCnsKICB2ZWN0b3IgPGJhc2UgKj4gdjsKICBpbnQgcyA9IDA7CiAgdGltZXIgdDsKCiAgc3JhbmQodGltZSgwKSk7CiAgZm9yICh1bnNpZ25lZCBxPTA7IHE8NTAwMDAwMDA7ICsrcSkgdi5wdXNoX2JhY2socmFuZCgpJjEgPyAoYmFzZSopbmV3IGNsYXNzMSgpIDogKGJhc2UqKW5ldyBjbGFzczIoKSk7CgogIHQuc3RhcnQoKTsKICBmb3IgKGF1dG8geCA6IHYpCiAgICBzd2l0Y2ggKHgtPnR5cGUpCiAgICB7CgkgIGNhc2UgMTogICBzICs9ICgoY2xhc3MxKil4KS0+Z2V0KCk7ICAgYnJlYWs7CgkgIGNhc2UgMjogICBzICs9ICgoY2xhc3MyKil4KS0+Z2V0KCk7ICAgYnJlYWs7CiAgICB9CiAgdC5zdG9wKCk7CiAgCiAgY291dCA8PCBzIDw8IGVuZGw7CiAgdC5wcmludCgpOwoKICBmb3IgKGF1dG8geCA6IHYpIGRlbGV0ZSB4OwoKICByZXR1cm4gMDsKfQ==