Skip to content
v1.2.0

Benchmarks

Measured runtimes for the core operations of the Ocelescope base tool on public object-centric event logs: import, export, filtering, and discovery.

Each configuration was run 5 times on the machine below, and the reported value is the median in seconds. Charts show these medians; the complete per-run numbers are in the All runs table under each section.

A separate suite at the end of this page compares the ocelescope library against pm4py.

Ocelescopev1.0.3
OSArch Linux
Kernel7.1.3-arch1-2, x86_64
CPU12th Gen Intel Core i7-1260P
Cores / threads12 cores (4 P + 8 E) / 16 threads
Memory32 GB (31.0 GiB)
Short nameLog variantSourceEventsObjects
p2pp2p10.5281/zenodo.841292014,6719,543
order-mgmtorder-management10.5281/zenodo.1837390621,00810,840
containercontainer logistics10.5281/zenodo.1837388835,37213,882
aoe2aoe210.5281/zenodo.133655842,372,505630,590
steelsteel logisticsproprietary, not public865,859110,834
hingehinge10.5281/zenodo.1363868138,52823,771
angularangular github comments10.5281/zenodo.843033227,84728,317
BPI 2017BPI Challenge 20174121/uuid:5f3067df…1,202,26731,509
Median import time by file format Logs ordered by size.
  • xml
  • json
  • sqlite
  • xes

Logarithmic time axis: bar length is not proportional to the value.

All runs
Log variantFormatFile sizeRun 1Run 2Run 3Run 4Run 5Median
p2pxml17.6 MB0.5270.4740.5300.4870.4850.487
p2pjson13.6 MB0.6040.6070.6220.6030.6000.604
p2psqlite13.1 MB0.4460.4270.4290.4350.4420.435
order-mgmtxml15.2 MB0.3170.3090.3020.3210.2960.309
order-mgmtjson12.6 MB0.4220.4210.4190.4160.4140.419
order-mgmtsqlite36.6 MB0.2510.2370.2490.2560.2530.251
containerxml13.4 MB0.2760.2780.2820.2770.2850.278
containerjson10.0 MB0.3460.3520.3400.3360.3430.343
containersqlite23.0 MB0.2340.2480.2350.2370.2310.235
aoe2xml1.3 GB44.57944.27945.85645.03145.91445.031
aoe2json1.6 GB46.26146.67546.92146.64747.22646.675
aoe2sqlite891.9 MB8.6628.5428.4448.5198.5068.519
steelxml1.1 GB46.42347.01947.36547.82246.71947.019
steeljson922.7 MB51.21351.48252.91251.36148.16351.361
steelsqlite580.1 MB17.79617.83317.92017.56617.94517.833
hingexml40.2 MB0.6540.6490.6440.6470.6440.647
hingejson29.1 MB0.9510.9350.9550.9740.9610.955
hingesqlite19.8 MB0.4960.4950.4910.4980.4970.496
angularxml178.1 MB2.2382.3122.2602.2362.3402.260
BPI 2017xes29.7 MB5.5245.5945.5585.5445.6055.558
Median export time by file format Native OCEL exports. The flattened xes export writes a single object type and is listed in the table below only.
  • xml
  • json
  • sqlite

Logarithmic time axis: bar length is not proportional to the value.

All runs

A blank Flattened type means no flattening (native OCEL export).

Log variantFormatFlattened typeRun 1Run 2Run 3Run 4Run 5Median
p2pxml1.1941.2201.1821.2091.1781.194
p2pjson0.4180.4180.4010.4140.4060.414
p2psqlite0.3850.3940.4030.3880.4110.394
p2pxesmaterial0.2640.2700.2580.2780.2940.270
order-mgmtxml1.2391.2361.2341.2441.2241.236
order-mgmtjson0.3750.3600.4460.3840.3710.375
order-mgmtsqlite0.2940.3170.2920.3220.3010.301
order-mgmtxesitems0.3140.3250.3120.3220.3130.314
containerxml1.1881.1301.1271.1481.1441.144
containerjson0.3030.2910.2910.3000.2940.294
containersqlite0.3160.3410.3180.2890.3080.316
containerxesnot recorded0.2300.2330.2370.2280.2380.233
aoe2xml90.00388.70589.14389.143 ⚠️ 3 runs
aoe2json20.55720.04720.61320.58820.18820.557
aoe2sqlite23.34722.38320.36122.17919.62722.179
steelxml75.89776.91676.13776.137 ⚠️ 3 runs
steeljson18.59018.40918.62618.67318.31018.590
steelsqlite23.32723.67423.94223.51122.87423.511
steelxesstack7.9047.6757.6767.7897.8657.789
hingexml2.8792.7922.9582.9322.8942.894
hingejson0.7250.7470.7370.7460.7630.746
hingesqlite0.5450.5960.5580.8600.5430.558 ⚠️ outlier
hingexesWorkstation0.4850.5020.4870.4890.4910.489
Median filter time and how much each configuration removed Nine filter configurations.
  • Runtime
  • Events excluded
  • Objects excluded

Each panel has its own axis: runtime is linear in seconds, exclusions are a logarithmic count, so bar lengths only compare within a panel. A configuration that excluded nothing shows 0 at the axis start.

Summary
IDLog variantFilter (summary)Excl. eventsExcl. objectsMedian (s)
F1p2pActivity: exclude 5 activities3,55100.312
F2p2pTime frame: 2023-04-01 → 2024-04-018,72600.303
F3p2pObject attributes ×3 (regex + numeric range)02,9190.288
F4p2pE2O count ×220600.330
F5order-mgmtObject type + time frame + object attr. + E2O count (4 filters)7,61710,8180.157
F6containerObject type + time frame + 3× object attr. + 3× E2O count (8 filters)23,1107,3870.184
F7aoe2Object type + activity + O2O count + time frame + 2× E2O count (6 filters)2,177,411386,0222.856
F8steelObject type + time frame + event attr. + 2× O2O count (5 filters)441,74431,0774.986
F9hingeObject type + time frame + activity (3 filters)29,1012,2250.319
All runs
IDRun 1Run 2Run 3Run 4Run 5Median
F10.3090.3100.3180.3200.3120.312
F20.3030.3030.3050.2960.2980.303
F30.2930.2960.2880.2850.2770.288
F40.3210.3350.3300.3170.3310.330
F50.1500.1570.1590.1530.1630.157
F60.1740.1840.1860.1860.1820.184
F73.0182.8782.8562.8402.8272.856
F84.9294.9865.2385.1994.9454.986
F90.3210.3180.3190.3170.3270.319

Settings: OC-DFG at frequency threshold 1.0, Inductive Miner (flattening) at frequency threshold 0.8. The two largest logs were pre-filtered first; the sizes below are after filtering. aoe2 was reduced to its top 80% activities and 90% objects; steel logistics by a two-part exclusion filter listing 87 object types and 587 activity types explicitly (largely storage locations, installations, and movement events).

Median discovery time by algorithm Logs ordered by size.
  • OC-DFG
  • Inductive Miner

Logarithmic time axis: bar length is not proportional to the value.

All runs

The Events and Objects columns are the size of the log after the pre-filter was applied.

Log variantAlgorithmPre-filterEventsObjectsRun 1Run 2Run 3Run 4Run 5Median
p2pOC-DFGnone14,6719,5431.8361.8881.8931.8661.8861.886
p2pInductive Minernone14,6719,5431.3941.3961.4861.4041.4031.403
order-mgmtOC-DFGnone21,00810,8403.2823.1703.1743.1053.2533.174
order-mgmtInductive Minernone21,00810,8404.4854.4564.5534.3814.5374.485
containerOC-DFGnone35,37213,8823.3823.3613.4103.4223.5203.410
containerInductive Minernone35,37213,8822.4392.4452.4542.4682.4632.454
aoe2OC-DFGtop 80% activities / 90% objects1,204,066308,295117.451116.754120.701118.750118.566118.566
aoe2Inductive Minertop 80% activities / 90% objects1,204,066308,29568.95270.24970.43770.21470.85470.249
steelInductive Minerexclude 87 object types + 587 activities557,06366,34955.71838.95657.45739.85738.95939.857 ⚠️ bimodal
hingeOC-DFGnone38,52823,7714.9894.7354.9094.8594.7534.859
hingeInductive Minernone38,52823,7718.7298.8498.8688.9378.7288.849

The sections above measure the base tool. This one measures the ocelescope library on its own, against pm4py doing the same three things to the same files: import, filtering, and export. The logs are container, order-mgmt, and aoe2 from the table at the top of the page.

The two libraries hold a log differently, and that is what the numbers are about. pm4py keeps every table as an in-memory pandas DataFrame. ocelescope keeps the log in a DuckDB database and reshapes DataFrames out of it only when something asks for them, so what a log costs in RAM is decoupled from what it costs to work with. Both readers OCEL.read offers are measured: the default variant="r4pm" and variant="streamed". .sqlite logs always stream, so they have no separate r4pm row.

ocelescope0.6.0
pm4py2.7.23.4
Python3.13.11
Kernel7.1.8-arch1-3, x86_64
Runs per case3

Time is the fastest of the three runs and RAM the highest peak, rather than the median-of-five used earlier on the page. The suite that produced these numbers is at promi4s/ocelescope-library-benchmarks.

Peak RAM above baseline while importing Three readers per log and format. Lower is better.
  • ocelescope (streamed)
  • ocelescope (r4pm)
  • pm4py

Logarithmic axis: bar length is not proportional to the value. Sub-gigabyte differences between the small logs are real but visually compressed.

Import wall time by reader Fastest of three runs.
  • ocelescope (streamed)
  • ocelescope (r4pm)
  • pm4py

Logarithmic time axis: bar length is not proportional to the value.

All runs

Wall time per run, in seconds:

LogFormatReaderRun 1Run 2Run 3Best
containerjsonocelescope (streamed)0.3770.3930.3930.377
containerjsonocelescope (r4pm)0.3240.2610.2600.260
containerjsonpm4py0.1210.1170.1180.117
containerxmlocelescope (streamed)0.4500.4540.4570.450
containerxmlocelescope (r4pm)0.2340.2200.2260.220
containerxmlpm4py0.1360.1460.1400.136
containersqliteocelescope (streamed)0.1370.1440.1390.137
containersqlitepm4py0.8960.9010.8700.870
order-mgmtjsonocelescope (streamed)0.5140.4940.5310.494
order-mgmtjsonocelescope (r4pm)0.3080.3120.3000.300
order-mgmtjsonpm4py0.1580.1510.1520.151
order-mgmtxmlocelescope (streamed)0.5030.5290.5140.503
order-mgmtxmlocelescope (r4pm)0.2390.2310.2390.231
order-mgmtxmlpm4py0.1670.1640.1660.164
order-mgmtsqliteocelescope (streamed)0.1570.1550.1530.153
order-mgmtsqlitepm4py0.7640.7620.7710.762
aoe2jsonocelescope (streamed)33.9734.2233.8633.86
aoe2jsonocelescope (r4pm)16.4916.7616.8816.49
aoe2jsonpm4py9.539.319.699.31
aoe2xmlocelescope (streamed)36.9136.3836.9636.38
aoe2xmlocelescope (r4pm)9.719.789.689.68
aoe2xmlpm4py8.578.558.498.49
aoe2sqliteocelescope (streamed)7.387.427.577.38
aoe2sqlitepm4py63.4163.4463.2963.29

Peak RAM above baseline per run, in MB:

LogFormatReaderRun 1Run 2Run 3MaxRetained
containerjsonocelescope (streamed)118119123123124
containerjsonocelescope (r4pm)200202200202203
containerjsonpm4py158159160160161
containerxmlocelescope (streamed)132132134134121
containerxmlocelescope (r4pm)216206227227215
containerxmlpm4py163158160163164
containersqliteocelescope (streamed)118118126126127
containersqlitepm4py123123123123102
order-mgmtjsonocelescope (streamed)138134134138138
order-mgmtjsonocelescope (r4pm)216211223223224
order-mgmtjsonpm4py209203207209197
order-mgmtxmlocelescope (streamed)149142139149134
order-mgmtxmlocelescope (r4pm)241226243243229
order-mgmtxmlpm4py209209208209198
order-mgmtsqliteocelescope (streamed)127120112127128
order-mgmtsqlitepm4py126126126126119
aoe2jsonocelescope (streamed)925874909925913
aoe2jsonocelescope (r4pm)6,4276,4266,4306,4301,789
aoe2jsonpm4py6,4326,4296,4336,4333,814
aoe2xmlocelescope (streamed)2,1592,1712,2272,227926
aoe2xmlocelescope (r4pm)6,4286,4266,4296,4292,455
aoe2xmlpm4py6,4316,4346,4316,4343,818
aoe2sqliteocelescope (streamed)980978975980980
aoe2sqlitepm4py6,6576,6576,6576,6574,036

All on aoe2, both libraries starting from the same sqlite log. The log is loaded once per library and only the filter call is timed, so import cost stays out of the numbers.

Filterocelescopepm4py
activityEventTypeFilterfilter_ocel_event_attribute
object-typeObjectTypeFilterfilter_ocel_object_types
timeframeTimeFrameFilterfilter_ocel_events_timestamp

activity keeps every activity at least as frequent as Start Build Farm, object-type keeps Villager / Farm / House, timeframe keeps 2023-11-30 to 2023-12-14.

Filter time on aoe2 Fastest of three runs, filter call only.
  • ocelescope
  • pm4py
All timings
FilterEngineTime
activityocelescope1.97 s
activitypm4py7.65 s
object-typeocelescope1.62 s
object-typepm4py8.12 s
timeframeocelescope1.81 s
timeframepm4py8.83 s

Also aoe2, also loaded from sqlite, with the clock starting once the log is instantiated. Each library writes all three formats.

Export time by format on aoe2 Fastest of three runs.
  • ocelescope
  • pm4py