#include <iostream>
#include <vector>
#include <string>
#include <chrono>
#include <execinfo.h>
using namespace std;
static size_t backtrace_size;
const size_t max_backtrace_size = 100;
void *backtrace_buf[max_backtrace_size];
static void track()
{
if(backtrace_size > 0)
::backtrace(backtrace_buf, backtrace_size);
}
static void op(size_t i)
{
if(i == 0)
{
track();
return;
}
op(i - 1);
}
int main(int argc, char *argv[])
{
const size_t stack_depth = stoll(string(argv[1]));
backtrace_size = stoll(string(argv[2]));
const size_t num_its = stoll(string(argv[3]));
const chrono::time_point<std::chrono::system_clock> start = chrono::system_clock::now();
for(size_t i = 0; i < num_its; ++i)
{
op(stack_depth);
}
const chrono::time_point<std::chrono::system_clock> end = chrono::system_clock::now();
cout << std::chrono::duration<double>(end - start).count() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y2hyb25vPgoKI2luY2x1ZGUgPGV4ZWNpbmZvLmg+CgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpzdGF0aWMgc2l6ZV90IGJhY2t0cmFjZV9zaXplOwoKCmNvbnN0IHNpemVfdCBtYXhfYmFja3RyYWNlX3NpemUgPSAxMDA7CnZvaWQgKmJhY2t0cmFjZV9idWZbbWF4X2JhY2t0cmFjZV9zaXplXTsgICAKc3RhdGljIHZvaWQgdHJhY2soKQp7CiAgICBpZihiYWNrdHJhY2Vfc2l6ZSA+IDApCiAgICAgICAgOjpiYWNrdHJhY2UoYmFja3RyYWNlX2J1ZiwgYmFja3RyYWNlX3NpemUpOwp9CgoKc3RhdGljIHZvaWQgb3Aoc2l6ZV90IGkpCnsKICAgIGlmKGkgPT0gMCkKICAgIHsKICAgICAgICB0cmFjaygpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIG9wKGkgLSAxKTsKfQoKCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIGNvbnN0IHNpemVfdCBzdGFja19kZXB0aCA9IHN0b2xsKHN0cmluZyhhcmd2WzFdKSk7CiAgICBiYWNrdHJhY2Vfc2l6ZSA9IHN0b2xsKHN0cmluZyhhcmd2WzJdKSk7CiAgICBjb25zdCBzaXplX3QgbnVtX2l0cyA9IHN0b2xsKHN0cmluZyhhcmd2WzNdKSk7CgogICAgY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IHN0YXJ0ID0gY2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG51bV9pdHM7ICsraSkKICAgIHsKICAgICAgICBvcChzdGFja19kZXB0aCk7CiAgICB9CiAgICBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jaz4gZW5kID0gY2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICAgY291dCA8PCBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPihlbmQgLSBzdGFydCkuY291bnQoKSA8PCBlbmRsOwoKICAgIHJldHVybiAwOyAKfQ==