#include <iostream>
#include <chrono>
#include <cstdlib>
#include <ctime>

class Duration {
  std::chrono::high_resolution_clock::time_point beg, duration;
public:
  Duration() {
    beg = std::chrono::high_resolution_clock::now();
  }
  ~Duration() {
    duration = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(duration - beg).count() << "ms" << std::endl;
  }
};

const int N = 10000000;

int rnd[N];

void func1()
{
  return;
}

void func2()
{
  return;
}

void func3()
{
  return;
}

void func4()
{
  return;
}

int main()
{
  void (*func[])() = { func1, func2, func3, func4 }; // Avoid std::function costs

  {
    std::cout << "The same function call" << std::endl;
    Duration d;

    for (int i = 0; i < N; i++)
      func[0]();
  }

  {
    std::srand(std::time(0));
    for (int i = 0; i < N; i++)
      rnd[i] = std::rand() % 4; // Avoid std::rand() costs
    std::cout << "Random function call" << std::endl;
    Duration d;

    for (int i = 0; i < N; i++)
      func[rnd[i]]();
  }
}
