apply_string_rope.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. const { Suite } = require('benchmark')
  2. const Rope = require('jumprope')
  3. const suite = new Suite()
  4. for (const size of [5000, 100000, 2000000]) {
  5. const positions = []
  6. for (let i = 0; i < 100; i++) {
  7. positions.push(Math.floor(Math.random() * size))
  8. }
  9. for (const inserts of [0, 1, 2, 5, 10, 20, 100, 1000, 10000]) {
  10. const initialString = 'a'.repeat(size)
  11. suite.add(`| string | ${inserts} | ${size} |`, () => {
  12. let str = initialString
  13. for (let i = 0; i < inserts; i++) {
  14. const pos = positions[i % 100]
  15. str = str.slice(0, pos) + '1234567890' + str.slice(pos)
  16. }
  17. return str.length
  18. })
  19. suite.add(`| rope | ${inserts} | ${size} |`, () => {
  20. const rope = new Rope(initialString)
  21. for (let i = 0; i < inserts; i++) {
  22. const pos = positions[i % 100]
  23. rope.insert(pos, '1234567890')
  24. }
  25. return rope.toString().length
  26. })
  27. }
  28. }
  29. suite.on('cycle', function (event) {
  30. const meanMs = event.target.stats.mean * 1000
  31. const meanToString = Math.ceil(meanMs * 100000) / 100000
  32. console.log(`${event.target.name} ${meanToString}ms | `)
  33. })
  34. // markdown table headers
  35. console.log('| method | inserts | string size | mean |')
  36. console.log('|-|-|-|-|')
  37. suite.run({ async: true })