Skip to content

Instantly share code, notes, and snippets.

@kayru
Created April 16, 2018 12:51
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kayru/60a9c1e1e38c049d09d5e7c81b2c3a1c to your computer and use it in GitHub Desktop.
Save kayru/60a9c1e1e38c049d09d5e7c81b2c3a1c to your computer and use it in GitHub Desktop.
#define NOMINMAX
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <stdint.h>
#include <math.h>
#include <float.h>
#include <algorithm>
#include <vector>
using u32 = uint32_t;
using u64 = uint64_t;
LARGE_INTEGER GFrequency;
inline u64 GetTimestamp()
{
LARGE_INTEGER T;
QueryPerformanceCounter(&T);
return T.QuadPart;
}
inline double TicksToMS(double Ticks)
{
return (Ticks*1000.0) / double(GFrequency.QuadPart);
}
inline double clamp(double x, double lower, double upper)
{
return std::min(std::max(x, lower), upper);
}
template <typename T>
struct OnlineVariance
{
int n = 0;
T mean = T(0);
T M2 = T(0);
void addSample(T x)
{
n++;
T delta = x - mean;
mean = mean + delta / (float)n;
M2 = M2 + delta * (x - mean);
}
T getVariance()
{
if (n < 2)
{
return T(0);
}
T variance = M2 / (float)(n - 1);
return variance;
}
};
int main()
{
QueryPerformanceFrequency(&GFrequency);
static constexpr u32 SampleCount = 10000;
std::vector<double> Samples;
Samples.reserve(SampleCount);
double TMin = DBL_MAX;
double TMax = 0;
OnlineVariance<double> VarianceCalc;
for (u32 i = 0; i < SampleCount; ++i)
{
u64 t0 = GetTimestamp();
Sleep(4);
u64 t1 = GetTimestamp();
double dt = double(t1 - t0);
VarianceCalc.addSample(dt);
TMin = std::min(TMin, dt);
TMax = std::max(TMax, dt);
Samples.push_back(dt);
}
{
static constexpr u32 BinCount = 50;
u32 binsN[BinCount] = {};
double binsX[BinCount] = {};
FILE* f = fopen("output.csv", "w");
for (double t : Samples)
{
u32 bin = u32(clamp(((t - TMin) / (TMax - TMin)) * double(BinCount), 0.0, BinCount-1));
binsN[bin]++;
binsX[bin] += t;
}
for (u32 i = 0; i < BinCount; ++i)
{
if (binsN[i])
{
double t = binsX[i] / binsN[i];
fprintf(f, "%f, %d\n", TicksToMS(t), binsN[i]);
}
}
fclose(f);
}
double Avg = TicksToMS(VarianceCalc.mean);
double StdDev = TicksToMS(sqrt(VarianceCalc.getVariance()));
printf("Mean: %.2f ms, StdDev: %.2f, Min: %.2f, Max: %.2f\n", Avg, StdDev, TicksToMS(TMin), TicksToMS(TMax));
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment