# HG changeset patch # User Mathieu Lacage # Date 1438852551 14400 # Node ID cc85437fbbf744d8ec1162f4d32ef003827d0e1a # Parent 68e480bb7d74243214ff05667d73dbe266854ce6 run the benchmark over multiple iterations to minimize variance diff -r 68e480bb7d74 -r cc85437fbbf7 utils/bench-packets.cc --- a/utils/bench-packets.cc Sun Jul 26 19:44:06 2015 +0300 +++ b/utils/bench-packets.cc Thu Aug 06 05:15:51 2015 -0400 @@ -24,6 +24,8 @@ #include #include #include // for exit () +#include +#include using namespace ns3; @@ -281,18 +283,31 @@ } } -static void -runBench (void (*bench) (uint32_t), uint32_t n, char const *name) +static uint64_t +runBenchOneIteration (void (*bench) (uint32_t), uint32_t n) { SystemWallClockMs time; time.Start (); (*bench) (n); uint64_t deltaMs = time.End (); + return deltaMs; +} + + +static void +runBench (void (*bench) (uint32_t), uint32_t n, uint32_t minIterations, char const *name) +{ + uint64_t minDelay = std::numeric_limits::max(); + for (uint32_t i = 0; i < minIterations; i++) + { + uint64_t delay = runBenchOneIteration(bench, n); + minDelay = std::min(minDelay, delay); + } double ps = n; ps *= 1000; - ps /= deltaMs; + ps /= minDelay; std::cout << ps << " packets/s" - << " (" << deltaMs << " ms elapsed)\t" + << " (" << minDelay << " ms elapsed)\t" << name << std::endl; } @@ -300,6 +315,7 @@ int main (int argc, char *argv[]) { uint32_t n = 0; + uint32_t minIterations = 10; while (argc > 0) { if (strncmp ("--n=", argv[0],strlen ("--n=")) == 0) { @@ -308,6 +324,13 @@ iss.str (nAscii); iss >> n; } + if (strncmp ("--min-iterations=", argv[0],strlen ("--min-iterations=")) == 0) + { + char const *nAscii = argv[0] + strlen ("--min-iterations="); + std::istringstream iss; + iss.str (nAscii); + iss >> minIterations; + } if (strncmp ("--enable-printing", argv[0], strlen ("--enable-printing")) == 0) { Packet::EnablePrinting (); @@ -324,11 +347,11 @@ std::cout << "Running bench-packets with n=" << n << std::endl; std::cout << "All tests begin by adding UDP and IPv4 headers." << std::endl; - runBench (&benchA, n, "Copy packet, remove headers"); - runBench (&benchB, n, "Just add headers"); - runBench (&benchC, n, "Remove by func call"); - runBench (&benchD, n, "Intermixed add/remove headers and tags"); - runBench (&benchFragment, n, "Fragmentation and concatenation"); + runBench (&benchA, n, minIterations, "Copy packet, remove headers"); + runBench (&benchB, n, minIterations, "Just add headers"); + runBench (&benchC, n, minIterations, "Remove by func call"); + runBench (&benchD, n, minIterations, "Intermixed add/remove headers and tags"); + runBench (&benchFragment, n, minIterations, "Fragmentation and concatenation"); return 0; }