drain.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import { performance } from 'node:perf_hooks'
  2. import { Deque } from '../src/index.ts'
  3. const sizes = [250_000, 500_000, 1_000_000, 2_000_000]
  4. const samples = 5
  5. function drain(size: number): { readonly milliseconds: number; readonly checksum: number } {
  6. const deque = new Deque<number>()
  7. for (let value = 0; value < size; value += 1) deque.pushBack(value)
  8. const started = performance.now()
  9. let checksum = 0
  10. while (deque.size > 0) checksum += deque.popFront() as number
  11. return { milliseconds: performance.now() - started, checksum }
  12. }
  13. function median(values: readonly number[]): number {
  14. const ordered = values.toSorted((left, right) => left - right)
  15. return ordered[Math.floor(ordered.length / 2)] as number
  16. }
  17. drain(sizes[0] as number)
  18. for (const size of sizes) {
  19. const expected = size * (size - 1) / 2
  20. const durations: number[] = []
  21. for (let sample = 0; sample < samples; sample += 1) {
  22. const result = drain(size)
  23. if (result.checksum !== expected) throw new Error(`invalid checksum for ${String(size)} entries`)
  24. durations.push(result.milliseconds)
  25. }
  26. const milliseconds = median(durations)
  27. console.log(JSON.stringify({
  28. size,
  29. medianMilliseconds: Number(milliseconds.toFixed(3)),
  30. nanosecondsPerEntry: Number((milliseconds * 1_000_000 / size).toFixed(3)),
  31. }))
  32. }