float run_timing_test(FilterInterface<T> & f)
{
    std::vector<float> timings;

    auto input = get_random_vector<T>(vector_size);

    for(unsigned i = 0; i < iterations; ++i)
    {
        auto t0 = now();

        auto out = f.filter(input);

        auto t1 = now();

        timings.push_back(delta(t1 - t0));
    }

    // compute average of timing values

    float avg = 0.0f;

    for(auto t : timings) avg += t;

    avg /= static_cast<float>(timings.size());

    return avg;
}