| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | /* * * Copyright 2015, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * *     * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. *     * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. *     * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */'use strict';var grpc = require('..');var testProto = grpc.load(__dirname + '/../interop/test.proto').grpc.testing;var _ = require('lodash');var interop_server = require('../interop/interop_server.js');function runTest(iterations, callback) {  var testServer = interop_server.getServer(0, false);  testServer.server.listen();  var client = new testProto.TestService('localhost:' + testServer.port,                                         grpc.Credentials.createInsecure());  function runIterations(finish) {    var start = process.hrtime();    var intervals = [];    function next(i) {      if (i >= iterations) {        testServer.server.shutdown();        var totalDiff = process.hrtime(start);        finish({          total: totalDiff[0] * 1000000 + totalDiff[1] / 1000,          intervals: intervals        });      } else{        var deadline = new Date();        deadline.setSeconds(deadline.getSeconds() + 3);        var startTime = process.hrtime();        client.emptyCall({}, function(err, resp) {          var timeDiff = process.hrtime(startTime);          intervals[i] = timeDiff[0] * 1000000 + timeDiff[1] / 1000;          next(i+1);        }, {}, {deadline: deadline});      }    }    next(0);  }  function warmUp(num) {    var pending = num;    function startCall() {      client.emptyCall({}, function(err, resp) {        pending--;        if (pending === 0) {          runIterations(callback);        }      });    }    for (var i = 0; i < num; i++) {      startCall();    }  }  warmUp(100);}function percentile(arr, pct) {  if (pct > 99) {    pct = 99;  }  if (pct < 0) {    pct = 0;  }  var index = Math.floor(arr.length * pct / 100);  return arr[index];}if (require.main === module) {  var count;  if (process.argv.length >= 3) {    count = process.argv[2];  } else {    count = 100;  }  runTest(count, function(results) {    var sorted_intervals = _.sortBy(results.intervals, _.identity);    console.log('count:', count);    console.log('total time:', results.total, 'us');    console.log('median:', percentile(sorted_intervals, 50), 'us');    console.log('90th percentile:', percentile(sorted_intervals, 90), 'us');    console.log('95th percentile:', percentile(sorted_intervals, 95), 'us');    console.log('99th percentile:', percentile(sorted_intervals, 99), 'us');    console.log('QPS:', (count / results.total) * 1000000);  });}module.exports = runTest;
 |