Skip to content

Instantly share code, notes, and snippets.

@o-az
Created December 12, 2025 01:01
Show Gist options
  • Select an option

  • Save o-az/dfe8182d44347eb877e0aecc58937265 to your computer and use it in GitHub Desktop.

Select an option

Save o-az/dfe8182d44347eb877e0aecc58937265 to your computer and use it in GitHub Desktop.
<h1 id="evm-benchmark-results">EVM Benchmark Results</h1>
<p><em>Times shown are per-execution averages from 1 internal runs per benchmark.</em></p>
<table>
<thead>
<tr>
<th>Benchmark</th>
<th>Guillotine (ms)</th>
<th>REVM (ms)</th>
<th>ethrex (ms)</th>
<th>Guillotine-Rust (ms)</th>
<th>Guillotine-Go (ms)</th>
<th>Guillotine-Bun (ms)</th>
<th>Guillotine-Python (ms)</th>
<th>Fastest</th>
</tr>
</thead>
<tbody>
<tr>
<td>snailtracer</td>
<td>29.61</td>
<td>34.28</td>
<td>39.78</td>
<td>30.31</td>
<td>32.19</td>
<td>47.07</td>
<td>92.32</td>
<td>Guillotine</td>
</tr>
<tr>
<td>erc20transfer</td>
<td>1.44</td>
<td>1.61</td>
<td>1.78</td>
<td>1.66</td>
<td>3.54</td>
<td>19.29</td>
<td>64.13</td>
<td>Guillotine</td>
</tr>
<tr>
<td>erc20mint</td>
<td>1.30</td>
<td>1.51</td>
<td>1.63</td>
<td>1.63</td>
<td>3.42</td>
<td>18.48</td>
<td>65.07</td>
<td>Guillotine</td>
</tr>
<tr>
<td>erc20approval</td>
<td>1.72</td>
<td>2.19</td>
<td>2.46</td>
<td>2.10</td>
<td>4.23</td>
<td>20.28</td>
<td>70.00</td>
<td>Guillotine</td>
</tr>
<tr>
<td>ten-thousand-hashes</td>
<td>7.46</td>
<td>9.53</td>
<td>10.57</td>
<td>7.59</td>
<td>9.02</td>
<td>24.42</td>
<td>70.46</td>
<td>Guillotine</td>
</tr>
<tr>
<td>bubblesort</td>
<td>9.30</td>
<td>10.87</td>
<td>10.94</td>
<td>8.80</td>
<td>11.49</td>
<td>26.76</td>
<td>72.52</td>
<td>Guillotine-Rust</td>
</tr>
<tr>
<td>arithmetic</td>
<td>1.14</td>
<td>1.41</td>
<td>1.46</td>
<td>1.30</td>
<td>3.27</td>
<td>17.36</td>
<td>62.67</td>
<td>Guillotine</td>
</tr>
<tr>
<td>bitwise</td>
<td>1.41</td>
<td>1.85</td>
<td>1.99</td>
<td>1.58</td>
<td>3.06</td>
<td>18.84</td>
<td>64.01</td>
<td>Guillotine</td>
</tr>
<tr>
<td>blockinfo</td>
<td>1.12</td>
<td>1.38</td>
<td>1.32</td>
<td>1.26</td>
<td>3.33</td>
<td>18.90</td>
<td>64.70</td>
<td>Guillotine</td>
</tr>
<tr>
<td>calldata</td>
<td>1.11</td>
<td>1.50</td>
<td>1.89</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>Guillotine</td>
</tr>
<tr>
<td>codecopy</td>
<td>1.13</td>
<td>1.35</td>
<td>1.39</td>
<td>1.23</td>
<td>3.36</td>
<td>18.48</td>
<td>62.89</td>
<td>Guillotine</td>
</tr>
<tr>
<td>comparison</td>
<td>1.22</td>
<td>1.60</td>
<td>1.74</td>
<td>1.53</td>
<td>3.75</td>
<td>18.73</td>
<td>65.37</td>
<td>Guillotine</td>
</tr>
<tr>
<td>context</td>
<td>1.04</td>
<td>1.35</td>
<td>1.28</td>
<td>1.20</td>
<td>2.85</td>
<td>15.94</td>
<td>62.28</td>
<td>Guillotine</td>
</tr>
<tr>
<td>contractcalls</td>
<td>1.06</td>
<td>1.25</td>
<td>1.27</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>Guillotine</td>
</tr>
<tr>
<td>contractcreation</td>
<td>1.04</td>
<td>1.27</td>
<td>1.74</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>Guillotine</td>
</tr>
<tr>
<td>controlflow</td>
<td>1.27</td>
<td>1.31</td>
<td>1.37</td>
<td>1.27</td>
<td>3.05</td>
<td>18.58</td>
<td>64.56</td>
<td>Guillotine-Rust</td>
</tr>
<tr>
<td>externalcode</td>
<td>0.99</td>
<td>1.21</td>
<td>1.21</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>Guillotine</td>
</tr>
<tr>
<td>factorial</td>
<td>1.21</td>
<td>1.53</td>
<td>1.45</td>
<td>1.44</td>
<td>3.24</td>
<td>18.48</td>
<td>65.41</td>
<td>Guillotine</td>
</tr>
<tr>
<td>factorial-recursive</td>
<td>1.09</td>
<td>1.34</td>
<td>1.35</td>
<td>1.24</td>
<td>3.09</td>
<td>17.72</td>
<td>65.57</td>
<td>Guillotine</td>
</tr>
<tr>
<td>fibonacci</td>
<td>1.08</td>
<td>1.42</td>
<td>1.34</td>
<td>1.22</td>
<td>2.82</td>
<td>16.54</td>
<td>62.66</td>
<td>Guillotine</td>
</tr>
<tr>
<td>fibonacci-recursive</td>
<td>1.57</td>
<td>1.68</td>
<td>2.16</td>
<td>1.93</td>
<td>3.60</td>
<td>20.35</td>
<td>64.64</td>
<td>Guillotine</td>
</tr>
<tr>
<td>hashing</td>
<td>1.14</td>
<td>1.52</td>
<td>1.43</td>
<td>1.32</td>
<td>3.16</td>
<td>18.83</td>
<td>63.41</td>
<td>Guillotine</td>
</tr>
<tr>
<td>logs</td>
<td>1.06</td>
<td>1.33</td>
<td>1.50</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>Guillotine</td>
</tr>
<tr>
<td>manyhashes</td>
<td>1.50</td>
<td>2.14</td>
<td>1.83</td>
<td>2.03</td>
<td>3.49</td>
<td>20.26</td>
<td>62.86</td>
<td>Guillotine</td>
</tr>
<tr>
<td>memory</td>
<td>1.41</td>
<td>1.52</td>
<td>1.69</td>
<td>1.71</td>
<td>2.95</td>
<td>18.26</td>
<td>63.54</td>
<td>Guillotine</td>
</tr>
<tr>
<td>modulararithmetic</td>
<td>1.09</td>
<td>1.36</td>
<td>1.43</td>
<td>1.26</td>
<td>3.52</td>
<td>18.43</td>
<td>63.83</td>
<td>Guillotine</td>
</tr>
<tr>
<td>mstore</td>
<td>1.45</td>
<td>2.15</td>
<td>1.92</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>Guillotine</td>
</tr>
<tr>
<td>push</td>
<td>1.52</td>
<td>2.17</td>
<td>2.24</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>Guillotine</td>
</tr>
<tr>
<td>returndata</td>
<td>1.07</td>
<td>1.23</td>
<td>1.28</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>Guillotine</td>
</tr>
<tr>
<td>shifts</td>
<td>1.07</td>
<td>1.32</td>
<td>1.52</td>
<td>1.22</td>
<td>2.94</td>
<td>18.73</td>
<td>64.30</td>
<td>Guillotine</td>
</tr>
<tr>
<td>signedarithmetic</td>
<td>1.21</td>
<td>1.53</td>
<td>1.52</td>
<td>1.44</td>
<td>3.07</td>
<td>18.29</td>
<td>63.78</td>
<td>Guillotine</td>
</tr>
<tr>
<td>sstore</td>
<td>1.10</td>
<td>1.98</td>
<td>1.92</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>0.00</td>
<td>Guillotine</td>
</tr>
<tr>
<td>storage</td>
<td>1.39</td>
<td>1.66</td>
<td>1.66</td>
<td>1.53</td>
<td>3.14</td>
<td>18.50</td>
<td>64.02</td>
<td>Guillotine</td>
</tr>
</tbody>
</table>
<h2 id="summary">Summary</h2>
<p>Average execution time per benchmark:</p>
<ul>
<li>Guillotine: 2.52ms</li>
<li>REVM: 3.07ms</li>
<li>ethrex: 3.34ms</li>
<li>Guillotine Rust: 2.36ms</li>
<li>Guillotine Go: 3.68ms</li>
<li>Guillotine Bun: 14.77ms</li>
<li>Guillotine Python: 48.03ms</li>
</ul>
<h2 id="known-issues">Known Issues</h2>
<p><strong>Note:</strong> Guillotine FFI implementations (Rust, Bun, Python, Go) have known bugs causing some benchmarks to fail (shown as 0.00ms).
These failures typically occur on benchmarks involving state modifications, memory operations, or complex call operations.
The native Guillotine (Zig) implementation does not have these issues.</p>
<hr>
<p><em>Generated by EVM Benchmark Suite</em></p>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment