Benchmarks¶
idfkit is benchmarked against eppy, opyplus, and energyplus-idd-idf-utilities on a 1,700-object IDF file (500 zones, 100 materials, 100 constructions, 1,000 surfaces) using EnergyPlus V9.3 -- the newest version natively supported by all four tools.
Each operation was run 10 times (100 for sub-millisecond ops) and the minimum time is reported. Bars are sorted fastest to slowest.
Load IDF file¶
Get all objects by type¶
Get single object by name¶
Add 100 objects¶
Modify fields (all zones)¶
Write IDF to string¶
ESO reader¶
idfkit's .eso/.mtr reader is benchmarked against other EnergyPlus ESO
readers on a 104 MB annual file (RefBldgLargeOffice, ~5.1 million data
points): esoreader,
opyplus,
pyeso,
db-eplusout-reader,
and EnergyPlus's native ReadVarsESO.
Extract one variable¶
idfkit's reader is lazy: pulling one variable float-parses only that variable's records, so it is the fastest correct way to read a few variables from a large file. Every other reader parses the whole file first, even to return a single series.
Full parse¶
When you do want everything, idfkit's eager full parse (pure Python, ~1.7M
points/s) matches the fully-correct, pandas-based opyplus and beats the native
C++ ReadVarsESO. esoreader and pyeso are faster only because they skip
correctness — they concatenate design-day and run-period data into one series,
drop daily/monthly min/max, and (pyeso) return raw strings. idfkit is also more
robust: it reads reference-building files that crash db-eplusout-reader (a
weekday/holiday bug) and that ReadVarsESO truncates to its 255-variable cap.
To reproduce:
Supported EnergyPlus versions¶
| Tool | Versions | Schema format |
|---|---|---|
| idfkit | 8.9 -- 26.1 | epJSON schema (bundled, gzip-compressed) |
| eppy | 1.1 -- 9.2 (bundled IDD); any version with external IDD | IDD file |
| opyplus | 8.0 -- 9.6, 22.1 -- 24.1 | IDD file (bundled) |
| idd-idf-utilities | any version up to ~23.2 (IDD parser breaks on 24.1+) | IDD file (external) |
Methodology¶
Benchmarks are run with gc.collect() before each iteration and gc.disable()
during timing to avoid GC pauses. The test IDF is generated programmatically
with realistic object types (zones, materials, constructions, surfaces).
To reproduce: