Benchmarks

Atmos runs 2.1x to 17.2x faster than the reference engine on a first scan of the same code with the same rules. On every one of those scans Atmos follows untrusted data from the file where it enters to the file where the dangerous call sits, but the reference engine stops at the edge of each file. Pick a project and play the scan.

TypeScript
C#
Java
elapsed 358.2s
Atmosversion 0.1.0
29.9s done, 1,729 findings
Reference engineversion 1.29.0
358.2s done, 2,101 findings
First scan, median of 5 runs
Atmos29.9s
Reference engine358.2s
Rescan after an edit of one line
Atmos2.60s
Reference engine364.7s
Peak memory of the largest process
Atmos2,771MB
Reference engine1,622MB
Distinct findings by rule, file and line
Atmos1,729
Reference engine2,101

How the run was set up

Machine
c3-standard-8 cloud VM, Intel Xeon Platinum 8481C, 8 vCPUs, 31 GB of memory, Ubuntu 24.04, Linux 6.17
Engines
Atmos 0.1.0. Reference engine 1.29.0, with analysis across functions within a file turned on.
Rules
One public rule pack in the YAML rule format, the same files on both engines, minus every rule either engine refuses to load.
Projects
Public open source projects at a pinned commit, with dependencies and build output excluded on both sides.
Runs
One untimed warmup per engine, then 5 timed first scans and 3 timed rescans per engine per project.
Date
2026-09-06

How the numbers are produced

Both engines run inside the same session on the same machine, alternating, with the order flipped on every rep so neither engine always goes first. Every rep is timed by the operating system as wall clock time, and the number reported is the median of the timed reps, never the best run.

Every arm reads the same files from the operating system's file cache, so the comparison is compute, not disk. The reference engine runs with analysis across functions within a file turned on, because its default mode is weaker than that and would inflate the ratio.

The two engines also do different amounts of work on the same rules. Untrusted input enters in one file and the dangerous call may sit in another. Atmos follows that path across files on every scan and reports the whole path as one finding, but the reference engine follows a path only inside the file where it starts. The Atmos times on this page include that cross-file work.

Findings are counted as distinct combinations of rule, file and line, because the reference engine reports the same finding more than once when several paths reach it. Both engines scan exactly the same set of files, checked file by file from their own reports.

The reference engine runs with its default limits. On the two largest projects a few dozen files hit its time limit for one rule on one file, which shortens its wall time and moves its finding count by a handful between its own runs.

Results

LanguageFilesLinesAtmos memoryReference memoryAtmos findingsReference findingsAtmos scanReference scanFaster by
TypeScript8,3972,205,1632,771 MB1,622 MB1,7292,10129.9s358.2s12.0x
TypeScript3,933516,277617 MB617 MB8788114.69s64.7s13.8x
TypeScript1,48777,825206 MB268 MB991061.13s19.5s17.2x
TypeScript542137,810320 MB993 MB9458813.43s54.8s16.0x
C#1,877290,726280 MB272 MB29297.07s14.7s2.1x
Java51985,011224 MB274 MB334.38s15.5s3.5x

Times are the median wall clock seconds of a first scan. Memory is the peak of the largest process during that scan. The projects are public open source projects that we do not name, because a benchmark that names the code it runs on turns into a claim about that project rather than about the engine.

Rescans

After the first scan, one line is appended to one source file and both engines scan the tree again. Atmos rechecks only what changed and reports the same findings as before the edit on every project, but the reference engine scans everything again.

LanguageFilesAtmos rescanReference rescanFaster by
TypeScript8,3972.60s364.7s140.3x
TypeScript3,9330.75s65.8s87.7x
TypeScript1,4870.43s19.5s45.3x
TypeScript5420.46s54.6s118.7x
C#1,8770.37s14.5s39.2x
Java5190.62s15.0s24.3x

See how rescans stay fast.

Reproduce the run

  1. Clone the project at a fixed commit and remove dependencies and build output.
  2. Put the same rule files in front of both engines and drop every rule either engine refuses to load.
  3. On a machine running nothing else, run one untimed scan per engine, then alternate the timed scans and flip the order on every rep.
  4. Take the median of at least five reps, and count findings as distinct rule, file and line.

What this does not measure

Speed, memory and finding counts only. This run is not a comparison of detection quality and does not establish that either engine is right about any individual finding.

Put your codebase underĀ Atmos