Speed Benchmarks

This page compares the runtime of MacroModelling.jl against Dynare, the most widely used DSGE toolbox, on a set of example models. Both tools are timed performing the same tasks on identical models, across three operating systems and CPU architectures.

How to read the results

  • Models and their size. Each model is identified by its name together with a states / variables pair: the number of state variables and the total number of model variables. This pair gives a sense for model size and difficulty — for example Caldara_et_al_2012 (3/12) is among the smallest systems, while FRBUS (316/428) is the largest case shown here. Larger models shift the runtime towards the underlying linear-algebra (BLAS/LAPACK) cost.
  • Components. Timings are split by the step being measured. Jacobian and Hessian are the first- and second-order derivatives of the model equations that the perturbation solution needs; First-order solve and Second-order solve are the perturbation solutions at those orders; Third-order bundled is a combined timing for the full third-order pipeline (see the note below the table).
  • Speedup. A value of Nx means MacroModelling.jl is N times faster than Dynare for that component on that operating system — e.g. 4.8x is roughly five times faster, while 0.1x is about ten times slower (Dynare faster). The speedup and timing columns both run left-to-right as Linux (Ubuntu 24), macOS 26, and Windows 11.
  • Bold values mark representative conservative Windows cases. On Windows, Dynare runs on MATLAB with compiled mex files and Intel MKL — its fastest configuration — whereas the Linux and macOS rows run Dynare on Octave. The bold Windows speedups therefore act as a lower bound on the advantage of MacroModelling.jl.

Summary

  • Across the Windows solve rows, MacroModelling.jl still usually remains faster, from 1.1x on the largest stress case FRBUS (316/428 states/variables) up to 4.8x on the Smets_Wouters_2007 (26/66) second-order solve. In absolute terms, that spans from 111.79 ms versus 125.05 ms for the FRBUS first-order solve down to 18.3 μs versus 395.2 μs for the Caldara_et_al_2012 (3/12) second-order solve. Third-order bundled timings remain decisively in MacroModelling.jl's favour on Windows at 80.2x to 115.6x, corresponding to 736.3 μs versus 59.02 ms for Gali_2015_chapter_3_nonlinear and 176.6 μs versus 20.41 ms for Caldara_et_al_2012.
  • On Ubuntu 24 and macOS 26, the largest gains appear in derivative construction (the Jacobian and Hessian builds), and the effect is visible from very small to fairly large models. Small systems such as Caldara_et_al_2012 (3/12), FS2000 (4/16), and Gali_2015_chapter_3_nonlinear (4/23) build Jacobians in 0.5-1.2 μs and Hessians in 1.2-2.8 μs under MacroModelling.jl, while Dynare needs roughly 280 μs-2.5 ms for Jacobians and 891 μs-2.51 ms for Hessians. The same pattern extends to larger systems such as GNSS_2010 (38/66), QUEST3_2009 (58/107), and NAWM_EAUS_2008 (106/224), where MacroModelling.jl still stays in the 3.0-64.3 μs Jacobian range while Dynare takes 1.18-9.0 ms.
  • As model size grows, absolute solve times move from tens of microseconds for the smallest models to milliseconds and then low hundreds of milliseconds for the largest ones, but the ordering remains broadly stable across operating systems. The main exception is the Windows FRBUS Jacobian, where MATLAB mex files reduce Dynare's derivative cost to 49.1 μs versus 722.8 μs for MacroModelling.jl (a 0.1x speedup, i.e. Dynare is faster in that single case). Outside that case, Linux and macOS show the clearest speedups, while Windows narrows the gap without changing the overall picture that MacroModelling.jl scales better across the benchmark set.

Measurement notes

All timings reported below are single-thread measurements. Separate multithreaded thread-count sweeps increased runtime across the board for both MacroModelling.jl and Dynare, so only the single-thread results are shown here: in those multithreaded runs, orchestration and parallelisation overhead outweighed computational gains from additional threads.

The table is organised in perturbation-order blocks. The opening rows summarise the full machine and software stack, and each order block then repeats a compact header so the per-platform triplets remain readable in plain markdown.

Benchmark Timings

Speedup columns report how many times faster MacroModelling.jl is than Dynare for that component.

Perturbation OrderModelComponentSpeedupSpeedupSpeedupStates / VariablesMacroModelling.jlMacroModelling.jlMacroModelling.jlDynareDynareDynare
OSUbuntu 24macOS 26Windows 11Ubuntu 24macOS 26Windows 11Ubuntu 24macOS 26Windows 11
CPUAMD EPYC 7R13Apple M2Intel Alder LakeAMD EPYC 7R13Apple M2Intel Alder LakeAMD EPYC 7R13Apple M2Intel Alder Lake
CPU Architecturex86_64aarch64x86_64x86_64aarch64x86_64x86_64aarch64x86_64
Package version0.1.470.1.470.1.477.0.17.0.17.0
LanguageJulia 1.12.6Julia 1.12.6Julia 1.12.6Octave 11.1.0Octave 11.1.0MATLAB R2024b Update 6
BLAS/LAPACKOpenBLAS 0.3.29OpenBLAS 0.3.29OpenBLAS 0.3.29OpenBLAS 0.3.33OpenBLAS 0.3.33MKL 2024.1 / LAPACK 3.11.0
Perturbation OrderModelComponentSpeedupSpeedupSpeedupStates / VariablesMacroModelling.jlMacroModelling.jlMacroModelling.jlDynareDynareDynare
OSUbuntu 24macOS 26Windows 11Ubuntu 24macOS 26Windows 11Ubuntu 24macOS 26Windows 11
FirstCaldaraetal_2012Jacobian466.2x422.7x20.1x3/121.1 μs0.7 μs1.5 μs512.8 μs295.9 μs30.2 μs
First-order solve17.5x11.7x7.0x3/1221.5 μs15.4 μs13.3 μs376.9 μs180.0 μs92.7 μs
FRBUSJacobian14.8x52.5x0.1x316/428195.6 μs34.3 μs722.8 μs2.9 ms1.8 ms49.1 μs
First-order solve3.5x4.0x1.1x316/428102.65 ms84.2 ms111.79 ms356.89 ms337.31 ms125.05 ms
FS2000Jacobian617.5x558.4x17.7x4/160.8 μs0.5 μs0.6 μs494.0 μs279.2 μs10.6 μs
First-order solve9.3x7.2x2.8x4/1643.2 μs26.7 μs34.6 μs402.0 μs191.9 μs97.7 μs
GNSS_2010Jacobian274.7x453.3x5.1x38/668.3 μs3.0 μs9.4 μs2.28 ms1.36 ms48.4 μs
First-order solve1.9x1.7x2.2x38/661.24 ms967.9 μs1.13 ms2.33 ms1.6 ms2.48 ms
Gali2015chapter3nonlinearJacobian420.0x351.1x13.4x4/231.2 μs0.8 μs0.8 μs504.0 μs280.9 μs10.7 μs
First-order solve7.8x5.7x3.9x4/2357.1 μs37.0 μs37.5 μs448.0 μs212.0 μs145.1 μs
NAWMEAUS2008Jacobian140.0x154.5x1.2x106/22464.3 μs24.6 μs75.2 μs9.0 ms3.8 ms92.2 μs
First-order solve2.7x2.9x1.5x106/22416.59 ms13.29 ms13.67 ms44.07 ms39.1 ms21.06 ms
QUEST3_2009Jacobian115.7x295.0x1.6x58/10715.3 μs4.0 μs18.1 μs1.77 ms1.18 ms28.6 μs
First-order solve2.2x2.6x2.3x58/1072.45 ms1.68 ms2.07 ms5.37 ms4.41 ms4.85 ms
SmetsWouters2003Jacobian319.7x308.9x3.8x19/547.1 μs4.5 μs7.1 μs2.27 ms1.39 ms26.7 μs
First-order solve1.9x1.8x2.2x19/54698.5 μs474.9 μs589.4 μs1.34 ms831.8 μs1.3 ms
SmetsWouters2007Jacobian207.5x154.5x1.9x26/669.3 μs7.7 μs10.5 μs1.93 ms1.19 ms19.9 μs
First-order solve1.8x2.0x2.1x26/661.08 ms657.0 μs779.1 μs1.91 ms1.29 ms1.61 ms
Perturbation OrderModelComponentSpeedupSpeedupSpeedupStates / VariablesMacroModelling.jlMacroModelling.jlMacroModelling.jlDynareDynareDynare
OSUbuntu 24macOS 26Windows 11Ubuntu 24macOS 26Windows 11Ubuntu 24macOS 26Windows 11
SecondCaldaraetal_2012Hessian525.0x524.1x65.9x3/122.8 μs1.7 μs1.6 μs1.47 ms891.0 μs105.4 μs
Second-order solve16.0x5.1x21.6x3/1227.9 μs40.5 μs18.3 μs446.1 μs206.9 μs395.2 μs
FS2000Hessian1321.1x1291.7x22.1x4/161.9 μs1.2 μs2.4 μs2.51 ms1.55 ms53.0 μs
Second-order solve10.0x4.4x8.0x4/1653.0 μs57.6 μs70.6 μs531.0 μs255.1 μs564.6 μs
Gali2015chapter3nonlinearHessian595.8x605.4x33.0x4/232.4 μs1.5 μs1.6 μs1.43 ms908.1 μs52.8 μs
Second-order solve8.1x3.6x6.4x4/2378.4 μs90.5 μs67.2 μs635.5 μs329.0 μs429.5 μs
SmetsWouters2007Hessian1337.9x1251.1x36.5x26/666.6 μs4.5 μs4.2 μs8.83 ms5.63 ms153.1 μs
Second-order solve6.5x7.9x4.8x26/663.11 ms2.45 ms3.79 ms20.29 ms19.44 ms18.19 ms
Perturbation OrderModelComponentSpeedupSpeedupSpeedupStates / VariablesMacroModelling.jlMacroModelling.jlMacroModelling.jlDynareDynareDynare
OSUbuntu 24macOS 26Windows 11Ubuntu 24macOS 26Windows 11Ubuntu 24macOS 26Windows 11
ThirdCaldaraetal_2012Third-order bundled75.6x52.8x115.6x3/12275.4 μs235.9 μs176.6 μs20.81 ms12.46 ms20.41 ms
Gali2015chapter3nonlinearThird-order bundled42.6x33.8x80.2x4/23828.2 μs597.3 μs736.3 μs35.3 ms20.18 ms59.02 ms

Third-order bundled is not third-order-only on the MacroModelling side. In this harness it is first-order solve + Hessian + second-order solve + third-order derivatives + third-order solve, while Dynare reports the direct bundled k_order_pert timing.