perftest/insert.js (156 lines of code) (raw):
/*
Copyright (c) 2013, Oracle and/or its affiliates. All rights
reserved.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA
*/
'use strict';
var mynode = require(".."),
random = require("../samples/ndb_loader/lib/RandomData"),
udebug = require("../Adapter/api/unified_debug"),
stats = require("../Adapter/api/stats");
function usage() {
var msg = "" +
"Usage: node insert [options]\n" +
" -d : Enable debug output\n" +
" -l : Test latency\n" +
" -t : Test throughput\n" +
" -f : Test find()\n" +
" -n : Use ndb adapter (default)\n" +
" -m : Use mysql adapter\n"
;
console.log(msg);
process.exit(1);
}
function parse_command_line(options) {
var i, len, val;
len = process.argv.length;
for(i = 2 ; i < len; i++) {
val = process.argv[i];
switch(val) {
case '-d':
udebug.level_debug();
break;
case '-t':
options.mode = "throughput";
break;
case '-l':
options.mode = "latency";
break;
case '-f':
options.mode = "find";
break;
case '-n':
options.adapter = "ndb";
break;
case '-m':
options.adapter = "mysql";
break;
default:
usage();
}
}
}
function Row() {
}
function getIntervalTimer() {
var time = Date.now();
console.log("Interval timer initialized.");
return function interval(description) {
var current = Date.now();
var result = current - time;
console.log(description, " Interval: ", result, "ms.");
time = current;
return result;
}
}
function doThroughputTest(error, session, batchSize, timeInterval) {
function onDone(error) {
stats.peek();
var r = timeInterval("Batch completed.");
console.log("Avg. Latency", r / batchSize, "ms. per operation");
console.log("Throughput", (batchSize * 10000) / r, " rows per sec.");
}
function onRowInserted(error, mystery) {
if(error) { console.log(error, mystery); }
}
function doBatchInsert(rdg) {
timeInterval("Starting batch.");
var batch = session.createBatch();
var i = 0;
var row;
for (; i < batchSize ; i++) {
row = rdg.newRow();
batch.persist("a", row, onRowInserted);
}
batch.execute(onDone);
}
function onTable(err, metadata) {
var generator = new random.RandomRowGenerator(metadata);
doBatchInsert(generator);
}
/* doBatchInsert starts here */
session.getTableMetadata("jscrund", "a", onTable);
}
function doSingleInserts(error, session, count, timeInterval) {
var n = 0;
var generator;
function onRowInserted(error) {
n += 1;
var row = generator.newRow();
var r;
if(n >= count) {
r = timeInterval("Inserts completed.");
console.log("Avg. Latency", r / count, "ms. per operation");
console.log("Throughput", (count * 10000) / r, " rows per sec.");
}
else {
session.persist("a", row, onRowInserted);
}
}
function onTable(err, metadata) {
generator = new random.RandomRowGenerator(metadata);
var row = generator.newRow();
timeInterval("Starting Inserts.");
session.persist("a", row, onRowInserted);
}
/* doSingleInserts starts here */
session.getTableMetadata("jscrund", "a", onTable);
}
function doFindTest(err, session, count, timeInterval) {
var n = 0;
function onRowFound(error, data) {
n += 1;
var key = Math.floor(Math.random() * count);
if(n >= count) {
var r = timeInterval("Find completed.");
console.log("Avg. Latency", r / count, "ms. per operation");
console.log("Throughput", (count * 10000) / r, " rows per sec.");
}
else {
session.find("a", key, onRowFound);
}
}
function onTable(err, metadata) {
var key = Math.floor(Math.random() * count);
timeInterval("Starting find.");
session.find("a", key, onRowFound);
}
/* doFindTest() starts here */
session.getTableMetadata("jscrund", "a", onTable);
}
function main() {
var options = { /* Default options: */
"adapter" : "ndb"
};
parse_command_line(options);
var tm = new mynode.TableMapping("a").applyToClass(Row);
var intervalTimer = getIntervalTimer();
properties.database = "jscrund";
properties.mysql_user = "root";
switch(options.mode) {
case "throughput":
mynode.openSession(properties, null, doThroughputTest, 4000, intervalTimer);
break;
case "latency":
mynode.openSession(properties, null, doSingleInserts, 4000, intervalTimer);
break;
case "find":
mynode.openSession(properties, null, doFindTest, 4000, intervalTimer);
break;
default:
usage();
}
}
main();