Skip to content
This repository has been archived by the owner on Sep 30, 2023. It is now read-only.

tests: add benchmarks for log.values, log.has(), log.get() #137

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletions benchmarks/benchmark-get-plus.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
'use strict'

const Log = require('../src/log')
const IPFS = require('ipfs')
const IPFSRepo = require('ipfs-repo')
const DatastoreLevel = require('datastore-level')

// State
let ipfs
let log

// Metrics
let totalQueries = 0
let seconds = 0
let queriesPerSecond = 0
let lastTenSeconds = 0

let entry
let immediate

let waveCount = 0
let waveLength = 10 // seconds
let waveDepth = parseInt(process.argv[2], 10) || 10000

let addEntries = async () => {
for (let i=0; i<waveDepth; i++) {
await log.append(`Hello World: ${i}`)
}

// choose random entry
entry = log.values[Math.floor(Math.random() * log.values.length)]

console.log(`=== Running wave #${waveCount} for ${waveLength} seconds with ${log.values.length} entries ===`)
}

const queryLoop = async () => {
log.get(entry.hash)
totalQueries++
lastTenSeconds++
queriesPerSecond++
immediate = setImmediate(queryLoop)
}

let run = (() => {
console.log('Starting benchmark...')

const repoConf = {
storageBackends: {
blocks: DatastoreLevel
}
}

ipfs = new IPFS({
repo: new IPFSRepo('./ipfs-log-benchmarks/ipfs', repoConf),
start: false,
EXPERIMENTAL: {
pubsub: false,
sharding: false,
dht: false,
},
})

ipfs.on('error', (err) => {
console.error(err)
})

ipfs.on('ready', async () => {
// Create a log
log = new Log(ipfs, 'A')

await addEntries()

const nextWave = async () => {
//reset counters
totalQueries = 0
seconds = 0
queriesPerSecond = 0
lastTenSeconds = 0

waveCount++
await addEntries()

interval = setInterval(outputMetrics, 1000)
immediate = setImmediate(queryLoop)
}

const outputMetrics = () => {
seconds++

console.log(`${queriesPerSecond} queries per second, ${totalQueries} queries in ${seconds} seconds (Entry count: ${log.values.length})`)
queriesPerSecond = 0

if (seconds % waveLength === 0) {
console.log(`--> Average of ${lastTenSeconds / 10} q/s in this wave`)
if (lastTenSeconds === 0) throw new Error('Problems!')
lastTenSeconds = 0
clearImmediate(immediate)
clearInterval(interval)
nextWave()
}
}

// Output metrics at 1 second interval
let interval = setInterval(outputMetrics, 1000)
immediate = setImmediate(queryLoop)
})
})()

module.exports = run
73 changes: 73 additions & 0 deletions benchmarks/benchmark-get.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
'use strict'

const Log = require('../src/log')
const IPFS = require('ipfs')
const IPFSRepo = require('ipfs-repo')
const DatastoreLevel = require('datastore-level')

// State
let ipfs
let log

// Metrics
let totalQueries = 0
let seconds = 0
let queriesPerSecond = 0
let lastTenSeconds = 0

let entry

const queryLoop = async () => {
log.get(entry.hash)
totalQueries++
lastTenSeconds++
queriesPerSecond++
setImmediate(queryLoop)
}

let run = (() => {
console.log('Starting benchmark...')

const repoConf = {
storageBackends: {
blocks: DatastoreLevel
}
}

ipfs = new IPFS({
repo: new IPFSRepo('./ipfs-log-benchmarks/ipfs', repoConf),
start: false,
EXPERIMENTAL: {
pubsub: false,
sharding: false,
dht: false,
},
})

ipfs.on('error', (err) => {
console.error(err)
})

ipfs.on('ready', async () => {
// Create a log
log = new Log(ipfs, 'A')

entry = await log.append('Hello World')

// Output metrics at 1 second interval
setInterval(() => {
seconds++
if (seconds % 10 === 0) {
console.log(`--> Average of ${lastTenSeconds / 10} q/s in the last 10 seconds`)
if (lastTenSeconds === 0) throw new Error('Problems!')
lastTenSeconds = 0
}
console.log(`${queriesPerSecond} queries per second, ${totalQueries} queries in ${seconds} seconds (Entry count: ${log.values.length})`)
queriesPerSecond = 0
}, 1000)

setImmediate(queryLoop)
})
})()

module.exports = run
109 changes: 109 additions & 0 deletions benchmarks/benchmark-has-plus.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
'use strict'

const Log = require('../src/log')
const IPFS = require('ipfs')
const IPFSRepo = require('ipfs-repo')
const DatastoreLevel = require('datastore-level')

// State
let ipfs
let log

// Metrics
let totalQueries = 0
let seconds = 0
let queriesPerSecond = 0
let lastTenSeconds = 0

let entry
let immediate

let waveCount = 0
let waveLength = 10 // seconds
let waveDepth = parseInt(process.argv[2], 10) || 10000

let addEntries = async () => {
for (let i=0; i<waveDepth; i++) {
await log.append(`Hello World: ${i}`)
}

// choose random entry
entry = log.values[Math.floor(Math.random() * log.values.length)]

console.log(`=== Running wave #${waveCount} for ${waveLength} seconds with ${log.values.length} entries ===`)
}

const queryLoop = async () => {
log.has(entry.hash)
totalQueries++
lastTenSeconds++
queriesPerSecond++
immediate = setImmediate(queryLoop)
}

let run = (() => {
console.log('Starting benchmark...')

const repoConf = {
storageBackends: {
blocks: DatastoreLevel
}
}

ipfs = new IPFS({
repo: new IPFSRepo('./ipfs-log-benchmarks/ipfs', repoConf),
start: false,
EXPERIMENTAL: {
pubsub: false,
sharding: false,
dht: false,
},
})

ipfs.on('error', (err) => {
console.error(err)
})

ipfs.on('ready', async () => {
// Create a log
log = new Log(ipfs, 'A')

await addEntries()

const nextWave = async () => {
//reset counters
totalQueries = 0
seconds = 0
queriesPerSecond = 0
lastTenSeconds = 0

waveCount++
await addEntries()

interval = setInterval(outputMetrics, 1000)
immediate = setImmediate(queryLoop)
}

const outputMetrics = () => {
seconds++

console.log(`${queriesPerSecond} queries per second, ${totalQueries} queries in ${seconds} seconds (Entry count: ${log.values.length})`)
queriesPerSecond = 0

if (seconds % waveLength === 0) {
console.log(`--> Average of ${lastTenSeconds / 10} q/s in this wave`)
if (lastTenSeconds === 0) throw new Error('Problems!')
lastTenSeconds = 0
clearImmediate(immediate)
clearInterval(interval)
nextWave()
}
}

// Output metrics at 1 second interval
let interval = setInterval(outputMetrics, 1000)
immediate = setImmediate(queryLoop)
})
})()

module.exports = run
73 changes: 73 additions & 0 deletions benchmarks/benchmark-has.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
'use strict'

const Log = require('../src/log')
const IPFS = require('ipfs')
const IPFSRepo = require('ipfs-repo')
const DatastoreLevel = require('datastore-level')

// State
let ipfs
let log

// Metrics
let totalQueries = 0
let seconds = 0
let queriesPerSecond = 0
let lastTenSeconds = 0

let entry

const queryLoop = async () => {
log.has(entry.hash)
totalQueries++
lastTenSeconds++
queriesPerSecond++
setImmediate(queryLoop)
}

let run = (() => {
console.log('Starting benchmark...')

const repoConf = {
storageBackends: {
blocks: DatastoreLevel
}
}

ipfs = new IPFS({
repo: new IPFSRepo('./ipfs-log-benchmarks/ipfs', repoConf),
start: false,
EXPERIMENTAL: {
pubsub: false,
sharding: false,
dht: false,
},
})

ipfs.on('error', (err) => {
console.error(err)
})

ipfs.on('ready', async () => {
// Create a log
log = new Log(ipfs, 'A')

entry = await log.append('Hello World')

// Output metrics at 1 second interval
setInterval(() => {
seconds++
if (seconds % 10 === 0) {
console.log(`--> Average of ${lastTenSeconds / 10} q/s in the last 10 seconds`)
if (lastTenSeconds === 0) throw new Error('Problems!')
lastTenSeconds = 0
}
console.log(`${queriesPerSecond} queries per second, ${totalQueries} queries in ${seconds} seconds (Entry count: ${log.values.length})`)
queriesPerSecond = 0
}, 1000)

setImmediate(queryLoop)
})
})()

module.exports = run
Loading