From 35461debaf11d8278a6cc37e2adbcf0b47e09e50 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Fri, 28 Feb 2014 13:04:31 +0100 Subject: [PATCH 01/21] Create gh-pages --- css/print.css | 226 ++++++++++++++++++++++++ css/pygment_trac.css | 69 ++++++++ css/stylesheet.css | 371 ++++++++++++++++++++++++++++++++++++++++ images/body-bg.png | Bin 0 -> 8859 bytes images/highlight-bg.jpg | Bin 0 -> 34222 bytes images/hr.png | Bin 0 -> 1037 bytes index.html | 134 +++++++++++++++ 7 files changed, 800 insertions(+) create mode 100644 css/print.css create mode 100644 css/pygment_trac.css create mode 100644 css/stylesheet.css create mode 100644 images/body-bg.png create mode 100644 images/highlight-bg.jpg create mode 100644 images/hr.png create mode 100644 index.html diff --git a/css/print.css b/css/print.css new file mode 100644 index 0000000..541695b --- /dev/null +++ b/css/print.css @@ -0,0 +1,226 @@ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +body { + font-size: 13px; + line-height: 1.5; + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + color: #000; +} + +a { + color: #d5000d; + font-weight: bold; +} + +header { + padding-top: 35px; + padding-bottom: 10px; +} + +header h1 { + font-weight: bold; + letter-spacing: -1px; + font-size: 48px; + color: #303030; + line-height: 1.2; +} + +header h2 { + letter-spacing: -1px; + font-size: 24px; + color: #aaa; + font-weight: normal; + line-height: 1.3; +} +#downloads { + display: none; +} +#main_content { + padding-top: 20px; +} + +code, pre { + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; + color: #222; + margin-bottom: 30px; + font-size: 12px; +} + +code { + padding: 0 3px; +} + +pre { + border: solid 1px #ddd; + padding: 20px; + overflow: auto; +} +pre code { + padding: 0; +} + +ul, ol, dl { + margin-bottom: 20px; +} + + +/* COMMON STYLES */ + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + border: 1px solid #ebebeb; + text-align: center; + font-weight: 300; +} + +form { + background: #f2f2f2; + padding: 20px; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +h1 { + font-size: 2.8em; +} + +h2 { + font-size: 22px; + font-weight: bold; + color: #303030; + margin-bottom: 8px; +} + +h3 { + color: #d5000d; + font-size: 18px; + font-weight: bold; + margin-bottom: 8px; +} + +h4 { + font-size: 16px; + color: #303030; + font-weight: bold; +} + +h5 { + font-size: 1em; + color: #303030; +} + +h6 { + font-size: .8em; + color: #303030; +} + +p { + font-weight: 300; + margin-bottom: 20px; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + font-size: 1.6em; + border-left: 10px solid #e9e9e9; + margin-bottom: 20px; + padding: 0 0 0 30px; +} + +ul li { + list-style: disc inside; + padding-left: 20px; +} + +ol li { + list-style: decimal inside; + padding-left: 3px; +} + +dl dd { + font-style: italic; + font-weight: 100; +} + +footer { + margin-top: 40px; + padding-top: 20px; + padding-bottom: 30px; + font-size: 13px; + color: #aaa; +} + +footer a { + color: #666; +} + +/* MISC */ +.clearfix:after { + clear: both; + content: '.'; + display: block; + visibility: hidden; + height: 0; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} \ No newline at end of file diff --git a/css/pygment_trac.css b/css/pygment_trac.css new file mode 100644 index 0000000..c6a6452 --- /dev/null +++ b/css/pygment_trac.css @@ -0,0 +1,69 @@ +.highlight { background: #ffffff; } +.highlight .c { color: #999988; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .k { font-weight: bold } /* Keyword */ +.highlight .o { font-weight: bold } /* Operator */ +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #999999 } /* Generic.Heading */ +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold; } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { font-weight: bold } /* Keyword.Constant */ +.highlight .kd { font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #009999 } /* Literal.Number */ +.highlight .s { color: #d14 } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #0086B3 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ +.highlight .ni { color: #800080 } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ +.highlight .nn { color: #555555 } /* Name.Namespace */ +.highlight .nt { color: #000080 } /* Name.Tag */ +.highlight .nv { color: #008080 } /* Name.Variable */ +.highlight .ow { font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sb { color: #d14 } /* Literal.String.Backtick */ +.highlight .sc { color: #d14 } /* Literal.String.Char */ +.highlight .sd { color: #d14 } /* Literal.String.Doc */ +.highlight .s2 { color: #d14 } /* Literal.String.Double */ +.highlight .se { color: #d14 } /* Literal.String.Escape */ +.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ +.highlight .si { color: #d14 } /* Literal.String.Interpol */ +.highlight .sx { color: #d14 } /* Literal.String.Other */ +.highlight .sr { color: #009926 } /* Literal.String.Regex */ +.highlight .s1 { color: #d14 } /* Literal.String.Single */ +.highlight .ss { color: #990073 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #008080 } /* Name.Variable.Class */ +.highlight .vg { color: #008080 } /* Name.Variable.Global */ +.highlight .vi { color: #008080 } /* Name.Variable.Instance */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ + +.type-csharp .highlight .k { color: #0000FF } +.type-csharp .highlight .kt { color: #0000FF } +.type-csharp .highlight .nf { color: #000000; font-weight: normal } +.type-csharp .highlight .nc { color: #2B91AF } +.type-csharp .highlight .nn { color: #000000 } +.type-csharp .highlight .s { color: #A31515 } +.type-csharp .highlight .sc { color: #A31515 } diff --git a/css/stylesheet.css b/css/stylesheet.css new file mode 100644 index 0000000..020ad6d --- /dev/null +++ b/css/stylesheet.css @@ -0,0 +1,371 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* LAYOUT STYLES */ +body { + font-size: 1em; + line-height: 1.5; + background: #e7e7e7 url(../images/body-bg.png) 0 0 repeat; + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); + color: #6d6d6d; +} + +a { + color: #d5000d; +} +a:hover { + color: #c5000c; +} + +header { + padding-top: 35px; + padding-bottom: 25px; +} + +header h1 { + font-family: 'Chivo', 'Helvetica Neue', Helvetica, Arial, serif; font-weight: 900; + letter-spacing: -1px; + font-size: 48px; + color: #303030; + line-height: 1.2; +} + +header h2 { + letter-spacing: -1px; + font-size: 24px; + color: #aaa; + font-weight: normal; + line-height: 1.3; +} + +#container { + background: transparent url(../images/highlight-bg.jpg) 50% 0 no-repeat; + min-height: 595px; +} + +.inner { + width: 620px; + margin: 0 auto; +} + +#container .inner img { + max-width: 100%; +} + +#downloads { + margin-bottom: 40px; +} + +a.button { + -moz-border-radius: 30px; + -webkit-border-radius: 30px; + border-radius: 30px; + border-top: solid 1px #cbcbcb; + border-left: solid 1px #b7b7b7; + border-right: solid 1px #b7b7b7; + border-bottom: solid 1px #b3b3b3; + color: #303030; + line-height: 25px; + font-weight: bold; + font-size: 15px; + padding: 12px 8px 12px 8px; + display: block; + float: left; + width: 179px; + margin-right: 14px; + background: #fdfdfd; /* Old browsers */ + background: -moz-linear-gradient(top, #fdfdfd 0%, #f2f2f2 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fdfdfd), color-stop(100%,#f2f2f2)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* IE10+ */ + background: linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdfdfd', endColorstr='#f2f2f2',GradientType=0 ); /* IE6-9 */ + -webkit-box-shadow: 10px 10px 5px #888; + -moz-box-shadow: 10px 10px 5px #888; + box-shadow: 0px 1px 5px #e8e8e8; +} +a.button:hover { + border-top: solid 1px #b7b7b7; + border-left: solid 1px #b3b3b3; + border-right: solid 1px #b3b3b3; + border-bottom: solid 1px #b3b3b3; + background: #fafafa; /* Old browsers */ + background: -moz-linear-gradient(top, #fdfdfd 0%, #f6f6f6 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fdfdfd), color-stop(100%,#f6f6f6)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* IE10+ */ + background: linear-gradient(top, #fdfdfd 0%,#f6f6f6, 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdfdfd', endColorstr='#f6f6f6',GradientType=0 ); /* IE6-9 */ +} + +a.button span { + padding-left: 50px; + display: block; + height: 23px; +} + +#download-zip span { + background: transparent url(../images/zip-icon.png) 12px 50% no-repeat; +} +#download-tar-gz span { + background: transparent url(../images/tar-gz-icon.png) 12px 50% no-repeat; +} +#view-on-github span { + background: transparent url(../images/octocat-icon.png) 12px 50% no-repeat; +} +#view-on-github { + margin-right: 0; +} + +code, pre { + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; + color: #222; + margin-bottom: 30px; + font-size: 14px; +} + +code { + background-color: #f2f2f2; + border: solid 1px #ddd; + padding: 0 3px; +} + +pre { + padding: 20px; + background: #303030; + color: #f2f2f2; + text-shadow: none; + overflow: auto; +} +pre code { + color: #f2f2f2; + background-color: #303030; + border: none; + padding: 0; +} + +ul, ol, dl { + margin-bottom: 20px; +} + + +/* COMMON STYLES */ + +hr { + height: 1px; + line-height: 1px; + margin-top: 1em; + padding-bottom: 1em; + border: none; + background: transparent url('../images/hr.png') 50% 0 no-repeat; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + border: 1px solid #ebebeb; + text-align: center; + font-weight: 300; +} + +form { + background: #f2f2f2; + padding: 20px; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +h1 { + font-size: 32px; +} + +h2 { + font-size: 22px; + font-weight: bold; + color: #303030; + margin-bottom: 8px; +} + +h3 { + color: #d5000d; + font-size: 18px; + font-weight: bold; + margin-bottom: 8px; +} + +h4 { + font-size: 16px; + color: #303030; + font-weight: bold; +} + +h5 { + font-size: 1em; + color: #303030; +} + +h6 { + font-size: .8em; + color: #303030; +} + +p { + font-weight: 300; + margin-bottom: 20px; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + font-size: 1.6em; + border-left: 10px solid #e9e9e9; + margin-bottom: 20px; + padding: 0 0 0 30px; +} + +ul li { + list-style: disc inside; + padding-left: 20px; +} + +ol li { + list-style: decimal inside; + padding-left: 3px; +} + +dl dt { + color: #303030; +} + +footer { + background: transparent url('../images/hr.png') 0 0 no-repeat; + margin-top: 40px; + padding-top: 20px; + padding-bottom: 30px; + font-size: 13px; + color: #aaa; +} + +footer a { + color: #666; +} +footer a:hover { + color: #444; +} + +/* MISC */ +.clearfix:after { + clear: both; + content: '.'; + display: block; + visibility: hidden; + height: 0; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} + +/* #Media Queries +================================================== */ + +/* Smaller than standard 960 (devices and browsers) */ +@media only screen and (max-width: 959px) {} + +/* Tablet Portrait size to standard 960 (devices and browsers) */ +@media only screen and (min-width: 768px) and (max-width: 959px) {} + +/* All Mobile Sizes (devices and browser) */ +@media only screen and (max-width: 767px) { + header { + padding-top: 10px; + padding-bottom: 10px; + } + #downloads { + margin-bottom: 25px; + } + #download-zip, #download-tar-gz { + display: none; + } + .inner { + width: 94%; + margin: 0 auto; + } +} + +/* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ +@media only screen and (min-width: 480px) and (max-width: 767px) {} + +/* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ +@media only screen and (max-width: 479px) {} diff --git a/images/body-bg.png b/images/body-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..d0618fe749178e814554f19fd158dea90020252d GIT binary patch literal 8859 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 DGStm7 literal 0 HcmV?d00001 diff --git a/images/hr.png b/images/hr.png new file mode 100644 index 0000000000000000000000000000000000000000..6c723a5602e14caa5c1527f3226d383dc83db6bd GIT binary patch literal 1037 zcmaJ=O=#3W6ppP(DfA#BSfMzksBP)ycawF8u4S8S+eOos-GGZH(`4F>Z89;Lx@kQW zdXeJMs}{wJ7kd-LA_{_7ym;tIym;!NSV8EeAUN6XZauh$A$c>r?|a{Td2fAYYNDt6 zd^f`|J;h1A#4sICXndmU6n#J5Kg-ikFDX<=8PAcL6(T0@;8_HUo;8n3$a0qNZle)~ z>6~`W3aJ=3pp8AwN^-c^3n-dlMn>bnvKJ5mvuNJ+bL`KpcPwz79D7qS1S8N;)ty`k zQF&#`v{x4Ftiz6810yk{1Rf$5h`mKWf^m+m^FkUY$2<$_DP$qX9*L?LGeE;30tzRm zY(W%(s&ZmlQB`pmNP;Nw0$plKOhZM5QU)|0mR1X$Iat!i8@1>z$5sgmAkWuoHLfOe zIGpFjY&M&4NK%Ssq@rb?SaHga`kM?oitNx0h>LxYFj}*CiR4(S^yms+(4zIDhE3Ek zKDGj0o(%|yfaf2!xTvLjML$9n%s9GS}j;!7yPOQB7F++2TBDu7yuEP_K584fa+@981e_uIs?OtVl{m%4Q@jEs6zkOwY@OLYf|Fijp4Jnphp%OCIt`6YCsf^KG$7 z-*^G7tfSDqhn(>cd!X(QblYpmwB>7Ho%UL;w#D*P44-ttUtQ5WqOF#MtsbYF)|4Qh zjz&mlVDsTNN9V^Z>UlH%x?^tlFhbYb?*||IhKCM5Kf8Fk0~~&sex2TTgpC(J4*mO= zclX|($v%4f<@?sbt)0D3^7`}qYTq~YRe7TK%AHKGyE^n#+j#TxU#ywo|pap6}o NpvA(JzBzV#?GKcZMQ8v3 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..991ebb2 --- /dev/null +++ b/index.html @@ -0,0 +1,134 @@ + + + + + + + + + + + Nonius by rmartinho + + + +
+
+ +
+

Nonius

+

A C++ benchmarking framework

+
+ +
+ +
+ +

+What is nonius?

+ +

Nonius is a framework for benchmarking small snippets of C++ code. It is very +heavily inspired by Criterion, a similar Haskell-based tool. It +runs your code, measures the time it takes to run, and then performs some +statistical analysis on those measurements.

+ +

+How do I use it?

+ +

The library itself is header-only, so you don't have to build anything. It +requires a C++11 capable compiler; it was tested with GCC 4.8.1, clang 3.4, and +VC++ 18.0. Most development takes place in the devel branch with GCC with +clang. The msvc branch tracks the latest successfully tested revision on +VC++ and the stable branch tracks the latest revision that was tested +successfully on all three compilers.

+ +

It depends on Boost for a few mathematical functions, for some +string algorithms, and, in VC++, for the timing functions as well. Boost.Chrono +is not a header-only library, but since it is only used with VC++ everything +gets linked automatically without intervention.

+ +

In the CI server you can grab a single header file with everything, ready to +be #included in your files.

+ +

There are examples of both simple and advanced usage in the examples folder.

+ +

If you just want to run a quick benchmark you can put everything in one file, +as in the examples. If you prefer to separate things into different files, it +is recommended that you create one small file with the runner code by #defining +the macro NONIUS_RUNNER and then #including the nonius single header. In other +files you don't #define that macro; just #include the header and write the +benchmarks. Then compile and link everything together.

+ +

Nonius standard runner has several command-line options for configuring a run. +Pass the --help flag to the compiled runner to see the various flags and a +short description of each. The standard runner includes all your benchmarks and +four reporters: plain text, CSV with raw timings, JUnit-compatible XML, and a +nice HTML file with a scatter plot of the timings.

+ +

+Woah, what do all these numbers mean?

+ +

If you execute the standard runner without requesting a particular reporter, +nonius will use plain text to report the results.

+ +

The first thing that nonius does when benchmarking is to find out where it is +running. It estimates the resolution and the cost of using the clock. It will +print out the mean of the samples it took, and also some information about the +spread of those values, namely any outliers seen.

+ +

Outliers are classified as "low" or "high" depending on whether they are above +or below the mean. They can be "mild" or "severe" if they are relatively far +from the rest of the measurements. If you request verbose output the default +reporter will provide outlier classification.

+ +

After ascertaining the characteristics of the environment, the benchmarks are +run in sequence. Each one consists of taking a number of samples determined by +the configuration (defaults to 100). Each sample consists of running the code +being measured for a number of times that makes sure it takes enough time that +the clock resolution does not affect the measurement.

+ +

After the measurements are performed, a statistical bootstrapping is performed +on the data. The number of resamples is configurable but defaults to 100000. +After the bootstrapping is done, the mean and standard deviation estimates are +printed out, along with their confidence interval, followed by information about +the outliers. The very last information tells us if the outliers might be +important: if they affect the variance greatly, our measurements might not be +very trustworthy. It could be that there is another factor affecting our +measurements (say, some other application that was doing some heavy task at the +same time), or maybe the code being measure varies wildly in performance. +Nonius will provide the data; it's up to you to make sense of it.

+ +

+Are there any restrictions on the use of nonius?

+ +

Nonius is released under the CC0 license, which is essentially a public +domain dedication with legalese to emulate the public domain as much as +possible under jurisdictions that do not have such a concept. That means you +can really do whatever you want with the code in nonius, because I waived as +many of my rights on it as I am allowed.

+ +

However, currently nonius makes use of some code distributed under the +CC-BY-NC and the MIT licenses. The html reporter uses the Highcharts JS +and jQuery libraries for the interactive charts and the cpptemplate library +for generating HTML from a template.

+ +

+What does "nonius" mean?

+ +

Nonius is a device created in 1542 by the Portuguese inventor +Pedro Nunes (Petrus Nonius in Latin) that improved the accuracy of the +astrolabe. It was adapted in 1631 by the French mathematician Pierre Vernier to +create the vernier scale.

+
+ + + +
+
+ + From 830fc889e0a7c4076054d0268aa220d912e5e766 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Sat, 1 Mar 2014 20:03:53 +0100 Subject: [PATCH 02/21] Test --- .gitignore | 4 +++ _layouts/test.html | 40 ++++++++++++++++++++++ css/stylesheet.css | 27 ++------------- index.html | 26 ++++++--------- test.md | 83 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 141 insertions(+), 39 deletions(-) create mode 100644 .gitignore create mode 100644 _layouts/test.html create mode 100644 test.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb44123 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +_site/ +*.swp +.*.swp + diff --git a/_layouts/test.html b/_layouts/test.html new file mode 100644 index 0000000..aa3faa9 --- /dev/null +++ b/_layouts/test.html @@ -0,0 +1,40 @@ + + + + + + + + + + + Nonius by rmartinho + + + +
+
+ +
+

Nonius

+

A C++ benchmarking framework

+
+ +
+ +
+ {{content}} +
+ + + +
+
+ + + diff --git a/css/stylesheet.css b/css/stylesheet.css index 020ad6d..8d7bac3 100644 --- a/css/stylesheet.css +++ b/css/stylesheet.css @@ -98,13 +98,9 @@ header h2 { max-width: 100%; } -#downloads { - margin-bottom: 40px; -} - a.button { -moz-border-radius: 30px; - -webkit-border-radius: 30px; + -webkit-border-radius: 30px; border-radius: 30px; border-top: solid 1px #cbcbcb; border-left: solid 1px #b7b7b7; @@ -152,19 +148,6 @@ a.button span { height: 23px; } -#download-zip span { - background: transparent url(../images/zip-icon.png) 12px 50% no-repeat; -} -#download-tar-gz span { - background: transparent url(../images/tar-gz-icon.png) 12px 50% no-repeat; -} -#view-on-github span { - background: transparent url(../images/octocat-icon.png) 12px 50% no-repeat; -} -#view-on-github { - margin-right: 0; -} - code, pre { font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; color: #222; @@ -175,6 +158,8 @@ code, pre { code { background-color: #f2f2f2; border: solid 1px #ddd; + border-radius: 15px; + -moz-border-radius: 15px; padding: 0 3px; } @@ -352,12 +337,6 @@ footer a:hover { padding-top: 10px; padding-bottom: 10px; } - #downloads { - margin-bottom: 25px; - } - #download-zip, #download-tar-gz { - display: none; - } .inner { width: 94%; margin: 0 auto; diff --git a/index.html b/index.html index 991ebb2..f401cf1 100644 --- a/index.html +++ b/index.html @@ -10,7 +10,7 @@ - Nonius by rmartinho + Nonius @@ -26,20 +26,18 @@

A C++ benchmarking framework

-

-What is nonius?

+

What is nonius?

Nonius is a framework for benchmarking small snippets of C++ code. It is very heavily inspired by Criterion, a similar Haskell-based tool. It runs your code, measures the time it takes to run, and then performs some statistical analysis on those measurements.

-

-How do I use it?

+

How do I use it?

The library itself is header-only, so you don't have to build anything. It -requires a C++11 capable compiler; it was tested with GCC 4.8.1, clang 3.4, and -VC++ 18.0. Most development takes place in the devel branch with GCC with +requires a C++11 capable compiler; it was tested with GCC 4.8.3, clang 3.5, and +VC++ 19.0. Most development takes place in the devel branch with GCC with clang. The msvc branch tracks the latest successfully tested revision on VC++ and the stable branch tracks the latest revision that was tested successfully on all three compilers.

@@ -49,8 +47,9 @@

is not a header-only library, but since it is only used with VC++ everything gets linked automatically without intervention.

-

In the CI server you can grab a single header file with everything, ready to -be #included in your files.

+

In the releases +page you can grab a single header file with everything, ready to be #included +in your files.

There are examples of both simple and advanced usage in the examples folder.

@@ -67,8 +66,7 @@

four reporters: plain text, CSV with raw timings, JUnit-compatible XML, and a nice HTML file with a scatter plot of the timings.

-

-Woah, what do all these numbers mean?

+

Woah, what do all these numbers mean?

If you execute the standard runner without requesting a particular reporter, nonius will use plain text to report the results.

@@ -100,8 +98,7 @@

same time), or maybe the code being measure varies wildly in performance. Nonius will provide the data; it's up to you to make sense of it.

-

-Are there any restrictions on the use of nonius?

+

Are there any restrictions on the use of nonius?

Nonius is released under the CC0 license, which is essentially a public domain dedication with legalese to emulate the public domain as much as @@ -114,8 +111,7 @@

and jQuery libraries for the interactive charts and the cpptemplate library for generating HTML from a template.

-

-What does "nonius" mean?

+

What does "nonius" mean?

Nonius is a device created in 1542 by the Portuguese inventor Pedro Nunes (Petrus Nonius in Latin) that improved the accuracy of the diff --git a/test.md b/test.md new file mode 100644 index 0000000..8ed5a88 --- /dev/null +++ b/test.md @@ -0,0 +1,83 @@ +--- +title: foo +layout: test +--- +Thingies! + +{% highlight console %} +$ bin/examples/example5 -h +Usage: bin/examples/example5 [OPTIONS] + +--help -h show this help message +--samples=SAMPLES -s SAMPLES number of samples to collect (default: 100) +--resamples=RESAMPLES -rs RESAMPLES number of resamples for the bootstrap (default: 100000) +--confidence-interval=INTERVAL -ci INTERVAL confidence interval for the bootstrap (between 0 and 1, default: 0.95) +--output=FILE -o FILE output file (default: ) +--reporter=REPORTER -r REPORTER reporter to use (default: standard) +--title=TITLE -t TITLE set report title +--no-analysis -A perform only measurements; do not perform any analysis +--list -l list benchmarks +--list-reporters -lr list available reporters +--verbose -v show verbose output (mutually exclusive with -q) +--summary -q show summary output (mutually exclusive with -v) +$ +{% endhighlight %} + +{% highlight console %} +$ bin/examples/example5 +clock resolution: mean is 24.4967 ns (20480002 iterations) + +benchmarking construct small +collecting 100 samples, 403 iterations each, in estimated 2.418 ms +mean: 40.3394 ns, lb 40.3318 ns, ub 40.365 ns, ci 0.95 +std dev: 0.0629761 ns, lb 0.0186515 ns, ub 0.139918 ns, ci 0.95 +found 3 outliers among 100 samples (3%) +variance is unaffected by outliers + +benchmarking construct large +collecting 100 samples, 272 iterations each, in estimated 2.448 ms +mean: 51.5876 ns, lb 51.5589 ns, ub 51.7001 ns, ci 0.95 +std dev: 0.251572 ns, lb 0.0545789 ns, ub 0.581709 ns, ci 0.95 +found 5 outliers among 100 samples (5%) +variance is unaffected by outliers + +benchmarking destroy small +collecting 100 samples, 324 iterations each, in estimated 2.43 ms +mean: 27.4421 ns, lb 27.4391 ns, ub 27.456 ns, ci 0.95 +std dev: 0.028566 ns, lb 0.00233815 ns, ub 0.0679242 ns, ci 0.95 +found 1 outliers among 100 samples (1%) +variance is unaffected by outliers + +benchmarking destroy large +collecting 100 samples, 269 iterations each, in estimated 2.4479 ms +mean: 31.5494 ns, lb 31.5042 ns, ub 31.7417 ns, ci 0.95 +std dev: 0.406734 ns, lb 0.0355798 ns, ub 0.954117 ns, ci 0.95 +found 23 outliers among 100 samples (23%) +variance is slightly inflated by outliers +$ +{% endhighlight %} + +{% highlight console %} +$ bin/examples/example5 -q + +construct small +mean: 40.3974 ns +std dev: 0.493846 ns +variance is unaffected by outliers + +construct large +mean: 51.6843 ns +std dev: 0.619526 ns +variance is unaffected by outliers + +destroy small +mean: 27.4425 ns +std dev: 0.0689035 ns +variance is unaffected by outliers + +destroy large +mean: 31.1184 ns +std dev: 0.140576 ns +variance is unaffected by outliers +{% endhighlight %} + From 4db560dcae4aa5fb4433c896522699ff2a1ac7c4 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Wed, 18 Feb 2015 19:59:07 +0100 Subject: [PATCH 03/21] Basic docs --- _layouts/{test.html => default.html} | 0 index.html | 130 --------------------- index.md | 167 +++++++++++++++++++++++++++ test.md | 83 ------------- 4 files changed, 167 insertions(+), 213 deletions(-) rename _layouts/{test.html => default.html} (100%) delete mode 100644 index.html create mode 100644 index.md delete mode 100644 test.md diff --git a/_layouts/test.html b/_layouts/default.html similarity index 100% rename from _layouts/test.html rename to _layouts/default.html diff --git a/index.html b/index.html deleted file mode 100644 index f401cf1..0000000 --- a/index.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - Nonius - - - -

-
- -
-

Nonius

-

A C++ benchmarking framework

-
- -
- -
- -

What is nonius?

- -

Nonius is a framework for benchmarking small snippets of C++ code. It is very -heavily inspired by Criterion, a similar Haskell-based tool. It -runs your code, measures the time it takes to run, and then performs some -statistical analysis on those measurements.

- -

How do I use it?

- -

The library itself is header-only, so you don't have to build anything. It -requires a C++11 capable compiler; it was tested with GCC 4.8.3, clang 3.5, and -VC++ 19.0. Most development takes place in the devel branch with GCC with -clang. The msvc branch tracks the latest successfully tested revision on -VC++ and the stable branch tracks the latest revision that was tested -successfully on all three compilers.

- -

It depends on Boost for a few mathematical functions, for some -string algorithms, and, in VC++, for the timing functions as well. Boost.Chrono -is not a header-only library, but since it is only used with VC++ everything -gets linked automatically without intervention.

- -

In the releases -page you can grab a single header file with everything, ready to be #included -in your files.

- -

There are examples of both simple and advanced usage in the examples folder.

- -

If you just want to run a quick benchmark you can put everything in one file, -as in the examples. If you prefer to separate things into different files, it -is recommended that you create one small file with the runner code by #defining -the macro NONIUS_RUNNER and then #including the nonius single header. In other -files you don't #define that macro; just #include the header and write the -benchmarks. Then compile and link everything together.

- -

Nonius standard runner has several command-line options for configuring a run. -Pass the --help flag to the compiled runner to see the various flags and a -short description of each. The standard runner includes all your benchmarks and -four reporters: plain text, CSV with raw timings, JUnit-compatible XML, and a -nice HTML file with a scatter plot of the timings.

- -

Woah, what do all these numbers mean?

- -

If you execute the standard runner without requesting a particular reporter, -nonius will use plain text to report the results.

- -

The first thing that nonius does when benchmarking is to find out where it is -running. It estimates the resolution and the cost of using the clock. It will -print out the mean of the samples it took, and also some information about the -spread of those values, namely any outliers seen.

- -

Outliers are classified as "low" or "high" depending on whether they are above -or below the mean. They can be "mild" or "severe" if they are relatively far -from the rest of the measurements. If you request verbose output the default -reporter will provide outlier classification.

- -

After ascertaining the characteristics of the environment, the benchmarks are -run in sequence. Each one consists of taking a number of samples determined by -the configuration (defaults to 100). Each sample consists of running the code -being measured for a number of times that makes sure it takes enough time that -the clock resolution does not affect the measurement.

- -

After the measurements are performed, a statistical bootstrapping is performed -on the data. The number of resamples is configurable but defaults to 100000. -After the bootstrapping is done, the mean and standard deviation estimates are -printed out, along with their confidence interval, followed by information about -the outliers. The very last information tells us if the outliers might be -important: if they affect the variance greatly, our measurements might not be -very trustworthy. It could be that there is another factor affecting our -measurements (say, some other application that was doing some heavy task at the -same time), or maybe the code being measure varies wildly in performance. -Nonius will provide the data; it's up to you to make sense of it.

- -

Are there any restrictions on the use of nonius?

- -

Nonius is released under the CC0 license, which is essentially a public -domain dedication with legalese to emulate the public domain as much as -possible under jurisdictions that do not have such a concept. That means you -can really do whatever you want with the code in nonius, because I waived as -many of my rights on it as I am allowed.

- -

However, currently nonius makes use of some code distributed under the -CC-BY-NC and the MIT licenses. The html reporter uses the Highcharts JS -and jQuery libraries for the interactive charts and the cpptemplate library -for generating HTML from a template.

- -

What does "nonius" mean?

- -

Nonius is a device created in 1542 by the Portuguese inventor -Pedro Nunes (Petrus Nonius in Latin) that improved the accuracy of the -astrolabe. It was adapted in 1631 by the French mathematician Pierre Vernier to -create the vernier scale.

-
- - - -
-
- - diff --git a/index.md b/index.md new file mode 100644 index 0000000..c194893 --- /dev/null +++ b/index.md @@ -0,0 +1,167 @@ +--- +title: Nonius +layout: default +--- +## What is nonius? + +Nonius is a framework for benchmarking small snippets of C++ code. It is very +heavily inspired by [Criterion], a similar Haskell-based tool. It runs your +code, measures the time it takes to run, and then performs some statistical +analysis on those measurements. + + [Criterion]: http://www.serpentine.com/blog/2009/09/29/criterion-a-new-benchmarking-library-for-haskell/ + +## How do I use it? + +### Installation and dependencies + +The library itself is header-only so you don't have to build it. It comes as a +single header that you can drop the header somewhere and #include it in your +code. You can grab the header from the [releases] page. + + [releases]: https://github.com/rmartinho/nonius/releases + + +You will need a C++11 capable compiler; it has been tested with GCC 4.8.3, +clang 3.5, and VC++ 18.0. Older versions of these compilers may work, but there +are no guarantees. Newer versions of these compilers are also supported. + +The library depends on [Booost] for a few mathematical functions, for some +string algorithms, and, in some versions of VC++, for the timing functions as +well. Boost.Chrono is not a header-only library, but since it is only used with +VC++ everything gets linked automatically without intervention. + + [Boost]: http://www.boost.org + +### Authoring benchmarks + +There are examples of both simple and advanced usage in the `examples` folder. +For now that is the primary documentation. Once I am content with a stable +interface there will be more detailed explanations. + +If you just want to run a quick benchmark you can put everything in one file, as +in the examples. If you have something more complicated and prefer to separate +things into different files, it is recommended that you create one small file +with the runner infrastructure by #defining the macro `NONIUS_RUNNER` and +then #including the nonius header. + +{% highlight cpp %} +// runner file contents +#define NONIUS_RUNNER +#include "nonius.h++" +{% endhighlight %} + +In other files you don't #define that macro; just #include the header and write +the benchmarks. + +{% highlight cpp %} +// other files +#include "nonius.h++" + +// everything else goes here +{% endhighlight %} + +Then you compile and link everything together as normal. Keep in mind that the +statistical analysis is multithreaded so you may need to pass extra flags to +your compiler (like `-pthread` in GCC). That gives you an executable with your +benchmarks and with the nonius standard benchmark runner. + +### Running benchmarks + +The standard runner has several command-line options for configuring a run. +Pass the `--help` flag to the compiled runner to see the various flags and a +short description of each. The runner includes all your benchmarks and it comes +equipped with four reporters: plain text, CSV with raw timings, JUnit-compatible +XML, and an HTML file with a scatter plot of the timings. + +If you execute the runner without requesting a particular reporter, nonius will +use plain text to report the results. + +The first thing that nonius does when running is testing the clock. By default +it uses the clock provided by `std::chrono::high_resolution_clock`. The runner +estimates the resolution and the cost of using the clock and then prints out +that estimate. + +{% highlight console %} +clock resolution: mean is 28.1296 ns (20480002 iterations) +{% endhighlight %} + +After ascertaining the characteristics of the clock, the benchmarks are run in +sequence. Each benchmark consists of taking a number of samples determined by +the command-line flags (defaults to 100). Each of those samples consists of +running the code being measured for a number of times that makes sure it takes +enough time that the clock resolution does not affect the measurement. If you're +benchmarking code that takes significantly more than the clock resolution to +run, it will probably run it once for each sample. However, if one run of that +code is too fast, nonius will scale it by running the code more than once per +sample. This obviously implies that your benchmarks should be completely +reentrant. There is also the underlying assumption that the time it takes to run +the code does not vary wildly. + +{% highlight console %} +benchmarking construct small +collecting 100 samples, 438 iterations each, in estimated 2.8032 ms +{% endhighlight %} + +After the measurements are performed, a statistical [bootstrapping] is performed +on the samples. The number of resamples for that bootstrapping is configurable +but defaults to 100000. After the bootstrapping is done, the runner will print +estimates for the mean and standard deviation. The estimates come with a lower +bound and an upper bound, and the confidence interval (which is configurable but +defaults to 95%). + + [bootstrapping]: http://en.wikipedia.org/wiki/Bootstrapping_%28statistics%29 + +{% highlight console %} +mean: 41.3622 ns, lb 41.3479 ns, ub 41.4251 ns, ci 0.95 +std dev: 0.130953 ns, lb 0.0209896 ns, ub 0.309054 ns, ci 0.95 +{% endhighlight %} + +After all that, the runner will tell you if about any samples that are outliers +and whether those might be important: if they affect the variance greatly, our +measurements might not be very trustworthy. It could be that there is another +factor affecting our measurements (say, some other application that was doing +some heavy task at the same time), or maybe the code being measure varies wildly +in performance. Nonius will provide the data; it's up to you to make sense of +it. + +{% highlight console %} +found 19 outliers among 100 samples (19%) +variance is unaffected by outliers +{% endhighlight %} + +Outliers are classified as "low" or "high" depending on whether they are above +or below the mean. They can be "mild" or "severe" if they are relatively far +from the rest of the measurements. If you request verbose output the default +reporter will give you outlier classification. + +## Licensing + +Nonius is released under the [CC0] license, which is essentially a public domain +dedication with legalese to emulate the public domain as much as possible under +jurisdictions that do not have such a concept. That means you can really do +whatever you want with the code in nonius, because I waived as many of my rights +on it as I am allowed. + + [CC0]: http://creativecommons.org/publicdomain/zero/1.0/ + +However, currently nonius makes use of some code distributed under the +[CC-BY-NC] and the [MIT] licenses. The `html` reporter uses the [Highcharts JS] +and [jQuery] libraries for the interactive charts and the [cpptemplate] library +for generating HTML from a template. + + [CC-BY-NC]: http://creativecommons.org/licenses/by-nc/3.0/ + [MIT]: https://bitbucket.org/ginstrom/cpptemplate/raw/d4263ca998038f7ae18aeb9d2358f0c11f00552d/LICENSE.txt + [Highcharts JS]: http://www.highcharts.com/ + [jQuery]: http://jquery.org/ + [cpptemplate]: https://bitbucket.org/ginstrom/cpptemplate + +## Trivia + +A [nonius] is a device created in 1542 by the Portuguese inventor Pedro Nunes +(Petrus Nonius in Latin) that improved the accuracy of the astrolabe. It was +adapted in 1631 by the French mathematician Pierre Vernier to create the vernier +scale. + + [Nonius]: http://en.wikipedia.org/wiki/Nonius_%28device%29 + diff --git a/test.md b/test.md deleted file mode 100644 index 8ed5a88..0000000 --- a/test.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: foo -layout: test ---- -Thingies! - -{% highlight console %} -$ bin/examples/example5 -h -Usage: bin/examples/example5 [OPTIONS] - ---help -h show this help message ---samples=SAMPLES -s SAMPLES number of samples to collect (default: 100) ---resamples=RESAMPLES -rs RESAMPLES number of resamples for the bootstrap (default: 100000) ---confidence-interval=INTERVAL -ci INTERVAL confidence interval for the bootstrap (between 0 and 1, default: 0.95) ---output=FILE -o FILE output file (default: ) ---reporter=REPORTER -r REPORTER reporter to use (default: standard) ---title=TITLE -t TITLE set report title ---no-analysis -A perform only measurements; do not perform any analysis ---list -l list benchmarks ---list-reporters -lr list available reporters ---verbose -v show verbose output (mutually exclusive with -q) ---summary -q show summary output (mutually exclusive with -v) -$ -{% endhighlight %} - -{% highlight console %} -$ bin/examples/example5 -clock resolution: mean is 24.4967 ns (20480002 iterations) - -benchmarking construct small -collecting 100 samples, 403 iterations each, in estimated 2.418 ms -mean: 40.3394 ns, lb 40.3318 ns, ub 40.365 ns, ci 0.95 -std dev: 0.0629761 ns, lb 0.0186515 ns, ub 0.139918 ns, ci 0.95 -found 3 outliers among 100 samples (3%) -variance is unaffected by outliers - -benchmarking construct large -collecting 100 samples, 272 iterations each, in estimated 2.448 ms -mean: 51.5876 ns, lb 51.5589 ns, ub 51.7001 ns, ci 0.95 -std dev: 0.251572 ns, lb 0.0545789 ns, ub 0.581709 ns, ci 0.95 -found 5 outliers among 100 samples (5%) -variance is unaffected by outliers - -benchmarking destroy small -collecting 100 samples, 324 iterations each, in estimated 2.43 ms -mean: 27.4421 ns, lb 27.4391 ns, ub 27.456 ns, ci 0.95 -std dev: 0.028566 ns, lb 0.00233815 ns, ub 0.0679242 ns, ci 0.95 -found 1 outliers among 100 samples (1%) -variance is unaffected by outliers - -benchmarking destroy large -collecting 100 samples, 269 iterations each, in estimated 2.4479 ms -mean: 31.5494 ns, lb 31.5042 ns, ub 31.7417 ns, ci 0.95 -std dev: 0.406734 ns, lb 0.0355798 ns, ub 0.954117 ns, ci 0.95 -found 23 outliers among 100 samples (23%) -variance is slightly inflated by outliers -$ -{% endhighlight %} - -{% highlight console %} -$ bin/examples/example5 -q - -construct small -mean: 40.3974 ns -std dev: 0.493846 ns -variance is unaffected by outliers - -construct large -mean: 51.6843 ns -std dev: 0.619526 ns -variance is unaffected by outliers - -destroy small -mean: 27.4425 ns -std dev: 0.0689035 ns -variance is unaffected by outliers - -destroy large -mean: 31.1184 ns -std dev: 0.140576 ns -variance is unaffected by outliers -{% endhighlight %} - From a7a4efda9a3db6a527e14c6d5525097a163ac6b7 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 19 Feb 2015 12:39:51 +0100 Subject: [PATCH 04/21] Fixes minor doc issues. --- index.md | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/index.md b/index.md index c194893..265d8ee 100644 --- a/index.md +++ b/index.md @@ -2,22 +2,24 @@ title: Nonius layout: default --- + ## What is nonius? Nonius is a framework for benchmarking small snippets of C++ code. It is very heavily inspired by [Criterion], a similar Haskell-based tool. It runs your code, measures the time it takes to run, and then performs some statistical -analysis on those measurements. +analysis on those measurements. The [source code] can be found on GitHub. [Criterion]: http://www.serpentine.com/blog/2009/09/29/criterion-a-new-benchmarking-library-for-haskell/ + [source code]: https://github.com/rmartinho/nonius ## How do I use it? ### Installation and dependencies The library itself is header-only so you don't have to build it. It comes as a -single header that you can drop the header somewhere and #include it in your -code. You can grab the header from the [releases] page. +single header that you can drop somewhere and #include it in your code. You can +grab the header from the [releases] page. [releases]: https://github.com/rmartinho/nonius/releases @@ -26,7 +28,7 @@ You will need a C++11 capable compiler; it has been tested with GCC 4.8.3, clang 3.5, and VC++ 18.0. Older versions of these compilers may work, but there are no guarantees. Newer versions of these compilers are also supported. -The library depends on [Booost] for a few mathematical functions, for some +The library depends on [Boost] for a few mathematical functions, for some string algorithms, and, in some versions of VC++, for the timing functions as well. Boost.Chrono is not a header-only library, but since it is only used with VC++ everything gets linked automatically without intervention. @@ -35,10 +37,12 @@ VC++ everything gets linked automatically without intervention. ### Authoring benchmarks -There are examples of both simple and advanced usage in the `examples` folder. +There are examples of both simple and advanced usage in the [examples] folder. For now that is the primary documentation. Once I am content with a stable interface there will be more detailed explanations. + [examples]: https://github.com/rmartinho/nonius/tree/devel/examples + If you just want to run a quick benchmark you can put everything in one file, as in the examples. If you have something more complicated and prefer to separate things into different files, it is recommended that you create one small file @@ -135,6 +139,15 @@ or below the mean. They can be "mild" or "severe" if they are relatively far from the rest of the measurements. If you request verbose output the default reporter will give you outlier classification. +{% highlight console %} +found 19 outliers among 100 samples (19%) + 2 (2%) low mild + 3 (3%) high mild + 14 (14%) high severe +variance introduced by outliers: 0.99% +variance is unaffected by outliers +{% endhighlight %} + ## Licensing Nonius is released under the [CC0] license, which is essentially a public domain From f00098d0db5cca099f4ed6f22201cdb013d61ea3 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 19 Feb 2015 14:27:07 +0100 Subject: [PATCH 05/21] Adds benchmark authoring guide. --- authoring-benchmarks.md | 225 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 authoring-benchmarks.md diff --git a/authoring-benchmarks.md b/authoring-benchmarks.md new file mode 100644 index 0000000..83dd663 --- /dev/null +++ b/authoring-benchmarks.md @@ -0,0 +1,225 @@ +--- +title: Nonius - Authoring benchmarks +layout: default +--- + +Writing benchmarks is not easy. Nonius simplifies certain aspects but you'll +always need to take care about various aspects. Understanding a few things about +the way nonius runs your code will be very helpful when writing your benchmarks. + +First off, let's go over some terminology that will be used throughout this +guide. + +- *User code*: user code is the code that the user provides to be measured. +- *Run*: one run is one execution of the user code. +- *Sample*: one sample is one data point obtained by measuring the time it takes + to perform a certain number of runs. One sample can consist of more than one + run if the clock available does not have enough resolution to accurately + measure a single run. All samples for a given benchmark execution are obtained + with the same number of runs. + +## Execution procedure + +Now I can explain how a benchmark is executed in nonius. There are three main +steps, though the first does not need to be repeated for every benchmark. + +1. *Environmental probe*: before any benchmarks can be executed, the clock's +resolution is estimated. A few other environmental artifacts are also estimated +at this point, like the cost of calling the clock function, but they almost +never have any impact in the results. + +2. *Estimation*: the user code is executed a few times to obtain an estimate of +the amount of runs that should be in each sample. This also has the potential +effect of bringing relevant code and data into the caches before the actual +measurement starts. + +3. *Measurement*: all the samples are collected sequentially by performing the +number of runs estimated in the previous step for each sample. + +This already gives us one important rule for writing benchmarks for nonius: the +benchmarks must be repeatable. The user code will be executed several times, and +the number of times it will be executed during the estimation step cannot be +known beforehand since it depends on the time it takes to execute the code. +User code that cannot be executed repeatedly will lead to bogus results or +crashes. + +## The optimizer + +Sometimes the optimizer will optimize away the very code that you want to +measure. There are several ways to use results that will prevent the optimiser +from removing them. You can use the `volatile` keyword, or you can output the +value to standard output or to a file, both of which force the program to +actually generate the value somehow. + +Nonius adds a third option. The values returned by any function provided as user +code are guaranteed to be evaluated and not optimised out. This means that if +your user code consists of computing a certain value, you don't need to bother +with using `volatile` or forcing output. Just `return` it from the function. +That helps with keeping the code in a natural fashion. + +Here's an example: + + // may measure nothing at all by skipping the long calculation since its + // result is not used + NONIUS_BENCHMARK("no return", [] { long_calculation(); }) + + // the result of long_calculation() is guaranteed to be computed somehow + NONIUS_BENCHMARK("with return", [] { return long_calculation(); }) + +However, there's no other form of control over the optimizer whatsoever. It is +up to you to write a benchmark that actually measures what you want and doesn't +just measure the time to do a whole bunch of nothing. + +To sum up, there are two simple rules: whatever you would do in handwritten code +to control optimization still works in nonius; and nonius makes return values +from user code into observable effects that can't be optimized away. + +## Interface + +The recommended way to use nonius is with the single header form. You can just +`#include ` and everything is available. + +There are two distinct parts of the nonius interface: specifying benchmarks, and +running benchmarks. + +### Specification + +Nonius includes an imperative interface to specify benchmarks for execution, but +the declarative interface is much simpler. As of this writing the imperative +interface is still subject to change, so it won't be documented. + +The declarative interface consists of the `NONIUS_BENCHMARK` macro. This macro +expands to some machinery that registers the benchmark in a global registry that +can be accessed by the standard runner. + +`NONIUS_BENCHMARK` takes two parameters: a string literal with a unique name to +identify the benchmark, and a callable object with the actual code. This +callable object is usually provided as a lambda expression. + +There are two types of callable objects that can be provided. The simplest ones +take no arguments and just run the user code that needs to be measured. However, +if the callable can be called with a `nonius::chronometer` argument, some +advanced features are available. The simple callables are invoked once per run, +while the advanced callables are invoked exactly twice: once during the +estimation phase, and another time during the execution phase. + + NONIUS_BENCHMARK("simple", [] { return long_computation(); }); + + NONIUS_BENCHMARK("advanced", [](nonius::chronometer meter) { + set_up(); + meter.measure([] { return long_computation(); }); + }); + +These advanced callables no longer consist entirely of user code to be measured. +In these cases, the code to be measured is provided via the +`nonius::chronometer::measure` member function. This allows you to set up any +kind of state that might be required for the benchmark but is not to be included +in the measurements, like making a vector of random integers to feed to a +sorting algorithm. + +A single call to `nonius::chronometer::measure` performs the actual measurements +by invoking the callable object passed in as many times as necessary. Anything +that needs to be done outside the measurement can be done outside the call to +`measure`. + +The callable object passed in to `measure` can optionally accept an `int` +parameter. + + meter.measure([](int i) { return long_computation(i); }); + +If it accepts an `int` parameter, the sequence number of each run will be passed +in, starting with 0. This is useful if you want to measure some mutating code, +for example. The number of runs can be known beforehand by calling +`nonius::chronometer::runs`; with this one can set up a different instance to be +mutated by each run. + + std::vector v(meter.runs()); + std::fill(v.begin(), v.end(), test_string()); + meter.measure([&v](int i) { in_place_escape(v[i]); }); + +Note that it is not possible to simply use the same instance for different runs +and resetting it between each run since that would pollute the measurements with +the resetting code. + +All of these tools give you a lot mileage, but there are two things that still +need special handling: constructors and destructors. The problem is that if you +use automatic objects they get destroyed by the end of the scope, so you end up +measuring the time for construction and destruction together. And if you use +dynamic allocation instead, you end up including the time to allocate memory in +the measurements. + +To solve this conundrum, nonius provides class templates that let you manually +construct and destroy objects without dynamic allocation and in a way that lets +you measure construction and destruction separately. + +{% highlight cpp %} +NONIUS_BENCHMARK("construct", [](nonius::chronometer meter) +{ + std::vector> storage(meter.runs()); + meter.measure([&](int i) { storage[i].construct("thing"); }); +}) + +NONIUS_BENCHMARK("destroy", [](nonius::chronometer meter) +{ + std::vector> storage(meter.runs()); + for(auto&& o : storage) + o.construct("thing"); + meter.measure([&](int i) { storage[i].destruct(); }); +}) +{% endhighlight %} + +`nonius::storage_for` objects are just pieces of raw storage suitable for `T` +objects. You can use the `nonius::storage_for::construct` member function to call a constructor and +create an object in that storage. So if you want to measure the time it takes +for a certain constructor to run, you can just measure the time it takes to run +this function. + +When the lifetime of a `nonius::storage_for` object ends, if an actual object was +constructed there it will be automatically destroyed, so nothing leaks. + +If you want to measure a destructor, though, we need to use +`nonius::destructable_object`. These objects are similar to +`nonius::storage_for` in that construction of the `T` object is manual, but +it does not destroy anything automatically. Instead, you are required to call +the `nonius::destructable_object::destruct` member function, which is what you +can use to measure the destruction time. + +### Execution + +Nonius includes an implementation of `main()` that provides a command-line +runner. This means you can just make your benchmarks into an executable and +you're good to go. If you want that default implementation of `main`, just +`#define NONIUS_RUNNER` before #including the nonius header. + +You can also write your own main if you need something fancy, but for now that +API is subject to change and not documented. + +Invoking the standard runner with the `--help` flag provides information about +the options available. Here are some examples of common choices: + +> Run all benchmarks and provide a simple textual report +> +> $ runner +> +> Run all benchmarks and provide extra details +> +> $ runner -v +> +> Run all benchmarks collecting 500 samples instead of the default 100, and +> report extra details +> +> $ runner -v -s 500 +> +> Run all benchmarks and output all samples to a CSV file named `results.csv` +> +> $ runner -r csv -o results.csv +> +> Run all benchmarks and output a JUnit compatible report named `results.xml` +> +> $ runner -r junit -o results.xml +> +> Run all benchmarks and output an HTML report named `results.html` with the +> title "Some benchmarks", using 250 samples per benchmark +> +> $ runner -r html -o results.html -t "Some benchmarks" -s 250 +> From c373e25f570f2c3435e727a3578e5cefff9e5377 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 19 Feb 2015 14:32:45 +0100 Subject: [PATCH 06/21] Links to authoring guide in index --- index.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/index.md b/index.md index 265d8ee..b1fbcd4 100644 --- a/index.md +++ b/index.md @@ -37,12 +37,16 @@ VC++ everything gets linked automatically without intervention. ### Authoring benchmarks -There are examples of both simple and advanced usage in the [examples] folder. -For now that is the primary documentation. Once I am content with a stable -interface there will be more detailed explanations. +Writing benchmarks with nonius is not complicated, but there are several things +to keep in mind when doing so. There is a separate [guide] about the subject, +and there are examples of both simple and advanced usage in the [examples] +folder. + [guide]: authoring-benchmarks [examples]: https://github.com/rmartinho/nonius/tree/devel/examples +### Compiling benchmarks + If you just want to run a quick benchmark you can put everything in one file, as in the examples. If you have something more complicated and prefer to separate things into different files, it is recommended that you create one small file @@ -68,7 +72,8 @@ the benchmarks. Then you compile and link everything together as normal. Keep in mind that the statistical analysis is multithreaded so you may need to pass extra flags to your compiler (like `-pthread` in GCC). That gives you an executable with your -benchmarks and with the nonius standard benchmark runner. +benchmarks and with the nonius standard benchmark runner. And don't forget to +enable optimisations! ### Running benchmarks @@ -99,7 +104,7 @@ benchmarking code that takes significantly more than the clock resolution to run, it will probably run it once for each sample. However, if one run of that code is too fast, nonius will scale it by running the code more than once per sample. This obviously implies that your benchmarks should be completely -reentrant. There is also the underlying assumption that the time it takes to run +repeatable. There is also the underlying assumption that the time it takes to run the code does not vary wildly. {% highlight console %} From 20a8a9602a64494472a199f411f0032227e4fd19 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 19 Feb 2015 14:43:12 +0100 Subject: [PATCH 07/21] Fixes ordered list style --- css/stylesheet.css | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/css/stylesheet.css b/css/stylesheet.css index 8d7bac3..8069fe9 100644 --- a/css/stylesheet.css +++ b/css/stylesheet.css @@ -284,9 +284,13 @@ ul li { padding-left: 20px; } +ol { + padding: 10px; +} + ol li { - list-style: decimal inside; - padding-left: 3px; + list-style: decimal; + padding-left: 10px; } dl dt { From dd910a1032f5a44fe929cfb93b2cee7f78d74273 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 19 Feb 2015 14:52:53 +0100 Subject: [PATCH 08/21] Moves execution guide out of authoring guide --- authoring-benchmarks.md | 67 +++++++++-------------------------------- css/stylesheet.css | 5 ++- index.md | 45 ++++++++++++++++++++++----- 3 files changed, 53 insertions(+), 64 deletions(-) diff --git a/authoring-benchmarks.md b/authoring-benchmarks.md index 83dd663..c966b84 100644 --- a/authoring-benchmarks.md +++ b/authoring-benchmarks.md @@ -59,12 +59,14 @@ That helps with keeping the code in a natural fashion. Here's an example: - // may measure nothing at all by skipping the long calculation since its - // result is not used - NONIUS_BENCHMARK("no return", [] { long_calculation(); }) +{% highlight cpp %} +// may measure nothing at all by skipping the long calculation since its +// result is not used +NONIUS_BENCHMARK("no return", [] { long_calculation(); }) - // the result of long_calculation() is guaranteed to be computed somehow - NONIUS_BENCHMARK("with return", [] { return long_calculation(); }) +// the result of long_calculation() is guaranteed to be computed somehow +NONIUS_BENCHMARK("with return", [] { return long_calculation(); }) +{% endhighlight %} However, there's no other form of control over the optimizer whatsoever. It is up to you to write a benchmark that actually measures what you want and doesn't @@ -74,15 +76,7 @@ To sum up, there are two simple rules: whatever you would do in handwritten code to control optimization still works in nonius; and nonius makes return values from user code into observable effects that can't be optimized away. -## Interface - -The recommended way to use nonius is with the single header form. You can just -`#include ` and everything is available. - -There are two distinct parts of the nonius interface: specifying benchmarks, and -running benchmarks. - -### Specification +## Benchmark specification Nonius includes an imperative interface to specify benchmarks for execution, but the declarative interface is much simpler. As of this writing the imperative @@ -103,12 +97,14 @@ advanced features are available. The simple callables are invoked once per run, while the advanced callables are invoked exactly twice: once during the estimation phase, and another time during the execution phase. +{% highlight cpp %} NONIUS_BENCHMARK("simple", [] { return long_computation(); }); NONIUS_BENCHMARK("advanced", [](nonius::chronometer meter) { set_up(); meter.measure([] { return long_computation(); }); }); +{% endhighlight %} These advanced callables no longer consist entirely of user code to be measured. In these cases, the code to be measured is provided via the @@ -125,7 +121,9 @@ that needs to be done outside the measurement can be done outside the call to The callable object passed in to `measure` can optionally accept an `int` parameter. +{% highlight cpp %} meter.measure([](int i) { return long_computation(i); }); +{% endhighlight %} If it accepts an `int` parameter, the sequence number of each run will be passed in, starting with 0. This is useful if you want to measure some mutating code, @@ -133,9 +131,11 @@ for example. The number of runs can be known beforehand by calling `nonius::chronometer::runs`; with this one can set up a different instance to be mutated by each run. +{% highlight cpp %} std::vector v(meter.runs()); std::fill(v.begin(), v.end(), test_string()); meter.measure([&v](int i) { in_place_escape(v[i]); }); +{% endhighlight %} Note that it is not possible to simply use the same instance for different runs and resetting it between each run since that would pollute the measurements with @@ -184,42 +184,3 @@ it does not destroy anything automatically. Instead, you are required to call the `nonius::destructable_object::destruct` member function, which is what you can use to measure the destruction time. -### Execution - -Nonius includes an implementation of `main()` that provides a command-line -runner. This means you can just make your benchmarks into an executable and -you're good to go. If you want that default implementation of `main`, just -`#define NONIUS_RUNNER` before #including the nonius header. - -You can also write your own main if you need something fancy, but for now that -API is subject to change and not documented. - -Invoking the standard runner with the `--help` flag provides information about -the options available. Here are some examples of common choices: - -> Run all benchmarks and provide a simple textual report -> -> $ runner -> -> Run all benchmarks and provide extra details -> -> $ runner -v -> -> Run all benchmarks collecting 500 samples instead of the default 100, and -> report extra details -> -> $ runner -v -s 500 -> -> Run all benchmarks and output all samples to a CSV file named `results.csv` -> -> $ runner -r csv -o results.csv -> -> Run all benchmarks and output a JUnit compatible report named `results.xml` -> -> $ runner -r junit -o results.xml -> -> Run all benchmarks and output an HTML report named `results.html` with the -> title "Some benchmarks", using 250 samples per benchmark -> -> $ runner -r html -o results.html -t "Some benchmarks" -s 250 -> diff --git a/css/stylesheet.css b/css/stylesheet.css index 8069fe9..b69b94e 100644 --- a/css/stylesheet.css +++ b/css/stylesheet.css @@ -285,12 +285,11 @@ ul li { } ol { - padding: 10px; + padding-left: 10px; } - ol li { list-style: decimal; - padding-left: 10px; + padding-left: 3px; } dl dt { diff --git a/index.md b/index.md index b1fbcd4..b236708 100644 --- a/index.md +++ b/index.md @@ -53,6 +53,9 @@ things into different files, it is recommended that you create one small file with the runner infrastructure by #defining the macro `NONIUS_RUNNER` and then #including the nonius header. +You can also write your own `main` function instead, if you need something +fancy, but for now that API is subject to change and not documented. + {% highlight cpp %} // runner file contents #define NONIUS_RUNNER @@ -77,14 +80,40 @@ enable optimisations! ### Running benchmarks -The standard runner has several command-line options for configuring a run. -Pass the `--help` flag to the compiled runner to see the various flags and a -short description of each. The runner includes all your benchmarks and it comes -equipped with four reporters: plain text, CSV with raw timings, JUnit-compatible -XML, and an HTML file with a scatter plot of the timings. - -If you execute the runner without requesting a particular reporter, nonius will -use plain text to report the results. +Invoking the standard runner with the `--help` flag provides information about +the options available. Here are some examples of common choices: + +> Run all benchmarks and provide a simple textual report +> +> $ runner +> +> Run all benchmarks and provide extra details +> +> $ runner -v +> +> Run all benchmarks collecting 500 samples instead of the default 100, and +> report extra details +> +> $ runner -v -s 500 +> +> Run all benchmarks and output all samples to a CSV file named `results.csv` +> +> $ runner -r csv -o results.csv +> +> Run all benchmarks and output a JUnit compatible report named `results.xml` +> +> $ runner -r junit -o results.xml +> +> Run all benchmarks and output an HTML report named `results.html` with the +> title "Some benchmarks", using 250 samples per benchmark +> +> $ runner -r html -o results.html -t "Some benchmarks" -s 250 +> + +The runner includes all your benchmarks and it comes equipped with four +reporters: plain text, CSV with raw timings, JUnit-compatible XML, and an HTML +file with a scatter plot of the timings. If you execute the runner without +requesting a particular reporter, it will use plain text to report the results. The first thing that nonius does when running is testing the clock. By default it uses the clock provided by `std::chrono::high_resolution_clock`. The runner From 8af5579f3a689e084dd8022cc490697b4c927aa6 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 19 Feb 2015 14:53:51 +0100 Subject: [PATCH 09/21] Fixes grammar --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index b236708..e9f26df 100644 --- a/index.md +++ b/index.md @@ -155,7 +155,7 @@ mean: 41.3622 ns, lb 41.3479 ns, ub 41.4251 ns, ci 0.95 std dev: 0.130953 ns, lb 0.0209896 ns, ub 0.309054 ns, ci 0.95 {% endhighlight %} -After all that, the runner will tell you if about any samples that are outliers +After all that, the runner will tell you about any samples that are outliers and whether those might be important: if they affect the variance greatly, our measurements might not be very trustworthy. It could be that there is another factor affecting our measurements (say, some other application that was doing From 13795518ec2bc26650f64d0388cf2558cff488ea Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 19 Feb 2015 14:55:00 +0100 Subject: [PATCH 10/21] Fixes quotes --- css/stylesheet.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/css/stylesheet.css b/css/stylesheet.css index b69b94e..9e39673 100644 --- a/css/stylesheet.css +++ b/css/stylesheet.css @@ -273,10 +273,9 @@ p a { } blockquote { - font-size: 1.6em; border-left: 10px solid #e9e9e9; - margin-bottom: 20px; - padding: 0 0 0 30px; + margin-bottom: 10px; + padding: 0 0 0 10px; } ul li { From 87335d0b00e43706ada1c9b4f71514d3f6d8e732 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 19 Feb 2015 14:58:36 +0100 Subject: [PATCH 11/21] Fixes indentation in examples --- authoring-benchmarks.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/authoring-benchmarks.md b/authoring-benchmarks.md index c966b84..6e76b49 100644 --- a/authoring-benchmarks.md +++ b/authoring-benchmarks.md @@ -98,12 +98,12 @@ while the advanced callables are invoked exactly twice: once during the estimation phase, and another time during the execution phase. {% highlight cpp %} - NONIUS_BENCHMARK("simple", [] { return long_computation(); }); +NONIUS_BENCHMARK("simple", [] { return long_computation(); }); - NONIUS_BENCHMARK("advanced", [](nonius::chronometer meter) { - set_up(); - meter.measure([] { return long_computation(); }); - }); +NONIUS_BENCHMARK("advanced", [](nonius::chronometer meter) { + set_up(); + meter.measure([] { return long_computation(); }); +}); {% endhighlight %} These advanced callables no longer consist entirely of user code to be measured. @@ -122,7 +122,7 @@ The callable object passed in to `measure` can optionally accept an `int` parameter. {% highlight cpp %} - meter.measure([](int i) { return long_computation(i); }); +meter.measure([](int i) { return long_computation(i); }); {% endhighlight %} If it accepts an `int` parameter, the sequence number of each run will be passed @@ -132,9 +132,9 @@ for example. The number of runs can be known beforehand by calling mutated by each run. {% highlight cpp %} - std::vector v(meter.runs()); - std::fill(v.begin(), v.end(), test_string()); - meter.measure([&v](int i) { in_place_escape(v[i]); }); +std::vector v(meter.runs()); +std::fill(v.begin(), v.end(), test_string()); +meter.measure([&v](int i) { in_place_escape(v[i]); }); {% endhighlight %} Note that it is not possible to simply use the same instance for different runs From 2f8fb94ee86d0b7b360f46cdd0ae12f025f5fd84 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Sat, 21 Feb 2015 18:32:17 +0100 Subject: [PATCH 12/21] Ignores deps/ folder --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index bb44123..56e57dd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ _site/ *.swp .*.swp +deps/ From 6c72500ca9c3e3594571642b7ce601a2a972a83b Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Sat, 21 Feb 2015 18:58:58 +0100 Subject: [PATCH 13/21] Adds title to authoring guide --- authoring-benchmarks.md | 72 +++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/authoring-benchmarks.md b/authoring-benchmarks.md index 6e76b49..7e22dc6 100644 --- a/authoring-benchmarks.md +++ b/authoring-benchmarks.md @@ -3,6 +3,8 @@ title: Nonius - Authoring benchmarks layout: default --- +## Authoring benchmarks + Writing benchmarks is not easy. Nonius simplifies certain aspects but you'll always need to take care about various aspects. Understanding a few things about the way nonius runs your code will be very helpful when writing your benchmarks. @@ -18,7 +20,7 @@ guide. measure a single run. All samples for a given benchmark execution are obtained with the same number of runs. -## Execution procedure +### Execution procedure Now I can explain how a benchmark is executed in nonius. There are three main steps, though the first does not need to be repeated for every benchmark. @@ -43,40 +45,7 @@ known beforehand since it depends on the time it takes to execute the code. User code that cannot be executed repeatedly will lead to bogus results or crashes. -## The optimizer - -Sometimes the optimizer will optimize away the very code that you want to -measure. There are several ways to use results that will prevent the optimiser -from removing them. You can use the `volatile` keyword, or you can output the -value to standard output or to a file, both of which force the program to -actually generate the value somehow. - -Nonius adds a third option. The values returned by any function provided as user -code are guaranteed to be evaluated and not optimised out. This means that if -your user code consists of computing a certain value, you don't need to bother -with using `volatile` or forcing output. Just `return` it from the function. -That helps with keeping the code in a natural fashion. - -Here's an example: - -{% highlight cpp %} -// may measure nothing at all by skipping the long calculation since its -// result is not used -NONIUS_BENCHMARK("no return", [] { long_calculation(); }) - -// the result of long_calculation() is guaranteed to be computed somehow -NONIUS_BENCHMARK("with return", [] { return long_calculation(); }) -{% endhighlight %} - -However, there's no other form of control over the optimizer whatsoever. It is -up to you to write a benchmark that actually measures what you want and doesn't -just measure the time to do a whole bunch of nothing. - -To sum up, there are two simple rules: whatever you would do in handwritten code -to control optimization still works in nonius; and nonius makes return values -from user code into observable effects that can't be optimized away. - -## Benchmark specification +### Benchmark specification Nonius includes an imperative interface to specify benchmarks for execution, but the declarative interface is much simpler. As of this writing the imperative @@ -184,3 +153,36 @@ it does not destroy anything automatically. Instead, you are required to call the `nonius::destructable_object::destruct` member function, which is what you can use to measure the destruction time. +### The optimizer + +Sometimes the optimizer will optimize away the very code that you want to +measure. There are several ways to use results that will prevent the optimiser +from removing them. You can use the `volatile` keyword, or you can output the +value to standard output or to a file, both of which force the program to +actually generate the value somehow. + +Nonius adds a third option. The values returned by any function provided as user +code are guaranteed to be evaluated and not optimised out. This means that if +your user code consists of computing a certain value, you don't need to bother +with using `volatile` or forcing output. Just `return` it from the function. +That helps with keeping the code in a natural fashion. + +Here's an example: + +{% highlight cpp %} +// may measure nothing at all by skipping the long calculation since its +// result is not used +NONIUS_BENCHMARK("no return", [] { long_calculation(); }) + +// the result of long_calculation() is guaranteed to be computed somehow +NONIUS_BENCHMARK("with return", [] { return long_calculation(); }) +{% endhighlight %} + +However, there's no other form of control over the optimizer whatsoever. It is +up to you to write a benchmark that actually measures what you want and doesn't +just measure the time to do a whole bunch of nothing. + +To sum up, there are two simple rules: whatever you would do in handwritten code +to control optimization still works in nonius; and nonius makes return values +from user code into observable effects that can't be optimized away. + From 65f2220e6cebce366aa7822743f3f1faae9d24a2 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Sat, 28 Mar 2015 16:38:39 +0100 Subject: [PATCH 14/21] No mention of imperative for now --- authoring-benchmarks.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/authoring-benchmarks.md b/authoring-benchmarks.md index 7e22dc6..ec53665 100644 --- a/authoring-benchmarks.md +++ b/authoring-benchmarks.md @@ -47,11 +47,8 @@ crashes. ### Benchmark specification -Nonius includes an imperative interface to specify benchmarks for execution, but -the declarative interface is much simpler. As of this writing the imperative -interface is still subject to change, so it won't be documented. - -The declarative interface consists of the `NONIUS_BENCHMARK` macro. This macro +Nonius includes a simple declarative interface to specify benchmarks for +execution. This declarative interface consists of the `NONIUS_BENCHMARK` macro. This macro expands to some machinery that registers the benchmark in a global registry that can be accessed by the standard runner. From a5d0eb33170e706e57e4d0cdabc559a7b8dd58a7 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Wed, 3 Jun 2015 16:59:04 +0200 Subject: [PATCH 15/21] Add information about new feature macros --- index.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/index.md b/index.md index e9f26df..acad332 100644 --- a/index.md +++ b/index.md @@ -31,7 +31,9 @@ are no guarantees. Newer versions of these compilers are also supported. The library depends on [Boost] for a few mathematical functions, for some string algorithms, and, in some versions of VC++, for the timing functions as well. Boost.Chrono is not a header-only library, but since it is only used with -VC++ everything gets linked automatically without intervention. +VC++ everything gets linked automatically without intervention. If desired, +usage of Boost.Chrono can be forced by #defining the macro +`NONIUS_USE_BOOST_CHRONO`. [Boost]: http://www.boost.org @@ -114,6 +116,11 @@ The runner includes all your benchmarks and it comes equipped with four reporters: plain text, CSV with raw timings, JUnit-compatible XML, and an HTML file with a scatter plot of the timings. If you execute the runner without requesting a particular reporter, it will use plain text to report the results. +When compiling you can selectively disable any or all of the extra reporters +by #defining some macros before #including the runner. +`NONIUS_DISABLE_EXTRA_REPORTERS` disables everything but plain text; +`NONIUS_DISABLE_X_REPORTER`, where `X` is one of `CSV`, `JUNIT`, or `HTML` +disables a particular reporter. The first thing that nonius does when running is testing the clock. By default it uses the clock provided by `std::chrono::high_resolution_clock`. The runner From e0d320f442f5a776889e2f76f4fdfbed8edc0aba Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 4 Jun 2015 13:10:33 +0200 Subject: [PATCH 16/21] Minor doc tweaks --- _layouts/default.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_layouts/default.html b/_layouts/default.html index aa3faa9..f8da822 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -10,7 +10,7 @@ - Nonius by rmartinho + Nonius @@ -19,7 +19,7 @@

Nonius

-

A C++ benchmarking framework

+

A C++ micro-benchmarking framework


@@ -29,7 +29,7 @@

A C++ benchmarking framework

From d12bcb6d3f03aa182a010363e36f190caecc4608 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 4 Jun 2015 13:12:13 +0200 Subject: [PATCH 17/21] Docs title change --- _layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index f8da822..cb286bf 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -10,7 +10,7 @@ - Nonius + Nonius: statistics-powered micro-benchmarking framework From 2ae3deff066748b0c08760e447521a228e4f3d84 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 4 Jun 2015 13:15:00 +0200 Subject: [PATCH 18/21] Mention disabling of html reporter in license section --- index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.md b/index.md index acad332..7367398 100644 --- a/index.md +++ b/index.md @@ -202,7 +202,8 @@ on it as I am allowed. However, currently nonius makes use of some code distributed under the [CC-BY-NC] and the [MIT] licenses. The `html` reporter uses the [Highcharts JS] and [jQuery] libraries for the interactive charts and the [cpptemplate] library -for generating HTML from a template. +for generating HTML from a template. If you want to use only the public domain +code for whatever reason, you can disable the `html` reporter easily. [CC-BY-NC]: http://creativecommons.org/licenses/by-nc/3.0/ [MIT]: https://bitbucket.org/ginstrom/cpptemplate/raw/d4263ca998038f7ae18aeb9d2358f0c11f00552d/LICENSE.txt From 5cc62c338bf928819113d600a4322fc396382446 Mon Sep 17 00:00:00 2001 From: Martinho Fernandes Date: Thu, 25 Jun 2015 16:36:37 +0200 Subject: [PATCH 19/21] Add favicon to docs --- _layouts/default.html | 1 + favicon.png | Bin 0 -> 35150 bytes 2 files changed, 1 insertion(+) create mode 100644 favicon.png diff --git a/_layouts/default.html b/_layouts/default.html index cb286bf..5be426e 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -4,6 +4,7 @@ + diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..165e30c011ecc57755937167b1c34206bb4ee041 GIT binary patch literal 35150 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

rJY42N1TKM|qC%-e+5mBdG|cJ2j^AEN&+VNx*I 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

jAL5Gf6TyvQaS`cp;ybnt$^ObI?VCH0NxAkzSea zJ-;vI`)y%@&w1Jafb6n#b66w_8daylcl?V9-dNP%salngYSgZ0(ND9%wuS8j5Q?K8Wh6ftINHFOW1fQgE?M9cK+>rd=Dv z5K%FegaU5oJ%aY_A*<&UC#+PxrDX7UX|O<&_p*Q0bNFfK zsN-^=3iwOAp?9tf-v<||Xkg9S;PpcTr77mAe%ZHyO*p**DXiX0$qs~UR`o*%xtF2! zacY;nV7pEZ%i?D!BO33b!6~S7{DrffFv`n^Y1Eu~{WkK_B!2Jp#%k;dE_OzmV~iKesXJw(`6sY--*0wJ z1(c#0stC~?2B*X_64JZ=2`0sP6*6>l7l&h3V7==)(8Ly)o-74Is{E;ADWO4 zFqilgh7iNh7&g`PdoH>@cBv&unjTa4=_FR+Tjwtj$? zV>$R*AmN7Wp)gI`3~xZi7ZNJ)n+Acwr||lEg^()5ROp1wH$M^NO5V|YXhooR9hW9l8p8sj-aBp{k4b`rw=MMTU-V4Thcd|)BHnE>16)8)7Sr!f!g54XJ`XN17KTVS zAw!~k1-|fSiNX9{j5WFuV62k0_O(U z`N!EoHs!YLZHTl4?K}Ey-{~ZuZewLJfnvy80;CiD5{V)7Ha&9jd9}R-CzKOo zc_z|r8fy41QMUxb!ZW~R%!ITHuC^c#eZ@x0r2SLD4A20jjp&uvi3917c{{YjGL7wp zw|mDeNW07Tmo9!~6tOiI4fzg?gt5^|!k>FeeCi%jBp15_8D3B!sT&Tj)puQZsAn=k zYN-4Tb}x81x^HLDv@GNI47}*zP1jQnupgHj`S*^_zLOG=SLPog+gEX zXw;;jRPV)2NSr65W8*C@+!2F^ZfRl`KcmZwBJ>(`#6ZC^8CJ(eiN~So0UNaIDqs)C zAz)*R?Z26x2xcAOM;Q57F$JpAUj+wPKOc@)PNB;}N=j-}SPK1-qq9O%i>XTRG~x@H?3k zW>ALRNysN%M`|*VXWQut0brO=L;S@3j{zmRU`L$u>B$SM6(tmE%)aS_=j>YZpaMOb zyUxy(8+EUeDEQ|m95U*+780goxe+I4Cr0 zPcGSJb$~_+XjA(S}gGYpyNSXWj6K!?T){uB=z?5JDSVti+JO#GBFRM$O|<) z*Ah?##|cUWODXpGgz5%n$b}%n*Sd^{QT3Et(=Xj{RpP^sHnbFYPJMh>SGjQ(jxh=K zkJAryhX?v|(WR6=w>$TH7sgy|7laq#hmCc1F3uxi%Xr|7lK#^gm+(lJg%t<8?NbP)nSuFRU-v-~ll<;x-W^VM)MLK=^ zTnJZhKUWEarzuffY6%MHKn+#!z%~lD*y5+Q|K=!IXl0&o*9LLVy*uPZaPdFYO~|xv z{4;XEV$|t#TC4Hmh6v6jdp+UhLDzufrH&y%H2fimdc7gW@E;f1M;T!t6I{BT^AddZ zb0F%4h35zS!pUr2h6_ydxwTJ^LZ4%;#DG|kYg033*NhA()CX%taRNWjrg>VhDOd$L zL{;<|^}KtlC5nOX#YCj`Y)9!2l4p}1Zh(@C@`UZ3XWRMOOQx%su3TV-BxYHLB#EG# zq{`Z3r(`AbVcem7r?l|rh_}2SNxj>@C>d(Z;tq%DzU`3e-hMTaa|Ro8HC636voXS< z)8st6O9H6e(i_JDBY9AuEf&Zo)LyTQ=`4XXL#Y_)x7d@?55%ICEN)d1{NKzbT3>uH zOHHmgo#Z$u69$ojIhb}3?aFcK{#Y?@!9We#j3{7t$}4d1s{C)`iLS90`iqRj5Llob z%4D|Q=-&RM`_Du(^m1RwZuatztN24NYu6ibLr*)zC8*0+$R#$CY^w57+Hv@H)01Zh zHbo`q^rkEf@%T-UrazaR_{NigIIJ>p`Z@eJ7Gn*OZX}?j_~XIVW3K*{K^3gft)^4U z^z1u@K=U2E`ou7CQpr>qPxC!Xu5PQn=CWR@t^LV;x4ED&BcwB1y-jEpK7#H|lE$yb zSAydtt=BgoWYwxB3xoxu)!JEB&T)}PUJeQ-<(d0HM|C!7jIW{H$@~)H4-cHJIg;whBlq?Bjt78Uk8gS8C=xj>)M;fwU5m~| z&3v1BF(3#6%vygMiMSa1X>6+TjDS_nn+AfT;a}_D+$9XLpU362r^%35o#bWOZ;V*n`w9?6oq0z{yzzn z>&@k1^SY#hPu#%3jVT^!Po<3tgr+|JHd9bJldHGvB-RQZ&4vG*QyPu z6C6pHkotZpeeOJf8McwIq|!CR+#^`BO$k@?ENZ3$^Xwl>GJxJ;d_WD~LryTLl%`d9 zniVQx{=!sY!xg=y2k14wfc36Kph@EXZvSD@U<3l;wc@t$mxOg!fRZjJ7{GRT;qjY0cAej8y4gj#s zXYw*y0Rv~u*7S-X)Mi5ZhKRQ`EyBpZex8eFcKp~@eYbiSF!%q*h(WFg>9nznt;%KH z>3%?I`ljf08xUkgKQTY?ZxBq;($Vpj1%xm^lzMMdqs5GLn+*Ct`bx6shB1kOVDP`N zET?$+=9|MbLWtYr}>O)1~83)dz6Gw8=v?&hZ zs%qhd`4Ip0kc8Buq7r3NQDI^$@^3!j>4@Wy$g=X~u@)iBo}4au)uRN$9GpeQc-3rF zWAm}bQ{~Yu`U^ z*I}4l*x3hiMz%|yJ|dE(#0)AN53n`8GYF?`;Mu$aPkVo05JI@V_k&X^JbZLu^-0iL z!Jbw|_NAe)^~3y}X#O^s90+O^*ccUpcnG?{lpSm^8`k0fi^=HEBJ=vI z=-%sZH+kXMbRub#txH5^dKBG>sADGr}oKJzKih;gXTZ0^X2`dm}VcN_=270$P0O}5tr!X z3qPVm=S`KVkvDIk{Yg>{3h0{5z_-$v7*jx&-U9f452E{1@u`>(i*F6_!NEjuPoP=; zcQ+9N_gOM8U2ZgTl4;udqTe)XnL1loU$PmtHjxb0$-R5E^IB&636rSEVR+PGzEauC zp2oo)&C9d3mx_D&9L@~bqBvcN##%JOLXq1~y~HlN?=?Z(5cUwxW3vtlz^_KGGkC!wJYmoeq6&x5s;wmG#2QLlIEyYZk^wG+!}- z@u90r9M@v$I|e)13ya*gBz|kqmO<9~mP;SptuLsWV zfHO9i#zR1@@7Oq77?)c01aiP%@7ixVkD99Kg}d>*A*+Q(|l|!Z-+OA zo7PV?+RBMYZajzhV=ec@V4mDelyy0Y#43U{m%U)NYfl=2NWC}-p_006VQQ!g_c!`tiAjgVZ^V*#a zp#!N6ss7FaV^7T#Hm znkEMq^IHq>&P6O3c^BUa-7NeE)l6}E@W78@$_<<@ z8}SX^D0F}m?JqQlAGYea50p0-b?L!a!QbU^Wy>*W5A#G)rdb#sE~7o)&>uus)Pd0_ z0-WKsP|>@>ZbU-vhUD=SiduO#eQ@YODHsnHl?u3IM$9X&G8fgqpQJSlA@4fdTfOTl z;#QyBU1p0(j!TCFb$X4b_F~mgj1sh;)vGtXv z!I&qW;t_|D@-G*i`{^s;y^F3r6}s~IIC9*6^Y+Qc`QWnTJUM&17kQDeaDUD}hBC}sAug?7Ra#ZSt2d0Wz`)eXj zIhwQ&%(HsbJA95$i#`}j@BmAqSphb8aYv`dM!EaxDL%Bx-my`Rm7KO1iiuTWn(sK1Z>u&*bq*Y`}Vv0~NV{d;{1eXEgvo4^*w z=VS!%mXITMy@cCpa^cr>PR9=M`=RCv#TBvOA`1hX+>-jVA5m_)f8Gz4t}Cdpe^3k2 z2Y-UF{$?fad1}*w$n=$-(xBh_%U`zD74!UCP2?qOrj>diNv`)Z>eo-x=84=lUbjQr zMUzV&W Date: Thu, 25 Jun 2015 17:14:53 +0200 Subject: [PATCH 20/21] Favicon update --- favicon.png | Bin 35150 -> 32062 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/favicon.png b/favicon.png index 165e30c011ecc57755937167b1c34206bb4ee041..10066d93b4391da470a1ada4b19584a760983c08 100644 GIT binary patch literal 32062 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 TNC{ojxqTZTbYAU2yMK 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 literal 35150 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

rJY42N1TKM|qC%-e+5mBdG|cJ2j^AEN&+VNx*I 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

jAL5Gf6TyvQaS`cp;ybnt$^ObI?VCH0NxAkzSea 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 Date: Mon, 12 Oct 2015 19:21:44 +0200 Subject: [PATCH 21/21] Moved to doc folder --- {_layouts => doc/_layouts}/default.html | 0 .../authoring-benchmarks.md | 0 {css => doc/css}/print.css | 0 {css => doc/css}/pygment_trac.css | 0 {css => doc/css}/stylesheet.css | 0 favicon.png => doc/favicon.png | Bin {images => doc/images}/body-bg.png | Bin {images => doc/images}/highlight-bg.jpg | Bin {images => doc/images}/hr.png | Bin index.md => doc/index.md | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename {_layouts => doc/_layouts}/default.html (100%) rename authoring-benchmarks.md => doc/authoring-benchmarks.md (100%) rename {css => doc/css}/print.css (100%) rename {css => doc/css}/pygment_trac.css (100%) rename {css => doc/css}/stylesheet.css (100%) rename favicon.png => doc/favicon.png (100%) rename {images => doc/images}/body-bg.png (100%) rename {images => doc/images}/highlight-bg.jpg (100%) rename {images => doc/images}/hr.png (100%) rename index.md => doc/index.md (100%) diff --git a/_layouts/default.html b/doc/_layouts/default.html similarity index 100% rename from _layouts/default.html rename to doc/_layouts/default.html diff --git a/authoring-benchmarks.md b/doc/authoring-benchmarks.md similarity index 100% rename from authoring-benchmarks.md rename to doc/authoring-benchmarks.md diff --git a/css/print.css b/doc/css/print.css similarity index 100% rename from css/print.css rename to doc/css/print.css diff --git a/css/pygment_trac.css b/doc/css/pygment_trac.css similarity index 100% rename from css/pygment_trac.css rename to doc/css/pygment_trac.css diff --git a/css/stylesheet.css b/doc/css/stylesheet.css similarity index 100% rename from css/stylesheet.css rename to doc/css/stylesheet.css diff --git a/favicon.png b/doc/favicon.png similarity index 100% rename from favicon.png rename to doc/favicon.png diff --git a/images/body-bg.png b/doc/images/body-bg.png similarity index 100% rename from images/body-bg.png rename to doc/images/body-bg.png diff --git a/images/highlight-bg.jpg b/doc/images/highlight-bg.jpg similarity index 100% rename from images/highlight-bg.jpg rename to doc/images/highlight-bg.jpg diff --git a/images/hr.png b/doc/images/hr.png similarity index 100% rename from images/hr.png rename to doc/images/hr.png diff --git a/index.md b/doc/index.md similarity index 100% rename from index.md rename to doc/index.md