SuperIntervals Benchmark

July 14, 2026 ยท View on GitHub

SuperIntervals (SI) was compared with:

Main results:

  • Finding interval intersections is on average ~1.5-3x faster than other libraries (Coitrees for Rust, Implicit Interval Tree for C++), with some exceptions. Coitrees-s was faster for one test (ONT reads, sorted DB53 reads).
  • The SIMD counting performance of coitrees and superintervals was similar.

Datasets https://github.com/kcleal/superintervals/releases/download/v0.2.0/data.tar.gz:

  • rna / anno RNA-seq reads and annotations from cgranges repository
  • ONT reads nanopore alignments from sample PAO33946 chr1, converted to bed format
  • DB53 reads paired-end reads from sample DB53, NCBI BioProject PRJNA417592, chr1, converted to bed format
  • mito-b, mito-a paired-end reads from sample DB53 chrM, converted to bed format (mito-b and mito-a are the same)
  • genes UCSC genes from hg19

Test programs use internal timers and print data to stdout, measuring the index time, and time to find all intersections. Other steps such as file IO are ignored. Test programs also only assess chr1 bed records - other chromosomes are ignored. For 'chrM' records, the M was replaced with 1 using sed. Data were assessed in position sorted and random order. Datasets can be found on the Releases page, and the test/run_tools.sh script has instructions for how to repeat the benchmark.

Timings were in microseconds using an i9-11900K, 64 GB, 2TB NVMe machine.

Finding interval intersections

  • Coitrees-s uses the SortedQuerent version of coitrees
  • SI = superintervals. Eytz refers to the eytzinger layout. -rs is the Rust implementation.

Intervals in sorted order

CoitreesCoitrees-sSuperIntervals-rsSuperIntervalsEytz-rsImplicitITree-C++IntervalTree-C++NCLS-CSuperIntervals-C++SuperIntervalsEytz-C++
DB53 reads, ONT reads166831797577573831444041064213151358
DB53 reads, genes558421211221092914240
ONT reads, DB53 reads650433543859385417949122803077252904462
anno, rna50351818127902082922
genes, DB53 reads11711018301296312913151780442323
mito-b, mito-a34769345941697116952939001076602517073317732985
rna, anno3123212070552332827

Intervals in random order

CoitreesCoitrees-sSuperIntervals-rsSuperIntervalsEytz-rsImplicitITree-C++IntervalTree-C++NCLS-CSuperIntervals-C++SuperIntervalsEytz-C++
DB53 reads, ONT reads29434663135613556505467431194724912169
DB53 reads, genes7813027261701253055851
ONT reads, DB53 reads166501893116116160373867727832534522300323232
anno, rna8910554541881432945860
genes, DB53 reads222224241693168444902701360512511749
mito-b, mito-a380308630918326183681253361183212562934219541695
rna, anno53734545137833115252

Counting interval intersections

Intervals in sorted order

CoitreesSuperIntervals-rsSuperIntervalsEytz-rsSuperIntervals-C++SuperIntervalsEytz-C++
DB53 reads, ONT reads551370371241263
DB53 reads, genes28121287
ONT reads, DB53 reads24781909189022091312
anno, rna2614142211
genes, DB53 reads747321336446290
mito-b, mito-a68946727674630882966
rna, anno913131210

Intervals in random order

CoitreesSuperIntervals-rsSuperIntervalsEytz-rsSuperIntervals-C++SuperIntervalsEytz-C++
DB53 reads, ONT reads19889729691016778
DB53 reads, genes5320201613
ONT reads, DB53 reads66928864873381829523
anno, rna5249484750
genes, DB53 reads15031628159211201623
mito-b, mito-a143547579760044424383
rna, anno2230292525