#include <iostream>
#include <string>
#include <memory>
#include <chrono>
#include <vector>
using namespace std;
#define ITER 100000
class Print{
public:
virtual void print(int p1, float p2, float p3, float p4){/*print */}
};
class PrintWrapper
{
public:
PrintWrapper(shared_ptr<Print> print, int p1, float p2, float p3, float p4) :
m_print(print), _p1(p1),_p2(p2),_p3(p3),_p4(p4){}
~PrintWrapper(){}
void execute()
{
m_print->print(_p1,_p2,_p3,_p4);
}
private:
shared_ptr<Print> m_print;
int _p1;
float _p2,_p3,_p4;
};
void test()
{
shared_ptr<Print> p(new Print());
shared_ptr<PrintWrapper> pw(new PrintWrapper(p, 1, 2.f,3.0f,4.0f));
//-------------test 1-------------------------
auto time1 = std::chrono::system_clock::now();
for (auto var = 0; var < ITER; ++var)
{
p->print(1, 2.f,3.0f,4.0f);
}
auto time2 = std::chrono::system_clock::now();
cout <<"test 1 : "<< (time2 - time1).count() << " microseconds." << endl;
//-------------test 2-------------------------
auto time3 = std::chrono::system_clock::now();
for (auto var = 0; var < ITER; ++var)
{
pw->execute();
}
auto time4 = std::chrono::system_clock::now();
cout <<"test 2 : "<< (time4 - time3).count() << " microseconds." << endl;
}
int main() { test(); }
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBJVEVSIDEwMDAwMAoKY2xhc3MgUHJpbnR7CgpwdWJsaWM6Cgp2aXJ0dWFsIHZvaWQgcHJpbnQoaW50IHAxLCBmbG9hdCBwMiwgZmxvYXQgcDMsIGZsb2F0IHA0KXsvKnByaW50ICovfQoKfTsKCmNsYXNzIFByaW50V3JhcHBlcgp7CgogICAgcHVibGljOgoKICAgICAgUHJpbnRXcmFwcGVyKHNoYXJlZF9wdHI8UHJpbnQ+IHByaW50LCBpbnQgcDEsIGZsb2F0IHAyLCBmbG9hdCBwMywgZmxvYXQgcDQpIDoKICAgICAgbV9wcmludChwcmludCksIF9wMShwMSksX3AyKHAyKSxfcDMocDMpLF9wNChwNCl7fQoKICAgICAgflByaW50V3JhcHBlcigpe30KCiAgICAgIHZvaWQgZXhlY3V0ZSgpCiAgICAgIHsgCiAgICAgICAgbV9wcmludC0+cHJpbnQoX3AxLF9wMixfcDMsX3A0KTsgCiAgICAgIH0KCiAgICBwcml2YXRlOgoKICAgICAgc2hhcmVkX3B0cjxQcmludD4gbV9wcmludDsKICAgICAgaW50IF9wMTsKICAgICAgZmxvYXQgX3AyLF9wMyxfcDQ7Cgp9OwoKdm9pZCB0ZXN0KCkKewogc2hhcmVkX3B0cjxQcmludD4gcChuZXcgUHJpbnQoKSk7CiBzaGFyZWRfcHRyPFByaW50V3JhcHBlcj4gcHcobmV3IFByaW50V3JhcHBlcihwLCAxLCAyLmYsMy4wZiw0LjBmKSk7CgogLy8tLS0tLS0tLS0tLS0tdGVzdCAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogYXV0byB0aW1lMSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwoKIGZvciAoYXV0byB2YXIgPSAwOyB2YXIgPCBJVEVSOyArK3ZhcikgCiB7CiAgIHAtPnByaW50KDEsIDIuZiwzLjBmLDQuMGYpOwogfQoKIGF1dG8gdGltZTIgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKCiBjb3V0IDw8InRlc3QgMSA6ICI8PCAodGltZTIgLSB0aW1lMSkuY291bnQoKSA8PCAiIG1pY3Jvc2Vjb25kcy4iIDw8IGVuZGw7CiAKICAvLy0tLS0tLS0tLS0tLS10ZXN0IDItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBhdXRvIHRpbWUzID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CgogZm9yIChhdXRvIHZhciA9IDA7IHZhciA8IElURVI7ICsrdmFyKSAKIHsKICAgcHctPmV4ZWN1dGUoKTsKIH0KCiBhdXRvIHRpbWU0ID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CgogY291dCA8PCJ0ZXN0IDIgOiAiPDwgKHRpbWU0IC0gdGltZTMpLmNvdW50KCkgPDwgIiBtaWNyb3NlY29uZHMuIiA8PCBlbmRsOwoKfQppbnQgbWFpbigpIHsgdGVzdCgpOyB9