Some time ago, I started practising Codility tests.
While I believe they cannot be the only way to evaluate a good developer, Codility tests propose fairly interesting programming tasks to keep your mind fit.
Since usually, the task asks you to implement a function that solves the problem in a certain level of complexity indicated with the big-O notation, you will need to find a way to measure the performance of your code.
I created a Visual Studio C++ solution including all the Codility problems and their solutions.
For each class that implements a particular problem, the main function calls the method solution() and measures it.
To avoid repeating the code for measuring the execution time, I thought to use a generic approach.
The idea was to pass a functor to another function that executes the functor and evaluates the total elapsed time. In C++, this can be done by writing a template function.
This is the code of the function:
template<typename Function>
inline static float timeFunction(Function f)
{
clock_t t = clock();
f();
t = clock() - t;
return ((float)t) / CLOCKS_PER_SEC;
};
Where Function is the generic type of the argument.
I can, therefore, pass a lambda expression to timeFunction:
float elapsed = timeFunction([](){ function_to_be_timed(); });
Here is another version that makes use the Windows high-resolution timer:
template<typename Function>
inline static double timeFunctionMicroSec(Function f)
{
LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
LARGE_INTEGER Frequency;
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&StartingTime);
f();
QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
ElapsedMicroseconds.QuadPart *= 1000000;
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;
return double(ElapsedMicroseconds.QuadPart);
};
I hope this will be useful to you.