Created
April 16, 2018 12:51
-
-
Save kayru/60a9c1e1e38c049d09d5e7c81b2c3a1c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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