← fvol

fvol

BENCHMARKS.md

bench/local/BENCHMARKS.md

View on GitHub →

fastvol vs vol-rs vs python volatility3: benchmark

Measured 2026-09-27 20:11–21:18 CDT on this machine (a desktop, not a dedicated server):

CPU12th Gen Intel(R) Core(TM) i7-12700KF: 12 cores / 20 threads (8 performance + 4 efficiency cores), up to 5.0 GHz, governor powersave
Memory62 GiB
Storagebtrfs on LUKS (dm-crypt) on a Micron 2200S NVMe 1024GB
OSOmarchy, Linux 7.1.8-arch1-3
Loadload average 3.1 at the start, 2.2 at the end (our own runs included)
fastvolcommit 8daf454, binary sha256 0cca274f0ff0cf95…, rustc 1.100.0-nightly (1303417c4 2026-09-21), target-cpu=native (the repo's default build)
vol-rsvol-rs 1.0.0 (Volatility 3 framework 2.28.0), binary sha256 ac1e4ed6b64a6f07… (the build benchmarked on the VM)
pythonPython 3.14.7 / volatility3 v2.28.2-10-g3fcb731e with capstone, yara-python, pycryptodome
ImagesWindows 11 x64 raw, 5.0 GiB; Ubuntu 24.04 Linux 6.8 ELF core, 3.0 GiB

How it was measured

  • Every run is one process (TOOL -q -o DIR -f IMAGE PLUGIN, output to a file), timed from start to exit; runs are sequential, never two at once.

  • Figures are medians of each tool's runs: fastvol 5 runs, vol-rs 3, python 1 per plugin (2 per triage session). A median does not favour the tool with more runs the way a best-of does.

  • Each tool has its own caches (python's and vol-rs's symbol files were provisioned once; nothing downloads during the runs). The cache states:

    • python: warm (ISFs and identifier cache present). A first-ever python run would also download and convert the PDB; that is not measured.
    • vol-rs cold / warm: its cache deleted before every run (except downloaded PDBs) / as the previous run left it.
    • fastvol cold: its whole cache deleted before every run (symbol tables, identifier index, automagic results, scan results).
    • fastvol steady: symbol caches warm, scan-result cache off: every scan is really done. This is the like-for-like comparison with python's warm runs.
    • fastvol warm: every cache warm, including the per-image scan cache: scan results are replayed, not recomputed. What a user sees when re-running a plugin, but not the same work as python.
  • The images are in the page cache unless a table says evicted (dropped with posix_fadvise(DONTNEED), so they are read from the NVMe drive).

  • python, run in parallel for part of the all-plugins rounds (to finish in minutes instead of hours): 15 windows plugins, 59 linux plugins ran 6 python processes at a time, each pinned to its own physical performance core, after that round's fastvol and vol-rs runs (never alongside them). Six control plugins timed both alone and in the pool took 2.1% less time (median) in the pool: running in parallel did not slow python down, the speedups are not inflated.

  • vol-rs: 3 runs per state for the first 62 plugins, 1 run after the schedule was shortened (like python).

Triage session (the realistic case)

A first look at an image: the common plugins run one after another, as an analyst would. first = the tool's cache empty at the start (it fills as the session goes), second = the same session again. Python's caches are always warm.

Windows (12 plugins: info, pslist, pstree, psscan, cmdline, dlllist, netscan, modules, getsids, handles, filescan, hivelist)

imagesessionpythonvol-rsfastvolfastvol vs pythonfastvol vs vol-rs
in page cachefirst59.51 s3.71 s126 ms473x29.5x
in page cachesecond59.62 s3.44 s35.1 ms1,701x98.2x
evicted (read from disk)first69.94 s6.47 s1.67 s41.9x3.88x
evicted (read from disk)second78.67 s6.26 s635 ms124x9.86x

Linux (10 plugins: pslist, pstree, psaux, bash, lsmod, sockstat, lsof, malfind, elfs, check_syscall)

imagesessionpythonvol-rsfastvolfastvol vs pythonfastvol vs vol-rs
in page cachefirst80.76 s2.76 s227 ms356x12.1x
in page cachesecond82.67 s1.32 s33.2 ms2,489x39.8x
evicted (read from disk)first84.90 s3.59 s399 ms213x9.01x
evicted (read from disk)second84.96 s2.06 s207 ms411x9.98x

Every plugin once: Windows 11, 77 plugins

Sums answer "how long to run every plugin once"; they are dominated by the few slowest plugins. The per-plugin speedups below them show the spread.

pythonvol-rs coldvol-rs warmfastvol coldfastvol steadyfastvol warm
total (sum of per-plugin medians)2,288 s90.26 s72.61 s3.94 s2.35 s1.19 s
median plugin2.79 s327 ms91.1 ms24.3 ms2.8 ms2.3 ms
total CPU (user + sys)2,283 s282 s267 s27.05 s23.23 s3.42 s
per-plugin speedupgeometric meanmedian10th pct90th pctslowestfastestplugins slowersum ratio
fastvol cold vs python108x131x25.5x408x21.0x (info)39,837x (statistics)0581x
fastvol steady vs python556x533x231x1,584x48.2x (vmscan)240,412x (statistics)0972x
fastvol warm vs python1,170x1,150x361x3,468x134x (dumpfiles)241,386x (statistics)01,924x
fastvol cold vs vol-rs cold14.0x12.9x9.75x21.3x0.10x (vmscan)1,544x (statistics)122.9x
fastvol steady vs vol-rs warm26.9x28.2x10.5x54.1x0.09x (vmscan)9,257x (statistics)130.9x
fastvol warm vs vol-rs warm56.7x44.9x17.6x361x1.75x (isfinfo)9,294x (statistics)061.1x

Output identical to python in every timed run: fastvol cold 76/77, steady 76/77, warm 76/77; vol-rs cold 59/77, warm 59/77. fastvol's differences: windows.windows.Windows (python iterates a set: its row order changes run to run).

Every plugin once: Linux 6.8, 59 plugins

Sums answer "how long to run every plugin once"; they are dominated by the few slowest plugins. The per-plugin speedups below them show the spread. On Linux python spends most of each run decompressing and parsing the kernel's symbol file (3.3 MB xz, 61.5 MB of JSON) (its median plugin takes 10.6 s); fastvol keeps a binary symbol table in its cache, which the steady and warm states use. fastvol cold rebuilds everything each run and is the comparison with no fastvol cache at all.

pythonvol-rs coldvol-rs warmfastvol coldfastvol steadyfastvol warm
total (sum of per-plugin medians)1,600 s117 s66.21 s5.47 s2.62 s2.21 s
median plugin10.61 s1.05 s162 ms58.3 ms2.7 ms2.2 ms
total CPU (user + sys)1,595 s309 s79.77 s44.67 s27.48 s18.76 s
per-plugin speedupgeometric meanmedian10th pct90th pctslowestfastestplugins slowersum ratio
fastvol cold vs python184x176x90.7x369x31.0x (vmcoreinfo)5,540x (pscallstack)0292x
fastvol steady vs python3,094x3,722x1,711x5,903x48.2x (vmcoreinfo)67,714x (pscallstack)0611x
fastvol warm vs python4,417x4,228x2,862x6,374x213x (pagecache)68,295x (pscallstack)0724x
fastvol cold vs vol-rs cold16.5x17.4x15.7x19.7x2.37x (banners)34.8x (pagecache)021.4x
fastvol steady vs vol-rs warm37.6x42.5x21.8x63.7x2.13x (sockscan)147x (hidden_modules)025.3x
fastvol warm vs vol-rs warm53.6x48.4x34.4x86.2x13.2x (timeliner)785x (vmcoreinfo)030.0x

Output identical to python in every timed run: fastvol cold 59/59, steady 59/59, warm 59/59; vol-rs cold 45/59, warm 45/59.

Startup: windows.pslist.PsList

pythonvol-rs coldvol-rs warmfastvol coldfastvol warm
median of 10 (python 3)537 ms270 ms49.8 ms21.7 ms1.3 ms

Per plugin (medians)

windows

pluginpythonvol-rs coldvol-rs warmfastvol coldfastvol steadyfastvol warmsteady vs python
banners.Banners13.34 s355 ms361 ms155 ms153 ms0.76 ms87.3x
frameworkinfo.FrameworkInfo229 ms3.0 ms2.6 ms0.68 ms0.72 ms0.62 ms319x
isfinfo.IsfInfo230 ms2.4 ms2.3 ms1.3 ms1.3 ms1.3 ms172x
vmscan.Vmscan1.33 s2.8 ms2.4 ms28.2 ms27.6 ms0.73 ms48.2x
windows.amcache.Amcache583 ms280 ms49.8 ms22.1 ms0.84 ms1.0 ms695x
windows.bigpools.BigPools2.79 s311 ms78.2 ms23.4 ms2.4 ms2.3 ms1,169x
windows.cachedump.Cachedump1.28 s299 ms57.4 ms23.4 ms1.9 ms1.9 ms658x
windows.callbacks.Callbacks10.35 s1.32 s1.11 s56.4 ms32.3 ms3.4 ms320x
windows.cmdline.CmdLine656 ms295 ms54.6 ms23.3 ms1.9 ms2.1 ms352x
windows.cmdscan.CmdScan3.47 s409 ms183 ms26.6 ms6.1 ms2.6 ms570x
windows.consoles.Consoles4.82 s418 ms182 ms25.0 ms4.2 ms4.1 ms1,143x
windows.crashinfo.Crashinfo286 ms285 ms49.2 ms0.65 ms0.65 ms0.53 ms443x
windows.debugregisters.DebugRegisters10.58 s288 ms55.5 ms25.9 ms5.3 ms4.6 ms2,004x
windows.deskscan.DeskScan7.54 s1.16 s912 ms55.3 ms34.0 ms4.1 ms221x
windows.desktops.Desktops9.70 s1.20 s964 ms58.3 ms35.0 ms5.3 ms277x
windows.devicetree.DeviceTree7.81 s1.17 s930 ms53.6 ms33.3 ms2.6 ms235x
windows.dlllist.DllList4.43 s350 ms121 ms25.5 ms4.0 ms3.9 ms1,111x
windows.driverirp.DriverIrp8.31 s1.15 s939 ms57.4 ms35.9 ms5.2 ms231x
windows.drivermodule.DriverModule7.97 s1.16 s939 ms55.0 ms33.3 ms2.6 ms239x
windows.driverscan.DriverScan7.87 s1.16 s950 ms55.9 ms33.4 ms2.3 ms236x
windows.dumpfiles.DumpFiles86.28 s5.52 s4.58 s646 ms625 ms643 ms138x
windows.envars.Envars1.06 s289 ms58.6 ms23.7 ms2.7 ms2.8 ms389x
windows.etwpatch.EtwPatch10.19 s375 ms128 ms38.4 ms9.3 ms8.7 ms1,093x
windows.filescan.FileScan14.34 s1.24 s1.01 s59.5 ms37.7 ms7.8 ms381x
windows.getservicesids.GetServiceSIDs1.44 s312 ms75.3 ms23.7 ms1.7 ms1.6 ms846x
windows.getsids.GetSIDs1.78 s313 ms71.9 ms25.1 ms3.0 ms3.1 ms593x
windows.handles.Handles22.73 s594 ms361 ms27.5 ms7.0 ms6.7 ms3,232x
windows.hashdump.Hashdump1.21 s290 ms56.7 ms24.3 ms2.0 ms1.9 ms590x
windows.iat.IAT3.02 s327 ms91.1 ms24.9 ms4.2 ms4.3 ms716x
windows.info.Info466 ms278 ms48.3 ms22.2 ms0.99 ms1.00 ms471x
windows.joblinks.JobLinks707 ms288 ms55.0 ms22.9 ms2.1 ms2.0 ms341x
windows.kpcrs.KPCRs553 ms280 ms48.2 ms22.4 ms0.77 ms0.67 ms717x
windows.lsadump.Lsadump1.28 s290 ms55.1 ms23.6 ms2.0 ms2.3 ms637x
windows.malware.drivermodule.DriverModule7.89 s1.15 s944 ms55.4 ms33.8 ms2.6 ms233x
windows.mbrscan.MBRScan9.40 s716 ms484 ms192 ms167 ms22.3 ms56.2x
windows.modscan.ModScan7.32 s1.14 s911 ms55.1 ms32.9 ms1.2 ms223x
windows.modules.Modules549 ms279 ms50.7 ms22.6 ms1.2 ms1.2 ms472x
windows.mutantscan.MutantScan7.68 s1.14 s927 ms56.3 ms33.4 ms2.3 ms230x
windows.netscan.NetScan10.49 s1.16 s920 ms55.0 ms33.0 ms1.9 ms318x
windows.netstat.NetStat677 ms534 ms287 ms27.9 ms1.8 ms1.9 ms386x
windows.orphan_kernel_threads.Threads9.39 s1.16 s954 ms56.7 ms35.1 ms3.5 ms268x
windows.pe_symbols.PESymbols234 ms2.5 ms1.8 ms0.64 ms0.57 ms0.58 ms412x
windows.poolscanner.PoolScanner21.50 s1.52 s1.25 s61.0 ms37.9 ms9.4 ms568x
windows.privileges.Privs697 ms288 ms55.2 ms23.4 ms2.4 ms2.1 ms293x
windows.pslist.PsList638 ms282 ms52.5 ms23.0 ms1.1 ms1.3 ms596x
windows.psscan.PsScan8.46 s1.19 s949 ms55.6 ms33.7 ms2.9 ms251x
windows.pstree.PsTree767 ms309 ms56.4 ms23.5 ms2.1 ms2.4 ms374x
windows.registry.amcache.Amcache572 ms306 ms53.0 ms23.2 ms0.98 ms0.87 ms584x
windows.registry.cachedump.Cachedump1.26 s289 ms55.8 ms23.9 ms1.9 ms1.8 ms673x
windows.registry.certificates.Certificates2.67 s329 ms99.4 ms22.9 ms2.1 ms1.9 ms1,259x
windows.registry.getcellroutine.GetCellRoutine894 ms400 ms157 ms23.3 ms2.2 ms1.8 ms408x
windows.registry.hashdump.Hashdump1.19 s282 ms56.1 ms23.2 ms2.0 ms1.9 ms592x
windows.registry.hivelist.HiveList570 ms276 ms47.9 ms22.4 ms1.0 ms1.1 ms567x
windows.registry.hivescan.HiveScan1.98 s301 ms64.6 ms23.4 ms1.3 ms1.3 ms1,542x
windows.registry.lsadump.Lsadump1.25 s288 ms55.5 ms24.0 ms2.2 ms2.2 ms572x
windows.registry.printkey.PrintKey1.52 s299 ms69.0 ms24.4 ms2.7 ms2.7 ms558x
windows.registry.scheduled_tasks.ScheduledTasks3.65 s338 ms95.2 ms24.2 ms2.4 ms2.6 ms1,521x
windows.registry.userassist.UserAssist1.08 s293 ms63.6 ms23.5 ms1.7 ms1.3 ms643x
windows.scheduled_tasks.ScheduledTasks3.57 s328 ms96.4 ms23.1 ms2.3 ms2.4 ms1,584x
windows.sessions.Sessions676 ms285 ms55.6 ms23.4 ms2.1 ms2.1 ms329x
windows.shimcachemem.ShimcacheMem918 ms288 ms55.9 ms23.5 ms1.5 ms1.7 ms609x
windows.ssdt.SSDT659 ms282 ms55.4 ms23.8 ms2.8 ms2.3 ms239x
windows.suspended_threads.SuspendedThreads10.95 s284 ms58.1 ms31.7 ms5.9 ms5.9 ms1,867x
windows.symlinkscan.SymlinkScan7.71 s1.17 s864 ms52.9 ms30.5 ms2.2 ms253x
windows.thrdscan.ThrdScan19.06 s1.17 s960 ms55.4 ms33.1 ms4.6 ms576x
windows.threads.Threads10.31 s355 ms145 ms24.8 ms4.0 ms3.9 ms2,597x
windows.timers.Timers969 ms270 ms53.0 ms23.2 ms2.4 ms2.2 ms397x
windows.truecrypt.Passphrase495 ms270 ms49.0 ms21.8 ms1.0 ms0.87 ms490x
windows.unloadedmodules.UnloadedModules466 ms262 ms49.0 ms21.7 ms0.87 ms0.80 ms533x
windows.vadinfo.VadInfo53.32 s465 ms237 ms26.0 ms5.2 ms5.0 ms10,179x
windows.vadwalk.VadWalk10.43 s421 ms164 ms24.1 ms3.8 ms3.7 ms2,747x
windows.verinfo.VerInfo30.14 s375 ms144 ms28.9 ms8.3 ms8.2 ms3,630x
windows.virtmap.VirtMap469 ms273 ms47.6 ms22.0 ms0.81 ms0.76 ms577x
windows.windows.Windows10.22 s1.16 s918 ms55.7 ms33.5 ms5.8 ms305x
windows.windowstations.WindowStations9.74 s1.17 s919 ms55.1 ms32.1 ms4.0 ms304x
windows.statistics.Statistics948 s36.76 s36.52 s23.8 ms3.9 ms3.9 ms240,412x
timeliner.Timeliner819 s8.37 s7.97 s653 ms598 ms316 ms1,370x

linux

pluginpythonvol-rs coldvol-rs warmfastvol coldfastvol steadyfastvol warmsteady vs python
banners.Banners12.54 s229 ms230 ms96.5 ms96.5 ms0.86 ms130x
linux.bash.Bash8.77 s1.01 s106 ms57.0 ms5.1 ms4.1 ms1,711x
linux.boottime.Boottime7.00 s971 ms66.8 ms58.6 ms1.4 ms1.2 ms5,087x
linux.capabilities.Capabilities7.12 s973 ms68.2 ms55.6 ms2.0 ms1.8 ms3,517x
linux.check_afinfo.Check_afinfo12.48 s1.05 s163 ms58.3 ms2.8 ms2.3 ms4,394x
linux.check_creds.Check_creds6.98 s970 ms67.2 ms56.9 ms1.2 ms1.2 ms5,903x
linux.check_idt.Check_idt18.27 s1.06 s161 ms58.5 ms3.8 ms3.3 ms4,840x
linux.check_modules.Check_modules7.07 s969 ms66.1 ms58.1 ms1.2 ms0.93 ms5,781x
linux.check_syscall.Check_syscall16.14 s1.15 s255 ms77.8 ms7.0 ms5.2 ms2,319x
linux.ebpf.EBPF6.21 s967 ms64.9 ms57.6 ms1.2 ms1.0 ms5,039x
linux.elfs.Elfs10.16 s1.05 s144 ms60.3 ms3.3 ms3.0 ms3,083x
linux.envars.Envars6.53 s975 ms70.2 ms55.4 ms2.1 ms1.9 ms3,142x
linux.graphics.fbdev.Fbdev5.08 s972 ms65.8 ms56.0 ms0.68 ms0.86 ms7,521x
linux.hidden_modules.Hidden_modules11.52 s1.21 s294 ms56.2 ms2.5 ms1.8 ms4,621x
linux.iomem.IOMem5.43 s964 ms64.8 ms60.0 ms1.1 ms0.88 ms5,078x
linux.ip.Addr6.76 s974 ms65.7 ms58.2 ms1.1 ms1.1 ms5,996x
linux.ip.Link6.66 s965 ms64.8 ms57.4 ms1.1 ms0.94 ms6,070x
linux.kallsyms.Kallsyms49.28 s1.48 s582 ms66.4 ms13.9 ms15.9 ms3,556x
linux.keyboard_notifiers.Keyboard_notifiers11.08 s1.06 s163 ms57.3 ms2.6 ms2.2 ms4,212x
linux.kmsg.Kmsg5.54 s976 ms70.3 ms58.8 ms1.6 ms1.4 ms3,538x
linux.kthreads.Kthreads16.04 s1.07 s166 ms59.7 ms5.1 ms5.0 ms3,169x
linux.library_list.LibraryList47.51 s1.04 s138 ms60.8 ms4.0 ms3.6 ms11,749x
linux.lsmod.Lsmod10.00 s979 ms66.7 ms56.1 ms1.5 ms1.5 ms6,694x
linux.lsof.Lsof11.45 s993 ms91.4 ms58.3 ms4.2 ms4.2 ms2,747x
linux.malfind.Malfind18.70 s1.11 s216 ms58.8 ms4.9 ms4.5 ms3,783x
linux.malware.check_afinfo.Check_afinfo9.72 s1.06 s165 ms55.6 ms2.7 ms2.3 ms3,550x
linux.malware.check_creds.Check_creds5.35 s970 ms66.9 ms59.0 ms1.4 ms1.3 ms3,828x
linux.malware.check_idt.Check_idt15.33 s1.06 s163 ms58.5 ms3.7 ms3.6 ms4,147x
linux.malware.check_modules.Check_modules5.54 s973 ms66.6 ms57.6 ms1.1 ms1.2 ms4,898x
linux.malware.check_syscall.Check_syscall12.37 s1.15 s259 ms73.1 ms5.8 ms5.3 ms2,118x
linux.malware.hidden_modules.Hidden_modules10.02 s1.20 s303 ms56.9 ms2.1 ms1.9 ms4,861x
linux.malware.keyboard_notifiers.Keyboard_notifiers10.20 s1.07 s163 ms57.1 ms2.6 ms2.3 ms3,996x
linux.malware.malfind.Malfind18.07 s1.12 s216 ms55.8 ms5.1 ms4.7 ms3,562x
linux.malware.modxview.Modxview10.61 s1.19 s288 ms58.6 ms2.6 ms2.2 ms4,140x
linux.malware.netfilter.Netfilter21.11 s1.06 s167 ms56.9 ms4.2 ms3.8 ms5,080x
linux.malware.process_spoofing.ProcessSpoofing4.68 s967 ms69.2 ms59.2 ms2.1 ms2.0 ms2,195x
linux.malware.tty_check.Tty_Check16.42 s1.07 s162 ms59.0 ms4.5 ms4.5 ms3,639x
linux.modxview.Modxview11.38 s1.19 s289 ms60.6 ms2.4 ms2.2 ms4,834x
linux.mountinfo.MountInfo6.66 s973 ms76.3 ms56.6 ms2.5 ms2.2 ms2,624x
linux.netfilter.Netfilter21.49 s1.06 s162 ms58.2 ms3.9 ms3.8 ms5,575x
linux.pagecache.Files35.36 s1.43 s524 ms74.6 ms12.8 ms12.1 ms2,759x
linux.pagecache.InodePages4.13 s962 ms67.1 ms58.4 ms0.84 ms0.78 ms4,913x
linux.pidhashtable.PIDHashTable6.20 s978 ms67.8 ms58.4 ms1.8 ms1.6 ms3,475x
linux.proc.Maps19.98 s1.14 s235 ms58.0 ms5.4 ms4.9 ms3,722x
linux.psaux.PsAux6.06 s972 ms74.3 ms56.4 ms2.0 ms1.9 ms3,069x
linux.pslist.PsList5.61 s967 ms67.7 ms57.0 ms1.7 ms1.4 ms3,351x
linux.psscan.PsScan35.30 s1.09 s258 ms155 ms106 ms7.3 ms333x
linux.pstree.PsTree5.65 s968 ms66.8 ms57.4 ms1.8 ms1.4 ms3,116x
linux.ptrace.Ptrace5.78 s973 ms70.2 ms56.0 ms1.7 ms1.5 ms3,387x
linux.sockscan.Sockscan15.98 s1.07 s219 ms155 ms103 ms3.8 ms155x
linux.sockstat.Sockstat12.67 s996 ms89.5 ms57.5 ms4.1 ms4.4 ms3,085x
linux.tracing.ftrace.CheckFtrace16.20 s1.06 s165 ms58.2 ms3.9 ms4.0 ms4,120x
linux.tracing.perf_events.PerfEvents5.15 s965 ms67.2 ms59.1 ms1.6 ms1.4 ms3,143x
linux.tracing.tracepoints.CheckTracepoints16.50 s1.06 s166 ms55.5 ms3.3 ms3.1 ms4,978x
linux.tty_check.tty_check16.33 s1.07 s162 ms60.2 ms4.0 ms4.0 ms4,033x
linux.vmcoreinfo.VMCoreInfo5.01 s1.60 s754 ms161 ms104 ms0.96 ms48.2x
linux.pagecache.RecoverFs423 s56.10 s56.10 s1.61 s1.92 s1.99 s220x
linux.pscallstack.PsCallStack333 s1.18 s282 ms60.1 ms4.9 ms4.9 ms67,714x
timeliner.Timeliner129 s1.48 s644 ms165 ms115 ms48.7 ms1,116x

Raw data: raw/raw.jsonl (every run), raw/machine.json, results.tsv. Harness: bench/scripts/bench_local.py; this report: bench/scripts/bench_local_report.py.