js/src/parjs-benchmarks/util.js

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 DEFAULT_WARMUP = 10
     2 DEFAULT_MEASURE = 3
     3 MODE = MODE || "compare" // MODE is often set on the command-line by run.sh
     5 /**
     6  * label: for the printouts
     7  * w: warmup runs
     8  * m: measurement runs
     9  * seq: closure to compute sequentially
    10  * par: closure to compute in parallel
    11  */
    12 function benchmark(label, w, m, seq, par) {
    13   var SEQ = 1
    14   var PAR = 2
    15   var bits = 0
    16   if (MODE === "seq") { bits = SEQ; }
    17   else if (MODE === "par") { bits = PAR; }
    18   else {
    19     if (MODE !== "compare") {
    20       print("Invalid MODE, expected seq|par|compare: ", MODE);
    21     }
    22     bits = SEQ|PAR;
    23   }
    25   if (mode(SEQ)) {
    26     print("Warming up sequential runs");
    27     warmup(w, seq);
    29     print("Measuring sequential runs");
    30     var [seqTimes, seqResult] = measureN(m, seq);
    31   }
    33   if (mode(PAR)) {
    34     print("Warming up parallel runs");
    35     warmup(w, par);
    37     print("Measuring parallel runs");
    38     var [parTimes, parResult] = measureN(m, par);
    39   }
    41   if (mode(SEQ|PAR)) {
    42     // Check correctness
    43     print("Checking correctness");
    44     assertStructuralEq(seqResult, parResult);
    45   }
    47   if (mode(SEQ)) {
    48     var seqAvg = average(seqTimes);
    49     for (var i = 0; i < seqTimes.length; i++)
    50       print(label + " SEQUENTIAL MEASUREMENT " + i + ": " + seqTimes[i]);
    51     print(label + " SEQUENTIAL AVERAGE: " + seqAvg);
    52   }
    54   if (mode(PAR)) {
    55     var parAvg = average(parTimes);
    56     for (var i = 0; i < parTimes.length; i++)
    57       print(label + " PARALLEL MEASUREMENT " + i + ": " + parTimes[i]);
    58     print(label + " PARALLEL AVERAGE  : " + parAvg);
    59   }
    61   if (mode(SEQ|PAR)) {
    62     print(label + " SEQ/PAR RATIO     : " + seqAvg/parAvg);
    63     print(label + " PAR/SEQ RATIO     : " + parAvg/seqAvg);
    64     print(label + " IMPROVEMENT       : " +
    65           (((seqAvg - parAvg) / seqAvg * 100.0) | 0) + "%");
    66   }
    68   function mode(m) {
    69     return (bits & m) === m;
    70   }
    71 }
    73 function measure1(f) {
    74   var start = new Date();
    75   result = f();
    76   var end = new Date();
    77   return [end.getTime() - start.getTime(), result];
    78 }
    80 function warmup(iters, f) {
    81   for (var i = 0; i < iters; i++) {
    82     print(".");
    83     f();
    84   }
    85 }
    87 function average(measurements) {
    88   var sum = measurements.reduce(function (x, y) { return x + y; });
    89   return sum / measurements.length;
    90 }
    92 function measureN(iters, f) {
    93   var measurement, measurements = [];
    94   var result;
    96   for (var i = 0; i < iters; i++) {
    97     [measurement, result] = measure1(f);
    98     measurements.push(measurement);
    99   }
   101   return [measurements, result];
   102 }
   104 function assertStructuralEq(e1, e2) {
   105     if (e1 instanceof ParallelArray && e2 instanceof ParallelArray) {
   106       assertEqParallelArray(e1, e2);
   107     } else if (typeof(RectArray) != "undefined" &&
   108                e1 instanceof ParallelArray && e2 instanceof RectArray) {
   109       assertEqParallelArrayRectArray(e1, e2);
   110     } else if (typeof(RectArray) != "undefined" &&
   111                e1 instanceof RectArray && e2 instanceof ParallelArray) {
   112       assertEqParallelArrayRectArray(e2, e1);
   113     } else if (typeof(WrapArray) != "undefined" &&
   114                e1 instanceof ParallelArray && e2 instanceof WrapArray) {
   115       assertEqParallelArrayWrapArray(e1, e2);
   116     } else if (typeof(WrapArray) != "undefined" &&
   117                e1 instanceof WrapArray && e2 instanceof ParallelArray) {
   118       assertEqParallelArrayWrapArray(e2, e1);
   119     } else if (e1 instanceof Array && e2 instanceof ParallelArray) {
   120       assertEqParallelArrayArray(e2, e1);
   121     } else if (e1 instanceof ParallelArray && e2 instanceof Array) {
   122       assertEqParallelArrayArray(e1, e2);
   123     } else if (typeof(RectArray) != "undefined" &&
   124                e1 instanceof RectArray && e2 instanceof RectArray) {
   125       assertEqRectArray(e1, e2);
   126     } else if (typeof(WrapArray) != "undefined" &&
   127                e1 instanceof WrapArray && e2 instanceof WrapArray) {
   128       assertEqWrapArray(e1, e2);
   129     } else if (e1 instanceof Array && e2 instanceof Array) {
   130       assertEqArray(e1, e2);
   131     } else if (e1 instanceof Object && e2 instanceof Object) {
   132       assertEq(e1.__proto__, e2.__proto__);
   133       for (prop in e1) {
   134         if (e1.hasOwnProperty(prop)) {
   135           assertEq(e2.hasOwnProperty(prop), true);
   136           assertStructuralEq(e1[prop], e2[prop]);
   137         }
   138       }
   139     } else {
   140       assertEq(e1, e2);
   141     }
   142 }
   144 function assertEqParallelArrayRectArray(a, b) {
   145   assertEq(a.shape.length, 2);
   146   assertEq(a.shape[0], b.width);
   147   assertEq(a.shape[1], b.height);
   148   for (var i = 0, w = a.shape[0]; i < w; i++) {
   149     for (var j = 0, h = a.shape[1]; j < h; j++) {
   150       assertStructuralEq(a.get(i,j), b.get(i,j));
   151     }
   152   }
   153 }
   155 function assertEqParallelArrayWrapArray(a, b) {
   156   assertEq(a.shape.length, 2);
   157   assertEq(a.shape[0], b.width);
   158   assertEq(a.shape[1], b.height);
   159   for (var i = 0, w = a.shape[0]; i < w; i++) {
   160     for (var j = 0, h = a.shape[1]; j < h; j++) {
   161       assertStructuralEq(a.get(i,j), b.get(i,j));
   162     }
   163   }
   164 }
   166 function assertEqParallelArrayArray(a, b) {
   167   assertEq(a.shape.length, 1);
   168   assertEq(a.length, b.length);
   169   for (var i = 0, l = a.shape[0]; i < l; i++) {
   170     assertStructuralEq(a.get(i), b[i]);
   171   }
   172 }
   174 function assertEqRectArray(a, b) {
   175   assertEq(a.width, b.width);
   176   assertEq(a.height, b.height);
   177   for (var i = 0, w = a.width; i < w; i++) {
   178     for (var j = 0, h = a.height; j < h; j++) {
   179       assertStructuralEq(a.get(i,j), b.get(i,j));
   180     }
   181   }
   182 }
   184 function assertEqWrapArray(a, b) {
   185   assertEq(a.width, b.width);
   186   assertEq(a.height, b.height);
   187   for (var i = 0, w = a.width; i < w; i++) {
   188     for (var j = 0, h = a.height; j < h; j++) {
   189       assertStructuralEq(a.get(i,j), b.get(i,j));
   190     }
   191   }
   192 }
   194 function assertEqArray(a, b) {
   195   assertEq(a.length, b.length);
   196   for (var i = 0, l = a.length; i < l; i++) {
   197     assertStructuralEq(a[i], b[i]);
   198   }
   199 }
   201 function assertEqParallelArray(a, b) {
   202   assertEq(a instanceof ParallelArray, true);
   203   assertEq(b instanceof ParallelArray, true);
   205   var shape = a.shape;
   206   assertEqArray(shape, b.shape);
   208   function bump(indices) {
   209     var d = indices.length - 1;
   210     while (d >= 0) {
   211       if (++indices[d] < shape[d])
   212         break;
   213       indices[d] = 0;
   214       d--;
   215     }
   216     return d >= 0;
   217   }
   219   var iv = shape.map(function () { return 0; });
   220   do {
   221     var e1 = a.get.apply(a, iv);
   222     var e2 = b.get.apply(b, iv);
   223     assertStructuralEq(e1, e2);
   224   } while (bump(iv));
   225 }

mercurial