|
var dbName = 'http://localhost:5984/couch-test', |
|
nDocs = 10000, |
|
batchSize = 1000, |
|
scrapFactor = 0, |
|
docs = [], |
|
testQuery = 'entries/sumTime', |
|
destroyDb = false, |
|
_log = console.log, |
|
db; |
|
|
|
console.log = function() { |
|
var e = document.getElementById('log'), |
|
i; |
|
|
|
for (i = 0; i < arguments.length; i++) { |
|
e.innerHTML = e.innerHTML + arguments[i] + '\n'; |
|
} |
|
|
|
_log.apply(console, arguments); |
|
}; |
|
|
|
function setUp() { |
|
db = new PouchDB({name:dbName}); |
|
} |
|
|
|
function tearDown() { |
|
if (destroyDb) { |
|
db.destroy(function(err, info) { |
|
if (err) { |
|
console.log(err); |
|
} |
|
}); |
|
} else { |
|
db.bulkDocs({docs: docs.map(function(d) { return {_id: d.id, _rev: d.rev, _deleted: true}; })}); |
|
} |
|
} |
|
|
|
function range(lo, hi) { |
|
var r = [], |
|
i; |
|
for (i = lo; i < hi; i++) { |
|
r.push(i); |
|
} |
|
return r; |
|
} |
|
|
|
function time(fn, times, sequential) { |
|
var i, |
|
start = Date.now(), |
|
result; |
|
|
|
function logStats() { |
|
var t = Date.now() - start; |
|
console.log(fn.name + ': ' + t + ' ms, ' + (t / times) + ' ms/run.'); |
|
} |
|
|
|
if (!sequential){ |
|
result = new Promise(function(resolve, reject) { |
|
Promise.all(range(0, times).map(fn)). |
|
then(function() { |
|
logStats(); |
|
resolve(); |
|
}, function(err) { |
|
reject(err); |
|
}); |
|
}); |
|
} else { |
|
result = new Promise(function(resolve, reject) { |
|
function next(i) { |
|
if (i < times) { |
|
fn(i). |
|
then(function() { next(i + 1); }). |
|
catch(reject); |
|
} else { |
|
logStats(); |
|
resolve(); |
|
} |
|
} |
|
|
|
next(0); |
|
}); |
|
} |
|
|
|
return result; |
|
} |
|
|
|
function createScrap(n) { |
|
return Promise.all(range(0, Math.ceil(n / batchSize)).map(function(i) { |
|
return db.bulkDocs({ |
|
docs: range(i * batchSize, Math.min((i + 1) * batchSize, n)).map(function(j) { |
|
return { |
|
type: 'scrap', |
|
data: j |
|
}; |
|
}) |
|
}); |
|
})); |
|
} |
|
|
|
function createDocuments(i) { |
|
var activities = [ |
|
'Planering', 'Möte', 'Sprängning', 'Grävarbete', |
|
'Transport' |
|
], |
|
projects = [ |
|
'Lilla Torget', 'Västlänken', 'Kruthusgatan' |
|
], |
|
customers = [ |
|
'Skanska', 'Sweco', 'ÅF', 'Privat' |
|
], |
|
descriptions = [ |
|
'', '', '', 'Kunden galen', 'Grus i maskineriet', 'OBS! Fakturera först nästa månad' |
|
], |
|
entries = range(0, batchSize).map(function() { |
|
return { |
|
type: 'entry', |
|
activity: activities[i % activities.length], |
|
referencenumber: i % projects.length, |
|
project: projects[i % projects.length], |
|
customer: customers[i % customers.length], |
|
time: (((i % 9) + '').replace(/,/g, '.') * 1), |
|
description: descriptions[i % descriptions.length], |
|
date: new Date(i * 86400) |
|
}; |
|
}); |
|
|
|
return db.bulkDocs({docs: entries}, function(err, response) { |
|
var i; |
|
if (response) { |
|
for (i = response.length - 1; i >= 0; i--) { |
|
docs.push({id: response[i].id, rev: response[i].rev}); |
|
} |
|
} |
|
}); |
|
} |
|
|
|
function getDocuments() { |
|
var id = docs[Math.floor(Math.random() * docs.length)].id; |
|
return db.get(id, function(err, response) { |
|
if (err) { |
|
console.log(err); |
|
} |
|
}); |
|
} |
|
|
|
function query(i) { |
|
return db.query(testQuery, |
|
function(err, response) { |
|
if (err) { |
|
console.log(err); |
|
} |
|
}); |
|
} |
|
|
|
console.log('Pouch-Couch Benchmark'); |
|
console.log('====================='); |
|
console.log(dbName); |
|
console.log('nDocs: ' + nDocs + ', scrap: ' + nDocs * scrapFactor); |
|
|
|
setUp(); |
|
|
|
createScrap(nDocs * scrapFactor). |
|
then(function() { return time(createDocuments, nDocs / batchSize); }). |
|
then(function() { return time(getDocuments, 1000); }). |
|
then(function() { return time(query, 1000, true); }, function(err) { |
|
console.log(err); |
|
}). |
|
then(tearDown). |
|
catch(function(e) { console.log(e); tearDown(); }); |
What do these numbers represent? Is it milliseconds, seconds, minutes?