Repository: smarr/ReBench (language: python)

Issue:
Add support for profiling benchmarks and reporting results to ReBenchDB
Looking at changes in benchmark numbers is unfortunately rarely very insightful by itself.

To understand what benchmarks spend their time on, it would be useful to add support for profiling.
Once upon a time, we had support for it already (for details: https://github.com/smarr/ReBench/issues/18, https://github.com/smarr/ReBench/pull/9, code removal: https://github.com/smarr/ReBench/commit/6e6e2511baf42e6c8c69a32d65ee5e0545ad0fcc)

At this point in time, I am looking for having support for function profiling of interpreters with `perf`, Xcode Instruments, or perhaps Java's Flight Recorder.

Most urgent for me is the ability to profile the executors. One may perhaps also want to be able to profile the benchmarks themselves. Here the difference would be at which level profiling is done. So, at the VM or the application level.

## Desired Features
 - make profiling information available where we analyze performance
 - define profiling commands/parameters for executors and benchmark suites
 - add a profiling execution mode or experiment setup to use the profiling commands/parameters
 - collect profiling information, extract the basic data and send to ReBenchDB for storage

## ReBenchDB Mockup

An integration in ReBenchDB could include a new unfoldable section, which shows the basic profile. In this case, it's showing the result of:

```
perf record -g -F 9999 --call-graph lbr ./som-native-interp-ast -cp Smalltalk:Examples/Benchmarks/LanguageFeatures Examples/Benchmarks/BenchmarkHarness.som Dispatch 10 0 20
perf report -g graph --no-children --stdio
```

<img width="670" alt="Screen Shot 2021-11-02 at 19 28 33" src="https://user-images.githubusercontent.com/40815/140036832-176b5169-dbaa-405a-ab0b-8672ca58edfb.png">

Once we have the data, we may also want a feature to compare profiles, similar to performance. Depending on the profiling data collected, which may be relative to the overall run time, it might be necessary to consider the actual run time to judge the differences, for instance to avoid showing increase where the overall time actually decreased but the relative parts increase.

<img width="721" alt="Screen Shot 2021-11-03 at 09 09 22" src="https://user-images.githubusercontent.com/40815/140037828-b2154701-a865-4056-b5b7-acc2efe21e04.png">

## Design Considerations

### Integration with Benchmarking

For the seamless integration with benchmarking, we need to be able to match benchmark data with profiling data.
This mean, internally, things need to end up having the same RunId.
That is, a specific profiling Run needs to be identified by the command line of the original benchmark Run.

Currently, we use those RunIds also to store data, track progress, etc.

It seems like I should probably leave the handling of RunIds alone.
And also track completion differently, if at all.

One way of doing it would be to have a different way of executing things.
`rebench.executor.Executor` works together with the `RunScheduler` to identify the runs to be executed, and composing of the final command line.

When composing the final command line for profiling, we need to consider the details for the profiler. This could perhaps be realized as a gauge_adapter?

Though, do I track completion? One way might be simply in a different data store, where only the details needed for completion on tracked, and possibly profiling results.

### Machine Setup, Denoise

For benchmarking, we may want to reduce interference, and possible profiling interrupts as much as possible.
For profiling on the other hand, we may want to configure the machine mostly for profiling.
I don't know whether these settings make a practical difference for benchmarks, if no profiling is actually done.
Though, I guess there might be a difference?

So, in the unlikely event that there is, one may want to run benchmarks and profiling with different machine setups.

At the moment, we run denoise at the start, before running benchmarks, and then disable it afterwards. Thus, we don't do it before every benchmark.

To keep it like this, it means, we need to keep profiling and benchmark separate.
But since the benchmarking and profiling configurations likely result in the same experiments, which ReBench currently doesn't handle, this is likely a good idea anyway.

### TODO

 - [x] add a basic implementation supporting perf to ReBench
 - [x] parse data and send compact representation to ReBenchDB
 - [ ] instead of a stats summary, show perhaps the first 3-4 lines of the profile in the summary after a ReBench run
 - [ ] add support for other profilers, perhaps just for running. May need ways to define output files, as well as profiler selection

[T.1.4] Automatic Profiling
Add support for profiling benchmarks and compare the resulting profiles.

This is basically #166.
Parser for perf output fails on some input
The input in the details section below fails parsing.

<details>

```
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 2K of event 'cycles'
# Event count (approx.): 489991153
#
# Overhead  Command          Shared Object       Symbol                                                                                                                  
# ........  ...............  ..................  ........................................................................................................................
#
     7.81%  truffleruby      librubyvm.so        [.] ReadLocalVariableNodeGen_execute_2075fcc8bbcb59d28eaf5fd77a5a207da0f49183
            |          
            |--6.51%--ReadLocalVariableNodeGen_execute_2075fcc8bbcb59d28eaf5fd77a5a207da0f49183
            |          |          
            |          |--2.70%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
            |          |          |          
            |          |           --1.78%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     |          
            |          |                      --1.63%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |          
            |          |--2.02%--InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
            |          |          |          
            |          |          |--1.35%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
            |          |          |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |          |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |          |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |          |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |          |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |          |          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |          |          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |          |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |          |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |          |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |          |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |          |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |          |          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |          |          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |          |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |          |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |          |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |          |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |          |          |          
            |          |          |           --1.27%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |          |          
            |          |           --0.68%--InlinedGreaterThanNodeGen_execute_2d9d85c60013444a3351cfbf61d02b21fd54cc04
            |          |                     BooleanCastNodeGen_executeBoolean_612509002dcc5231dd8f6fc2e114d50d12cf4334
            |          |                     IfNode_execute_dde8de1b3b131f8b7d2804d1a501baf38aa94133
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     |          
            |          |                      --0.56%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |          
            |          |--0.67%--InlinedSubNodeGen_execute_0b0151703425bb224e5e6d7acfbd5df707201e2d
            |          |          |          
            |          |           --0.64%--InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
            |          |                     WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |          
            |           --0.56%--InlinedLessThanNodeGen_execute_7f9f4d32c64d9e91750a61121bb4665e85b416e1
            |          
             --1.11%--page_fault
                       ReadLocalVariableNodeGen_execute_2075fcc8bbcb59d28eaf5fd77a5a207da0f49183
                       |          
                        --0.67%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
     6.86%  truffleruby      librubyvm.so        [.] Assumption_isValidAssumption_06c4fd2f51b332246ecb3402c09b9bc210519023
            |          
            |--5.67%--Assumption_isValidAssumption_06c4fd2f51b332246ecb3402c09b9bc210519023
            |          |          
            |           --5.63%--Assumption_isValidAssumption_0deffedc759de8bbe569556f1fd9292d2f416fe4
            |                     |          
            |                     |--2.18%--InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
            |                     |          |          
            |                     |          |--1.39%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
            |                     |          |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |          |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |          |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |          |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |          |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |          |          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     |          |          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     |          |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |          |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |          |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |          |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |          |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |          |          |          
            |                     |          |           --1.35%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     |          |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |          |                     |          
            |                     |          |                      --1.27%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |          |          
            |                     |           --0.79%--InlinedGreaterThanNodeGen_execute_2d9d85c60013444a3351cfbf61d02b21fd54cc04
            |                     |                     BooleanCastNodeGen_executeBoolean_612509002dcc5231dd8f6fc2e114d50d12cf4334
            |                     |                     IfNode_execute_dde8de1b3b131f8b7d2804d1a501baf38aa94133
            |                     |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |          
            |                     |--2.02%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
            |                     |          |          
            |                     |          |--0.95%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
            |                     |          |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |          |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |          |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |          |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |          |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |          |          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     |          |          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     |          |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |          |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |          |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |          |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |          |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |          |          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     |          |          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     |          |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |          |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |          |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |          |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |          |          |          
            |                     |          |           --0.91%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |          |          
            |                     |          |--0.56%--InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
            |                     |          |          WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
            |                     |          |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |          |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |          |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |          |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |          |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |          |          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     |          |          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     |          |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |          |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |          |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |          |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |          |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |          |          |          
            |                     |          |           --0.52%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     |          |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |          |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |          |          
            |                     |           --0.52%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
            |                     |                     InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
            |                     |                     WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
            |                     |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     |          
            |                      --0.52%--InlinedLessThanNodeGen_execute_7f9f4d32c64d9e91750a61121bb4665e85b416e1
            |                                AndNode_execute_10697adfe3d9e331728f142b40f667d899b77693
            |                                BooleanCastNodeGen_executeBoolean_612509002dcc5231dd8f6fc2e114d50d12cf4334
            |                                WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                                RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                                OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                                WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                                CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                                RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                                SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                                WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                                RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                                OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                                WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                                CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                                RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                                SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                                WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                                RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          
            |--0.63%--OptimizedAssumption_isValid_6389d0fad2bf47761d23d63de3fa9b267ddc967b
            |          Assumption_isValidAssumption_06c4fd2f51b332246ecb3402c09b9bc210519023
            |          Assumption_isValidAssumption_0deffedc759de8bbe569556f1fd9292d2f416fe4
            |          
             --0.56%--Assumption_isValidAssumption_0deffedc759de8bbe569556f1fd9292d2f416fe4
     5.44%  truffleruby      librubyvm.so        [.] Assumption_isValidAssumption_0deffedc759de8bbe569556f1fd9292d2f416fe4
            |          
            |--4.80%--Assumption_isValidAssumption_0deffedc759de8bbe569556f1fd9292d2f416fe4
            |          |          
            |          |--1.83%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
            |          |          |          
            |          |           --1.03%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     |          
            |          |                      --0.95%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |          
            |          |--1.59%--InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
            |          |          |          
            |          |           --1.19%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                     |          
            |          |                      --1.15%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |                                WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |          |                                CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |          |                                RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |          |                                SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |          |                                WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |          |                                RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |          |                                |          
            |          |                                 --0.99%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          |          
            |           --0.60%--InlinedSubNodeGen_execute_0b0151703425bb224e5e6d7acfbd5df707201e2d
            |                     InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
            |                     WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
            |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
            |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
            |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
            |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
            |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
            |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |          
             --0.52%--Assumption_isValidAssumption_06c4fd2f51b332246ecb3402c09b9bc210519023
                       Assumption_isValidAssumption_0deffedc759de8bbe569556f1fd9292d2f416fe4
     5.08%  truffleruby      librubyvm.so        [.] InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
            |          
             --4.84%--InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
                       |          
                       |--3.65%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                       |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       |          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          |          
                       |           --3.57%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |                     |          
                       |                      --3.49%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          
                        --1.19%--InlinedGreaterThanNodeGen_execute_2d9d85c60013444a3351cfbf61d02b21fd54cc04
                                  BooleanCastNodeGen_executeBoolean_612509002dcc5231dd8f6fc2e114d50d12cf4334
                                  IfNode_execute_dde8de1b3b131f8b7d2804d1a501baf38aa94133
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  |          
                                   --1.15%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
     4.80%  truffleruby      librubyvm.so        [.] WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
            |          
             --4.52%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                       |          
                        --4.40%--RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  |          
                                   --4.29%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                             CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                             |          
                                              --4.21%--RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                                        SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                                        WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                                        RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                                        |          
                                                         --4.09%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                                                   |          
                                                                    --0.55%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
     4.76%  truffleruby      librubyvm.so        [.] InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
            |          
             --4.44%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
                       |          
                       |--2.10%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                       |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       |          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       |          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |          |          
                       |           --2.06%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          
                       |--1.31%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
                       |          InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
                       |          WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                       |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       |          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       |          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |          |          
                       |           --1.19%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          
                        --1.03%--InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
                                  WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  |          
                                   --0.99%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                             CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                             RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                             SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                             WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                             RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                             OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
     3.25%  truffleruby      librubyvm.so        [.] GreyObjectsWalker_walkGreyObjects_e59a80a81022647b793f2f995d251cf18cbcbab4
            |
            ---GreyObjectsWalker_walkGreyObjects_e59a80a81022647b793f2f995d251cf18cbcbab4
               |          
               |--1.65%--OldGeneration_scanGreyObjects_a53581b0f8a68acd00124c8934ac4a137d22771f
               |          GCImpl_scanGreyObjects_58c2ee47e000462416451fb2afdb5838c25cf045
               |          GCImpl_cheneyScanFromRoots_02fdc07687b04990522d42191c41890e9ae45333
               |          GCImpl_scavenge_b7271340e4da983a7681bb635dfa2dfffa6ce7ba
               |          GCImpl_doCollectOnce_b497b60e1b6c478646e130874225bfe62a9553d1
               |          GCImpl_doCollectImpl_fbd075fd8f6a582cb98120cb239cf3c0b6b9e194
               |          GCImpl_collectImpl_af095920dbe6b2b45d9952e011246050fab95516
               |          GCImpl_collectOperation_ed357ac3395b351b396449f161fbdf4e10072716
               |          GCImpl$CollectionVMOperation_operate_66fd1b21148832fcbb89249bb3bb3d2b830eaf79
               |          VMOperation_execute_58740434efda785fa124068a49feed361ad4a2b9
               |          VMOperationControl$WorkQueues_drain_0f0481fc351b0ba4ff533185117d85969237dbbf
               |          VMOperationControl$WorkQueues_executeAllQueuedVMOperations_f857a99d4236077ebd4579d580c21458b5ca3ea1
               |          VMOperationControl$WorkQueues_enqueueAndExecute_ab94e6b59bf62abe2fd68824c94f4e3e89ee1fec
               |          VMOperationControl_enqueue_03e7b9db64ca751377c28fff6e469d5ec4037d0d
               |          NativeVMOperation_enqueue_049b944802b20d390256d99e8e68888be24b8a3b
               |          GCImpl_collectWithoutAllocating_7b5a2f4b33834a1092beae4b5758ad4f755a6f25
               |          GCImpl_maybeCollectOnAllocation_2f1035515c6a41b10122086ba472b562d017fbcf
               |          ThreadLocalAllocation_slowPathNewInstanceWithoutAllocating_c1e47c63f179ee3cf26bd8b9e5c51627b678a880
               |          ThreadLocalAllocation_slowPathNewInstance_39ae850940ab632d109995344de15fd9d3b31d84
               |          WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
               |          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
               |          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
               |          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
               |          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
               |          
                --1.60%--YoungGeneration_scanGreyObjects_c35d3cb5fa4af6e0a762dc16e96320865b1e2ebb
                          GCImpl_scanGreyObjectsLoop_63c2512b14cdc4d5e20334f93c9e9545c5cc9ad7
                          GCImpl_scanGreyObjects_58c2ee47e000462416451fb2afdb5838c25cf045
                          GCImpl_cheneyScanFromDirtyRoots_38e2f549830d39bed60fc139ea601adffadffc8a
                          GCImpl_scavenge_b7271340e4da983a7681bb635dfa2dfffa6ce7ba
                          GCImpl_doCollectOnce_b497b60e1b6c478646e130874225bfe62a9553d1
                          GCImpl_doCollectImpl_fbd075fd8f6a582cb98120cb239cf3c0b6b9e194
                          GCImpl_collectImpl_af095920dbe6b2b45d9952e011246050fab95516
                          GCImpl_collectOperation_ed357ac3395b351b396449f161fbdf4e10072716
                          GCImpl$CollectionVMOperation_operate_66fd1b21148832fcbb89249bb3bb3d2b830eaf79
                          VMOperation_execute_58740434efda785fa124068a49feed361ad4a2b9
                          VMOperationControl$WorkQueues_drain_0f0481fc351b0ba4ff533185117d85969237dbbf
                          VMOperationControl$WorkQueues_executeAllQueuedVMOperations_f857a99d4236077ebd4579d580c21458b5ca3ea1
                          VMOperationControl$WorkQueues_enqueueAndExecute_ab94e6b59bf62abe2fd68824c94f4e3e89ee1fec
                          VMOperationControl_enqueue_03e7b9db64ca751377c28fff6e469d5ec4037d0d
                          NativeVMOperation_enqueue_049b944802b20d390256d99e8e68888be24b8a3b
                          GCImpl_collectWithoutAllocating_7b5a2f4b33834a1092beae4b5758ad4f755a6f25
                          GCImpl_maybeCollectOnAllocation_2f1035515c6a41b10122086ba472b562d017fbcf
                          ThreadLocalAllocation_slowPathNewInstanceWithoutAllocating_c1e47c63f179ee3cf26bd8b9e5c51627b678a880
                          ThreadLocalAllocation_slowPathNewInstance_39ae850940ab632d109995344de15fd9d3b31d84
                          WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
     3.13%  truffleruby      librubyvm.so        [.] SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
            |
            ---SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
               WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
               RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
               OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
               WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
               CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
               RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
               SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
               WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
               RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
               OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
               |          
                --3.02%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                          |          
                           --2.98%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
     2.58%  truffleruby      librubyvm.so        [.] FrameWithoutBoxing_getDouble_f6230eb152b2a9b3acbaab69411fe61b7aeae3bd
            |          
             --2.50%--FrameWithoutBoxing_getDouble_f6230eb152b2a9b3acbaab69411fe61b7aeae3bd
                       FrameUtil_getDoubleSafe_233e542a8fc82e2abcfb7a94f152c39b35e6d40b
                       ReadLocalVariableNodeGen_execute_2075fcc8bbcb59d28eaf5fd77a5a207da0f49183
                       |          
                       |--1.07%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
                       |          |          
                       |           --0.75%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                       |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          
                       |--0.87%--InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
                       |          
                        --0.56%--InlinedSubNodeGen_execute_0b0151703425bb224e5e6d7acfbd5df707201e2d
                                  InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
                                  WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  |          
                                   --0.52%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
     2.26%  truffleruby      librubyvm.so        [.] FrameWithoutBoxing_getTag_c8c84e28338fa683568825d1eabc6f2ffa029d80
            |          
             --2.10%--FrameWithoutBoxing_getTag_c8c84e28338fa683568825d1eabc6f2ffa029d80
                       |          
                        --2.06%--ReadLocalVariableNodeGen_execute_2075fcc8bbcb59d28eaf5fd77a5a207da0f49183
                                  |          
                                  |--0.87%--InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
                                  |          |          
                                  |           --0.60%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                                  |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  |                     WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  |                     CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  |                     OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  |                     |          
                                  |                      --0.56%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  |                                CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  |                                RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  |                                SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  |                                WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  |                                RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  |                                OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  |          
                                   --0.79%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
     2.02%  truffleruby      librubyvm.so        [.] FrameWithoutBoxing_verifyGet_aee658d3c795abc8559226f806d7d7641d1a512f
            |          
            |--1.39%--FrameWithoutBoxing_verifyGet_aee658d3c795abc8559226f806d7d7641d1a512f
            |          |          
            |           --1.15%--FrameWithoutBoxing_getDouble_f6230eb152b2a9b3acbaab69411fe61b7aeae3bd
            |                     FrameUtil_getDoubleSafe_233e542a8fc82e2abcfb7a94f152c39b35e6d40b
            |                     ReadLocalVariableNodeGen_execute_2075fcc8bbcb59d28eaf5fd77a5a207da0f49183
            |                     |          
            |                      --0.68%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
            |          
             --0.63%--FrameWithoutBoxing_getTagChecked_25549fd2b9577ab3036eb10fb758cf1783525199
                       FrameWithoutBoxing_verifyGet_aee658d3c795abc8559226f806d7d7641d1a512f
                       |          
                        --0.56%--FrameWithoutBoxing_getDouble_f6230eb152b2a9b3acbaab69411fe61b7aeae3bd
                                  FrameUtil_getDoubleSafe_233e542a8fc82e2abcfb7a94f152c39b35e6d40b
                                  ReadLocalVariableNodeGen_execute_2075fcc8bbcb59d28eaf5fd77a5a207da0f49183
     2.02%  truffleruby      librubyvm.so        [.] OptimizedAssumption_isValid_6389d0fad2bf47761d23d63de3fa9b267ddc967b
            |          
             --1.98%--OptimizedAssumption_isValid_6389d0fad2bf47761d23d63de3fa9b267ddc967b
                       Assumption_isValidAssumption_06c4fd2f51b332246ecb3402c09b9bc210519023
                       |          
                        --1.94%--Assumption_isValidAssumption_0deffedc759de8bbe569556f1fd9292d2f416fe4
                                  |          
                                  |--0.83%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
                                  |          
                                   --0.60%--InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
     1.77%  truffleruby      librubyvm.so        [.] AlignedChunkRememberedSet_walkDirtyObjects_09e7d61e997b28f49a6ff5fbcfc2910471b4cc9f
            |
            ---AlignedChunkRememberedSet_walkDirtyObjects_09e7d61e997b28f49a6ff5fbcfc2910471b4cc9f
               |          
                --1.69%--GCImpl_blackenDirtyImageHeapChunkRoots_6ba2cfb080608e07e2d4e333ec3b0acbd2dc3520
                          GCImpl_blackenDirtyImageHeapRoots_ff6a91da85ab342231e3b187699ec441fa079b38
                          |          
                          |--1.10%--GCImpl_cheneyScanFromDirtyRoots_38e2f549830d39bed60fc139ea601adffadffc8a
                          |          GCImpl_scavenge_b7271340e4da983a7681bb635dfa2dfffa6ce7ba
                          |          GCImpl_doCollectOnce_b497b60e1b6c478646e130874225bfe62a9553d1
                          |          GCImpl_doCollectImpl_fbd075fd8f6a582cb98120cb239cf3c0b6b9e194
                          |          GCImpl_collectImpl_af095920dbe6b2b45d9952e011246050fab95516
                          |          GCImpl_collectOperation_ed357ac3395b351b396449f161fbdf4e10072716
                          |          GCImpl$CollectionVMOperation_operate_66fd1b21148832fcbb89249bb3bb3d2b830eaf79
                          |          VMOperation_execute_58740434efda785fa124068a49feed361ad4a2b9
                          |          VMOperationControl$WorkQueues_drain_0f0481fc351b0ba4ff533185117d85969237dbbf
                          |          VMOperationControl$WorkQueues_executeAllQueuedVMOperations_f857a99d4236077ebd4579d580c21458b5ca3ea1
                          |          VMOperationControl$WorkQueues_enqueueAndExecute_ab94e6b59bf62abe2fd68824c94f4e3e89ee1fec
                          |          VMOperationControl_enqueue_03e7b9db64ca751377c28fff6e469d5ec4037d0d
                          |          NativeVMOperation_enqueue_049b944802b20d390256d99e8e68888be24b8a3b
                          |          GCImpl_collectWithoutAllocating_7b5a2f4b33834a1092beae4b5758ad4f755a6f25
                          |          GCImpl_maybeCollectOnAllocation_2f1035515c6a41b10122086ba472b562d017fbcf
                          |          ThreadLocalAllocation_slowPathNewInstanceWithoutAllocating_c1e47c63f179ee3cf26bd8b9e5c51627b678a880
                          |          ThreadLocalAllocation_slowPathNewInstance_39ae850940ab632d109995344de15fd9d3b31d84
                          |          |          
                          |           --0.63%--WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                          |                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                          |                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                          |                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                          |                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                          |          
                           --0.59%--GCImpl_cheneyScanFromRoots_02fdc07687b04990522d42191c41890e9ae45333
                                     GCImpl_scavenge_b7271340e4da983a7681bb635dfa2dfffa6ce7ba
                                     GCImpl_doCollectOnce_b497b60e1b6c478646e130874225bfe62a9553d1
                                     GCImpl_doCollectImpl_fbd075fd8f6a582cb98120cb239cf3c0b6b9e194
                                     GCImpl_collectImpl_af095920dbe6b2b45d9952e011246050fab95516
                                     GCImpl_collectOperation_ed357ac3395b351b396449f161fbdf4e10072716
                                     GCImpl$CollectionVMOperation_operate_66fd1b21148832fcbb89249bb3bb3d2b830eaf79
                                     VMOperation_execute_58740434efda785fa124068a49feed361ad4a2b9
                                     VMOperationControl$WorkQueues_drain_0f0481fc351b0ba4ff533185117d85969237dbbf
                                     VMOperationControl$WorkQueues_executeAllQueuedVMOperations_f857a99d4236077ebd4579d580c21458b5ca3ea1
                                     VMOperationControl$WorkQueues_enqueueAndExecute_ab94e6b59bf62abe2fd68824c94f4e3e89ee1fec
                                     VMOperationControl_enqueue_03e7b9db64ca751377c28fff6e469d5ec4037d0d
                                     NativeVMOperation_enqueue_049b944802b20d390256d99e8e68888be24b8a3b
                                     GCImpl_collectWithoutAllocating_7b5a2f4b33834a1092beae4b5758ad4f755a6f25
                                     GCImpl_maybeCollectOnAllocation_2f1035515c6a41b10122086ba472b562d017fbcf
                                     ThreadLocalAllocation_slowPathNewInstanceWithoutAllocating_c1e47c63f179ee3cf26bd8b9e5c51627b678a880
                                     ThreadLocalAllocation_slowPathNewInstance_39ae850940ab632d109995344de15fd9d3b31d84
                                     WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                                     RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                     SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                     WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                     RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
     1.75%  truffleruby      librubyvm.so        [.] IfNode_execute_dde8de1b3b131f8b7d2804d1a501baf38aa94133
            |
            ---IfNode_execute_dde8de1b3b131f8b7d2804d1a501baf38aa94133
               |          
                --1.71%--RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                          OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                          WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                          RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                          SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                          WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                          RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                          |          
                           --1.59%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
     1.72%  truffleruby      [kernel.kallsyms]   [k] native_irq_return_iret
     1.67%  truffleruby      librubyvm.so        [.] FrameWithoutBoxing_setDouble_aa7f724ac27ab889492a5e71b2b42811b8174851
            |          
             --1.59%--FrameWithoutBoxing_setDouble_aa7f724ac27ab889492a5e71b2b42811b8174851
                       WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                       RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       |          
                        --1.55%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
     1.62%  truffleruby      librubyvm.so        [.] FrameWithoutBoxing_getTagChecked_25549fd2b9577ab3036eb10fb758cf1783525199
            |          
             --1.27%--FrameWithoutBoxing_getTagChecked_25549fd2b9577ab3036eb10fb758cf1783525199
                       FrameWithoutBoxing_verifyGet_aee658d3c795abc8559226f806d7d7641d1a512f
                       |          
                        --0.99%--FrameWithoutBoxing_getDouble_f6230eb152b2a9b3acbaab69411fe61b7aeae3bd
                                  FrameUtil_getDoubleSafe_233e542a8fc82e2abcfb7a94f152c39b35e6d40b
                                  ReadLocalVariableNodeGen_execute_2075fcc8bbcb59d28eaf5fd77a5a207da0f49183
                                  |          
                                   --0.55%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
     1.55%  truffleruby      librubyvm.so        [.] FrameUtil_getDoubleSafe_233e542a8fc82e2abcfb7a94f152c39b35e6d40b
            |          
             --1.07%--FrameUtil_getDoubleSafe_233e542a8fc82e2abcfb7a94f152c39b35e6d40b
                       ReadLocalVariableNodeGen_execute_2075fcc8bbcb59d28eaf5fd77a5a207da0f49183
                       |          
                        --0.67%--InlinedMulNodeGen_execute_10b054e8a0b93ba557a101fd1c221b21f9843240
     1.51%  truffleruby      librubyvm.so        [.] InlinedSubNodeGen_execute_0b0151703425bb224e5e6d7acfbd5df707201e2d
            |          
             --1.47%--InlinedSubNodeGen_execute_0b0151703425bb224e5e6d7acfbd5df707201e2d
                       |          
                        --1.35%--InlinedAddNodeGen_execute_16c2c87351e2a54618107518947385a3e2b27ff7
                                  WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  |          
                                   --1.31%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                             CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                             RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                             SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                             WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                             RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                             |          
                                              --1.23%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
     1.23%  truffleruby      [kernel.kallsyms]   [k] clear_page_erms
            |          
             --1.19%--clear_page_erms
                       get_page_from_freelist
                       __alloc_pages_nodemask
                       |          
                        --1.15%--alloc_pages_vma
                                  |          
                                   --1.03%--do_anonymous_page
                                             __handle_mm_fault
                                             handle_mm_fault
                                             do_user_addr_fault
                                             __do_page_fault
                                             do_page_fault
                                             page_fault
     1.07%  truffleruby      [kernel.kallsyms]   [k] sync_regs
            |
            ---sync_regs
     0.99%  truffleruby      librubyvm.so        [.] InlinedGreaterThanNodeGen_execute_2d9d85c60013444a3351cfbf61d02b21fd54cc04
            |          
             --0.95%--InlinedGreaterThanNodeGen_execute_2d9d85c60013444a3351cfbf61d02b21fd54cc04
                       BooleanCastNodeGen_executeBoolean_612509002dcc5231dd8f6fc2e114d50d12cf4334
                       IfNode_execute_dde8de1b3b131f8b7d2804d1a501baf38aa94133
                       RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          
                        --0.91%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
     0.95%  truffleruby      librubyvm.so        [.] InlinedLessThanNodeGen_execute_7f9f4d32c64d9e91750a61121bb4665e85b416e1
            |          
             --0.83%--InlinedLessThanNodeGen_execute_7f9f4d32c64d9e91750a61121bb4665e85b416e1
                       |          
                        --0.79%--AndNode_execute_10697adfe3d9e331728f142b40f667d899b77693
                                  BooleanCastNodeGen_executeBoolean_612509002dcc5231dd8f6fc2e114d50d12cf4334
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                                  WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  |          
                                   --0.75%--OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
     0.90%  gnal Dispatcher  [kernel.kallsyms]   [k] zap_pte_range.isra.0
            |
            ---zap_pte_range.isra.0
               unmap_page_range
               unmap_single_vma
               unmap_vmas
               exit_mmap
               mmput
               do_exit
               do_group_exit
               get_signal
               do_signal
               exit_to_usermode_loop
               do_syscall_64
               entry_SYSCALL_64_after_hwframe
     0.84%  truffleruby      [kernel.kallsyms]   [k] filemap_map_pages
            |
            ---filemap_map_pages
               do_fault
               __handle_mm_fault
               handle_mm_fault
               do_user_addr_fault
               __do_page_fault
               do_page_fault
               page_fault
     0.83%  truffleruby      [kernel.kallsyms]   [k] rmqueue
            |
            ---rmqueue
               get_page_from_freelist
               __alloc_pages_nodemask
               alloc_pages_vma
               |          
                --0.79%--do_anonymous_page
                          __handle_mm_fault
                          handle_mm_fault
                          do_user_addr_fault
                          __do_page_fault
                          do_page_fault
                          page_fault
     0.75%  truffleruby      librubyvm.so        [.] NodeUtil_deepCopyImpl_25fe7233f2542be9387b266657bf9048b1ba0eb2
            |
            ---NodeUtil_deepCopyImpl_25fe7233f2542be9387b266657bf9048b1ba0eb2
               NodeUtil_deepCopyImpl_25fe7233f2542be9387b266657bf9048b1ba0eb2
               |          
                --0.71%--NodeUtil_deepCopyImpl_25fe7233f2542be9387b266657bf9048b1ba0eb2
                          NodeUtil_deepCopyImpl_25fe7233f2542be9387b266657bf9048b1ba0eb2
                          |          
                           --0.55%--NodeUtil_deepCopyImpl_25fe7233f2542be9387b266657bf9048b1ba0eb2
     0.71%  truffleruby      librubyvm.so        [.] FrameWithoutBoxing_verifySet_00a666aee1370641b3828b725b2e27babb8e0c8a
            |          
             --0.67%--FrameWithoutBoxing_verifySet_00a666aee1370641b3828b725b2e27babb8e0c8a
     0.71%  truffleruby      librubyvm.so        [.] BooleanCastNodeGen_executeBoolean_612509002dcc5231dd8f6fc2e114d50d12cf4334
            |
            ---BooleanCastNodeGen_executeBoolean_612509002dcc5231dd8f6fc2e114d50d12cf4334
     0.68%  truffleruby      ld-2.31.so          [.] _dl_relocate_object
     0.65%  gnal Dispatcher  [kernel.kallsyms]   [k] free_pcppages_bulk
            |
            ---free_pcppages_bulk
               free_unref_page_commit
               free_unref_page_list
               release_pages
               free_pages_and_swap_cache
               tlb_flush_mmu
               |          
                --0.57%--zap_pte_range.isra.0
                          unmap_page_range
                          unmap_single_vma
                          unmap_vmas
                          exit_mmap
                          mmput
                          do_exit
                          do_group_exit
                          get_signal
                          do_signal
                          exit_to_usermode_loop
                          do_syscall_64
                          entry_SYSCALL_64_after_hwframe
     0.63%  truffleruby      librubyvm.so        [.] OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
            |
            ---OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
               WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
               CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
               RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
               SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
               WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
               RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
               OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
               |          
                --0.52%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                          CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
     0.63%  truffleruby      [kernel.kallsyms]   [k] _raw_spin_lock
            |          
             --0.63%--_raw_spin_lock
     0.60%  truffleruby      librubyvm.so        [.] WriteLocalVariableNode_checkKind_b7fa448c5dc6226de4816bcc178a6349e90490a1
            |          
             --0.56%--WriteLocalVariableNode_checkKind_b7fa448c5dc6226de4816bcc178a6349e90490a1
                       WriteLocalVariableNodeGen_execute_e3f27d23937062fa4d8b15012b263a36c7381760
                       RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                       CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                       RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                       SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                       WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                       RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                       OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
                       |          
                        --0.52%--WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
                                  CatchBreakNode_execute_15234e43e0ed35890ab7beb5f388c01cc12e66d4
                                  RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
                                  SequenceNode_doExecuteVoid_0cd2e3e1dc7c72fa73fdf82fe5c8823dae97530f
                                  WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
                                  RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
                                  OptimizedLoopNode_execute_527b7e31e056c5d94296e5699b6e3e1ab4c3ea4a
     0.57%  truffleruby      libc-2.31.so        [.] __memmove_avx_unaligned_erms
            |
            ---page_fault
               __memmove_avx_unaligned_erms
               LinuxImageHeapProvider_initialize_1238cf7c6e2d500f51283e57bfa8766238b6ecf8
               Isolates_create_bd9eb61e462f7604853e049bb166554887fccbb1
               CEntryPointSnippets_createIsolate_f1111fe1c782eae0d0e674e1aba1dff3bc5e04ea
               JNIInvocationInterface$Exports$JNICreateJavaVMPrologue_enter_7a0953de63517344879532e6305c97d1195c8ed5
               JNI_CreateJavaVM
               main
               __libc_start_main
               _start
     0.55%  truffleruby      librubyvm.so        [.] RubyNode_doExecuteVoid_79ed0a40df1739e6e9f690e35f99da86802b0de6
     0.52%  truffleruby      [kernel.kallsyms]   [k] copy_page
            |
            ---copy_page
     0.52%  truffleruby      librubyvm.so        [.] WhileNode$WhileRepeatingNode_executeRepeating_c3887dee22a6dfe41ba3bb2f471706bb14dad299
     0.48%  truffleruby      librubyvm.so        [.] AndNode_execute_10697adfe3d9e331728f142b40f667d899b77693
     0.48%  truffleruby      librubyvm.so        [.] FloatLiteralNode_execute_f8ee37b4a6aee57d475b52b2d293d45ea6a6890e
     0.48%  truffleruby      [kernel.kallsyms]   [k] get_mem_cgroup_from_mm
     0.45%  gnal Dispatcher  [kernel.kallsyms]   [k] release_pages
     0.44%  truffleruby      librubyvm.so        [.] AndNode_castToBoolean_84af17ad7b0ad52249caebef615a6298e55e1e5b
     0.43%  truffleruby      librubyvm.so        [.] UnmanagedMemoryUtil_copyLongsForward_786a2262c2ed5c6469526ec7d53d0364ced07432
     0.39%  truffleruby      librubyvm.so        [.] SubstrateObjectCloneSnippets_doClone_db0ee7c8158f193d1d31cda0e976ab6bc6b87a63
     0.36%  truffleruby      [kernel.kallsyms]   [k] try_charge
     0.36%  truffleruby      [kernel.kallsyms]   [k] handle_mm_fault
     0.36%  truffleruby      librubyvm.so        [.] FrameUtil_getIntSafe_791b7f4178028c705487d8344ebd6ef3861d91b0
     0.36%  truffleruby      [kernel.kallsyms]   [k] __pagevec_lru_add_fn
     0.32%  truffleruby      librubyvm.so        [.] GraalRuntimeSupport_onLoopCount_b41c276781714cc4ee961b5ffb1f55452eb143de
     0.32%  truffleruby      librubyvm.so        [.] FrameWithoutBoxing_getInt_65279b04e46a0ac8b1aacb3acbf5b7b7e941f0ef
     0.28%  truffleruby      librubyvm.so        [.] FrameWithoutBoxing_setInt_366f49bb769811010513d009328a3ad50286e72d
     0.28%  truffleruby      librubyvm.so        [.] RepeatingNode_executeRepeatingWithValue_58a6aee8d6817ce9ec5a37889613156743c92258
     0.28%  truffleruby      [kernel.kallsyms]   [k] error_entry
     0.28%  truffleruby      ld-2.31.so          [.] do_lookup_x
     0.27%  truffleruby      [kernel.kallsyms]   [k] __handle_mm_fault
     0.25%  gnal Dispatcher  [kernel.kallsyms]   [k] page_remove_rmap
     0.24%  truffleruby      [kernel.kallsyms]   [k] __lru_cache_add
     0.24%  truffleruby      [kernel.kallsyms]   [k] page_add_file_rmap
     0.24%  truffleruby      librubyvm.so        [.] IntegerFixnumLiteralNode_execute_9be6f873bf3ee482d239566d9b59cdca38c76a2c
     0.24%  truffleruby      librubyvm.so        [.] StringLatin1_charAt_63e028c5b786b8663c4a4aea1cc147a8c4714d9d
     0.21%  truffleruby      [kernel.kallsyms]   [k] __alloc_pages_nodemask
     0.20%  truffleruby      [kernel.kallsyms]   [k] xas_load
     0.20%  truffleruby      librubyvm.so        [.] NodeUtil_adoptChildrenAndCountHelper_8a241e6cd7c6bc101819f72af385ee4c5d8108cd
     0.20%  truffleruby      librubyvm.so        [.] BodyTranslator_translateArgumentsAndBlock_033dfa2aa08ce077c9c63ccc767aa65c338d071a
     0.20%  truffleruby      [kernel.kallsyms]   [k] __next_zones_zonelist
     0.20%  truffleruby      [kernel.kallsyms]   [k] get_page_from_freelist
     0.16%  gnal Dispatcher  [kernel.kallsyms]   [k] free_pages_and_swap_cache
     0.16%  truffleruby      [kernel.kallsyms]   [k] lru_cache_add_active_or_unevictable
     0.16%  truffleruby      librubyvm.so        [.] String_charAt_1b771a25b5f8608a29c775fc6ff4199f0d397548
     0.16%  truffleruby      [kernel.kallsyms]   [k] __count_memcg_events
     0.16%  truffleruby      librubyvm.so        [.] FrameWithoutBoxing_getBoolean_fe30c392a6e054c11a493d5803659e3a7d492ec3
     0.16%  truffleruby      librubyvm.so        [.] FrameUtil_getBooleanSafe_85401e823e186edb7f11377d981316a0d508e1f2
     0.16%  truffleruby      librubyvm.so        [.] MultiThreadedMonitorSupport_getOrCreateMonitorFromObject_922cf11599fedc7c0bfa829f3c2f09fcdebe2077
     0.16%  truffleruby      [kernel.kallsyms]   [k] mem_cgroup_throttle_swaprate
     0.16%  truffleruby      librubyvm.so        [.] TextMap_fromCharSequence_da3fcb391fff6fbaa26834cd2b2f5e06e42cab17
     0.16%  truffleruby      [kernel.kallsyms]   [k] do_anonymous_page
     0.16%  truffleruby      [kernel.kallsyms]   [k] do_user_addr_fault
     0.16%  truffleruby      [kernel.kallsyms]   [k] page_mapping
     0.16%  truffleruby      librubyvm.so        [.] SubstrateArraycopySnippets_doArraycopy_f84b22127218a3e56e291fab3a848f043b4ef61f
     0.16%  truffleruby      librubyvm.so        [.] Node_getRootNodeImpl_599121db23871eec910578592870bd609e80a91f
     0.16%  truffleruby      librubyvm.so        [.] NodeUtil_adoptChildrenHelper_26d15bee47094c28945289501b45c8ecb145cf8d
     0.12%  truffleruby      [kernel.kallsyms]   [k] __mod_memcg_state
     0.12%  truffleruby      [kernel.kallsyms]   [k] __d_lookup_rcu
     0.12%  truffleruby      [kernel.kallsyms]   [k] native_flush_tlb_one_user
     0.12%  truffleruby      [kernel.kallsyms]   [k] pmd_devmap_trans_unstable
     0.12%  truffleruby      librubyvm.so        [.] IfElseNode_execute_68dbed5c1370fe40a43da7bb00dde476e9a2dbec
     0.12%  truffleruby      [kernel.kallsyms]   [k] alloc_pages_vma
     0.12%  truffleruby      librubyvm.so        [.] OptimizedCallTarget_profileReturnValue_7b92d7f0df9afc1d19777eadda713d159704c8a4
     0.12%  truffleruby      librubyvm.so        [.] JavaMemoryUtil_copyForward_07e617d0216918301530fde29359427b10fba00f
     0.12%  truffleruby      [kernel.kallsyms]   [k] page_fault
     0.12%  truffleruby      librubyvm.so        [.] InlinedDivNodeGen_execute_b6dbc16fedd5f61ebe1a0aea4d757b0d6be188fd
     0.12%  truffleruby      [kernel.kallsyms]   [k] down_read_trylock
     0.12%  truffleruby      librubyvm.so        [.] FrameInfoDecoder_decodeCompressedFrameData_ccffd21b6738e13a86ea4d6908ffa21d2f166e18
     0.12%  truffleruby      librubyvm.so        [.] RubyCallNode_executeArguments_0c1881b77d0f35a6be8dbe9e2479b54ad0fe3e7c
     0.12%  truffleruby      librubyvm.so        [.] ReferenceObjectProcessing_discover_42956fdbeb46617f7e3784ee4b27f241c387e90b
     0.12%  truffleruby      librubyvm.so        [.] ReentrantLock$Sync_tryRelease_a66c341958d8201110d2de33406f88fc73bac424
     0.10%  truffleruby      librubyvm.so        [.] HeapChunkProvider_produceAlignedChunk_151eeb69b2ff04e5a10d422de20e777d95b68672
     0.09%  truffleruby      [kernel.kallsyms]   [k] prep_new_page
     0.08%  gnal Dispatcher  [kernel.kallsyms]   [k] __mod_memcg_state
     0.08%  gnal Dispatcher  [kernel.kallsyms]   [k] free_unref_page_list
     0.08%  truffleruby      [kernel.kallsyms]   [k] pid_revalidate
     0.08%  truffleruby      [kernel.kallsyms]   [k] __do_page_fault
     0.08%  truffleruby      [kernel.kallsyms]   [k] smp_call_function_single
     0.08%  truffleruby      [kernel.kallsyms]   [k] prepend_path.isra.0
     0.08%  truffleruby      librubyvm.so        [.] ConcurrentHashMap_get_11876bdf828aa0caf5754f7b9d3d5ee38ba37e5e
     0.08%  truffleruby      [kernel.kallsyms]   [k] memcg_check_events
     0.08%  truffleruby      [kernel.kallsyms]   [k] do_fault
     0.08%  truffleruby      librubyvm.so        [.] ConditionProfile$Counting_profile_066c02354725dd7a16dde7426c62e531e5d62988
     0.08%  truffleruby      librubyvm.so        [.] OptimizedCallTarget_profiledPERoot_afb4ccd0d1f43f0bbf82d042837d2118c889aac3
     0.08%  truffleruby      librubyvm.so        [.] RubyContext_get_11b07589e660cf1e779bbd40c743cae33c05e925
     0.08%  truffleruby      librubyvm.so        [.] AssumptionGroup_isValidWithoutEpoch_77381d6c21decc43224935480a36b38c986a43c6
     0.08%  truffleruby      [kernel.kallsyms]   [k] mem_cgroup_try_charge
     0.08%  truffleruby      [kernel.kallsyms]   [k] kernel_poison_pages
     0.08%  truffleruby      librubyvm.so        [.] Math_addExact_755ab27c4e8b9774d36c5b042876e33c66934123
     0.08%  truffleruby      [kernel.kallsyms]   [k] alloc_set_pte
     0.08%  truffleruby      librubyvm.so        [.] TruffleSafepoint_poll_8e10d273f8388320f85a93e8b6079fd3ad93ef8b
     0.08%  truffleruby      [kernel.kallsyms]   [k] mem_cgroup_charge_statistics
     0.08%  truffleruby      [kernel.kallsyms]   [k] __inc_numa_state
     0.08%  truffleruby      [kernel.kallsyms]   [k] rcu_all_qs
     0.08%  truffleruby      [kernel.kallsyms]   [k] up_read
     0.08%  truffleruby      librubyvm.so        [.] BooleanCastNodeGen_executeToBoolean_bc10369f5b5b73949b1e044eda427b247bfc9bbd
     0.08%  truffleruby      librubyvm.so        [.] Node_copy_ce10d8ec49809e4e1d5f7a360647fef1458ab78d
     0.08%  truffleruby      librubyvm.so        [.] SubstrateType_getNodeFieldArray_8409eed9a96813c315d0dc9270dc17e9c2bb4669
     0.08%  truffleruby      librubyvm.so        [.] Node_adoptHelper_a6a0457a89a332606f9e73bc80fbcb5734cc2d14
     0.08%  truffleruby      [kernel.kallsyms]   [k] vmacache_find
     0.08%  truffleruby      librubyvm.so        [.] SaveMethodBlockNode_execute_62b9ddd720d97c0cd52a8c1687563282f9273e0b
     0.08%  truffleruby      librubyvm.so        [.] ReentrantLock$Sync_nonfairTryAcquire_0a9290a8427787ed8158d141c47a3ec430d345c2
     0.08%  truffleruby      librubyvm.so        [.] InternalMethod_getCallTarget_b1dd88b57b5483ed9e65193bab611dcbc2c26e3c
     0.08%  truffleruby      [kernel.kallsyms]   [k] _raw_spin_lock_irqsave
     0.08%  truffleruby      librubyvm.so        [.] LookupMethodNodeGen_execute_f2325da4e8153d4e4671e3225768f5c9a816576c
     0.08%  truffleruby      librubyvm.so        [.] FrameWithoutBoxing_constructor_8600ec404f3ee23a8487411b38f526c5b304e6fb
     0.08%  truffleruby      [kernel.kallsyms]   [k] do_wp_page
     0.08%  truffleruby      [kernel.kallsyms]   [k] kfree
     0.07%  truffleruby      [kernel.kallsyms]   [k] perf_event_mmap
     0.06%  gnal Dispatcher  [kernel.kallsyms]   [k] vm_normal_page
     0.05%  truffleruby      [kernel.kallsyms]   [k] memset_erms
     0.05%  truffleruby      [kernel.kallsyms]   [k] unmapped_area_topdown
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] __free_pages
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] lock_page_memcg
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] __mod_lruvec_state
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] PageHuge
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] unmap_vmas
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] unlock_page_memcg
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] mem_cgroup_update_lru_size
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] free_unref_page_prepare.part.0
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] uncharge_page
     0.04%  truffleruby      [kernel.kallsyms]   [k] common_file_perm
     0.04%  truffleruby      libc-2.31.so        [.] __vfscanf_internal
     0.04%  truffleruby      librubyvm.so        [.] ModifiableOptionValues_get_44e73afac78b444534df950ca66cded4fbb71b39
     0.04%  truffleruby      librubyvm.so        [.] ToAryNodeGen_execute_c7ca7390fee36b0f951f086bd1582117930a556d
     0.04%  truffleruby      librubyvm.so        [.] LanguageCache_supportsService_05d011e5d046c80c516df8ed813bfca5283d06cc
     0.04%  truffleruby      librubyvm.so        [.] socket@plt
     0.04%  truffleruby      librubyvm.so        [.] FrameUtil_getObjectSafe_23f819f65abef5d39a5200044d0501ab8f0267e0
     0.04%  truffleruby      librubyvm.so        [.] JNIObjectHandles_createLocal_d841b948c1d20e64912c894e72fb1e4feeb98975
     0.04%  truffleruby      [kernel.kallsyms]   [k] __ptep_modify_prot_start
     0.04%  truffleruby      libpthread-2.31.so  [.] __pthread_mutex_init
     0.04%  truffleruby      librubyvm.so        [.] RubyStringGen$RubyStringLibraryExports$Cached_isRubyString_38f41b9356a7eeb2620da6c9319f24097d049850
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] free_unref_page_commit
     0.04%  truffleruby      librubyvm.so        [.] DynamicObjectLibraryImpl$SpecificKey_putImpl_e9d3687ff7de57e0dee250ba587f702838dfc146
     0.04%  truffleruby      [kernel.kallsyms]   [k] enqueue_entity
     0.04%  truffleruby      [kernel.kallsyms]   [k] zap_pte_range.isra.0
     0.04%  truffleruby      librubyvm.so        [.] AbstractStringBuilder_append_a8c950f4c131c6b18791121d2ff67fda7a026847
     0.04%  truffleruby      librubyvm.so        [.] OptimizedCallTarget_executeRootNode_46cc88a60f6409ac2b2b6d89de9708a7150e0fab
     0.04%  truffleruby      librubyvm.so        [.] StringUTF16_compress_1dd1e0992a14c75948e9ea5a568ff75cae4d002d
     0.04%  truffleruby      [kernel.kallsyms]   [k] shmem_fault
     0.04%  truffleruby      librubyvm.so        [.] RubyCoreMethodRootNode_execute_df683171e395c1126038e336d07ecf6fbdaa08e3
     0.04%  truffleruby      [kernel.kallsyms]   [k] change_pte_range
     0.04%  truffleruby      librubyvm.so        [.] Locale_isUnicodeExtensionKey_4fa0baebb87704a2c3b260c0c9be25c679851721
     0.04%  truffleruby      librubyvm.so        [.] OptimizedCallTarget_profileArguments_e8668a5ca6b9022553c0ee2866178043ad99124a
     0.04%  truffleruby      librubyvm.so        [.] StringCoding_decodeUTF8_0_f6077430c08670b74c469b000c6b6d30ed250072
     0.04%  truffleruby      librubyvm.so        [.] RopeNodes$SubstringNode_substringLeafRope_3b0289ca3e9b110c47572984d523936e4e571f6d
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] kernel_poison_pages
     0.04%  truffleruby      librubyvm.so        [.] KernelNodes$InitializeDupNode_inlineExecute_c812b6eb8140f7ee2280331ed1a2aa81055de0e3
     0.04%  truffleruby      [kernel.kallsyms]   [k] psi_task_change
     0.04%  truffleruby      librubyvm.so        [.] ArrayList_constructor_368b9e8f3cfeb185f6385020a25e16e1e75d3b58
     0.04%  truffleruby      libz.so.1.2.11      [.] 0x0000000000002cd9
     0.04%  truffleruby      librubyvm.so        [.] DynamicObject_verifyShape_2ddd2789e0649b1b105d1686a983bb6ae2fc043f
     0.04%  truffleruby      librubyvm.so        [.] BodyTranslator_visitCallNode_29482a70db401b4a58dac78471d22a72c2eb69d0
     0.04%  truffleruby      librubyvm.so        [.] RubyParser$$Lambda$37e615d045544e69757e0ed0429b0cfbbe8e6a4f_execute_5c85f3e1fb2265fa7cf1bf42fa82a072053d3420
     0.04%  truffleruby      librubyvm.so        [.] Translator_sequence_347f00bcd10f33d5acc7c6a557d55a12b8246eea
     0.04%  truffleruby      librubyvm.so        [.] HashNodesFactory$GetIndexNodeFactory$GetIndexNodeGen_executeAndSpecialize_fee80aa162b71b7f60baff48c78de8d00118e80f
     0.04%  truffleruby      librubyvm.so        [.] Rope_isSingleByteOptimizable_09f67ef7525c66e5f0626e7c70914c171fbb88e2
     0.04%  truffleruby      librubyvm.so        [.] OptimizedDirectCallNode_call_ba221ffaf307f8b4cdcc1da9e0b137c8c24c957a
     0.04%  truffleruby      librubyvm.so        [.] RubyLexer_isIdentifierChar_289a4f65545740dbce6301a8975279e786ef05ad
     0.04%  truffleruby      librubyvm.so        [.] RubyLexer_yylex_44d3a5f99bd12f0580466435c2cc1e1d3694a810
     0.04%  truffleruby      librubyvm.so        [.] EncodingNodes$NegotiateCompatibleRopeEncodingNode_getCacheLimit_da065df46da446669b965e7240d6c99fb3ea3aba
     0.04%  truffleruby      librubyvm.so        [.] EconomicMapImpl_compareKeys_139d60c35d64f232b5b9fac87391585f45801e09
     0.04%  truffleruby      librubyvm.so        [.] RubyContextSourceNode_setSourceLength_621998b8df00d96135d48fba6ccbc21ef5e2f06f
     0.04%  truffleruby      librubyvm.so        [.] MetaClassNodeGen_execute_403d32b4e355f6aba70462a805dcc2a9194ed023
     0.04%  truffleruby      [kernel.kallsyms]   [k] page_counter_try_charge
     0.04%  truffleruby      ld-2.31.so          [.] _dl_exception_create_format
     0.04%  truffleruby      librubyvm.so        [.] MethodTranslator_translateMethodNode_b51993ca645f63fb48608749a9f563b3ffb9c315
     0.04%  truffleruby      [kernel.kallsyms]   [k] ptep_clear_flush
     0.04%  truffleruby      librubyvm.so        [.] ThreadLocal_get_89205c86d6fa365525945ac732abfddef7dd46f7
     0.04%  truffleruby      librubyvm.so        [.] ReadSelfNode_execute_ab32e7fe5847179ef895c14544ed778ec8aae051
     0.04%  truffleruby      librubyvm.so        [.] Character_getType_c089fa6e2575b3188b5b3edc8699b7cfe735f7e9
     0.04%  truffleruby      librubyvm.so        [.] StringNodes$StringAppendNode_stringToRopeWithEncoding_56cf0e54c1ac6759432c0b398d0f64bf367ffb3e
     0.04%  truffleruby      librubyvm.so        [.] FileLoader_buildSource_eba8a6f54ec5ff9b9c3c376c0ff3b3181f8f5a62
     0.04%  truffleruby      [kernel.kallsyms]   [k] in_group_p
     0.04%  truffleruby      librubyvm.so        [.] StringLatin1_hashCode_c33093c38bcfdf32ed97162697d8c35c80208269
     0.04%  truffleruby      librubyvm.so        [.] MakeSpecialVariableStorageNode_execute_af9478060a44397852d9c75dc19877d18d6c8efb
     0.04%  truffleruby      librubyvm.so        [.] ReadConstantNode_execute_029907cf495d767fa1994c806141402c24a42f75
     0.04%  truffleruby      [kernel.kallsyms]   [k] page_add_new_anon_rmap
     0.04%  truffleruby      librubyvm.so        [.] RootNode_getCallTarget_2c544199e2e8feb25eaf550975ca32bd78f5d798
     0.04%  truffleruby      [kernel.kallsyms]   [k] __mod_node_page_state
     0.04%  truffleruby      libc-2.31.so        [.] _dl_addr
     0.04%  truffleruby      librubyvm.so        [.] RubyMethodRootNode_execute_eb8c9eaee4930d1d397b3bf3dba3a3e92c8de725
     0.04%  truffleruby      librubyvm.so        [.] Reference_constructor_dfe10a700fe0c959c44d4de61ea40307fa8b2e0a
     0.04%  truffleruby      libpthread-2.31.so  [.] __libc_write
     0.04%  truffleruby      librubyvm.so        [.] PolyglotLocals$LanguageContextThreadLocal_get_ca9c79dc5fe01f694e16f400361451e31f4a9828
     0.04%  truffleruby      librubyvm.so        [.] RubyLexer_nextToken_20dc0c5eae7785bb1a09a260045b8cecb8dd78f5
     0.04%  truffleruby      librubyvm.so        [.] BodyTranslator_visitEvStrNode_cf6c1a4d8cc98f9c5217af4597ceaae647988cd1
     0.04%  truffleruby      librubyvm.so        [.] BodyTranslator_visitStrNode_289b42b7db523e554d2a890fa0b54040d25ed935
     0.04%  truffleruby      librubyvm.so        [.] UnixFileSystem_canonicalize_7dab0876c895320ad3b64b36f1e7e16ee1853a99
     0.04%  truffleruby      librubyvm.so        [.] StringConcatHelper_newString_3bcbb7251b3807516a7b4a33bbd96ac0f1912cf0
     0.04%  truffleruby      libc-2.31.so        [.] msort_with_tmp.part.0
     0.04%  truffleruby      librubyvm.so        [.] JavaMemoryUtil_copyObjectArrayForwardWithStoreCheck_78e49abf3b90dc69100a28b01ee57e160ebfa352
     0.04%  truffleruby      librubyvm.so        [.] CoreLocations$LongLocationDecorator_set_bbd03d36866fda28330c03ac79352aa69405283a
     0.04%  truffleruby      librubyvm.so        [.] RubyLexer_createTokenRope_1937284a9a8f4fa398f7ae792b4a0c566afbc70a
     0.04%  truffleruby      [kernel.kallsyms]   [k] __update_load_avg_cfs_rq
     0.04%  truffleruby      librubyvm.so        [.] FrameInfoDecoder_decodeValues_3e17b78fbe20489883ee0b9170ccd9f0c06a3bcc
     0.04%  truffleruby      [kernel.kallsyms]   [k] mem_cgroup_update_lru_size
     0.04%  truffleruby      librubyvm.so        [.] Integer_getChars_2437c44e6023372be22fabd9686065302ca92d3e
     0.04%  truffleruby      librubyvm.so        [.] CodeInfoTable_lookupCodeInfoQueryResult_e9230c754add04aa3315df44a05a0760e0cdb13a
     0.04%  truffleruby      librubyvm.so        [.] PolyglotContextImpl_requirePublicLanguage_17a8b01c29545d09e4a367952507fe4ce8d9e2b7
     0.04%  truffleruby      librubyvm.so        [.] InlinedAddNodeGen_executeAndSpecialize_e5fbb6f276511d7844c8b21eb54085ffa1a14de9
     0.04%  truffleruby      librubyvm.so        [.] LookupConstantWithLexicalScopeNodeGen_executeAndSpecialize_ec0c5eeee99b8490c1e6ea015a4b238198e98507
     0.04%  truffleruby      librubyvm.so        [.] ArrayDupNode_copyArraySmall_70ccb70ec5286fbc47c782e058ebefaa6dd1652a
     0.04%  truffleruby      libz.so.1.2.11      [.] inflate
     0.04%  truffleruby      librubyvm.so        [.] WhileNode_execute_3dea4435b5186a9ff8cc6e3496eda9190fc268ce
     0.04%  truffleruby      librubyvm.so        [.] ModuleFields_getMethodAndAssumption_983c8322aa7ee6ca05be16ce103e352959bab970
     0.04%  truffleruby      librubyvm.so        [.] InlinedLeftShiftNodeGen_execute_c470e329648e16d322836c072e9cb814d58d0f99
     0.04%  truffleruby      librubyvm.so        [.] CodeReferenceMapDecoder_walkOffsetsFromPointer_b35d1f7830794bc7e62eb1f6b467829a79909ed1
     0.04%  truffleruby      [kernel.kallsyms]   [k] check_stack_object
     0.04%  truffleruby      [kernel.kallsyms]   [k] fpregs_assert_state_consistent
     0.04%  truffleruby      librubyvm.so        [.] RubyParser$$Lambda$dd2b479f70a87ee942e895a2be2a7074b5815a95_execute_2a0ecfa070a55ea7026672cd9c2ab10cda9bb538
     0.04%  truffleruby      librubyvm.so        [.] ConcurrentHashMap_putVal_5418de00ead09b67c77c5aa8e487e451c9a69022
     0.04%  truffleruby      librubyvm.so        [.] String_substring_c83e66efbd7d8e3b7e280667e83636fafaa06780
     0.04%  truffleruby      librubyvm.so        [.] ConcurrentHashMap_transfer_fdaecf8486fbf615cb90aaf0563683c2ffb454c1
     0.04%  truffleruby      [kernel.kallsyms]   [k] lru_add_drain_cpu
     0.04%  truffleruby      librubyvm.so        [.] ReadRestArgumentNode_execute_fd029917360e312de686db976a255c8c7d9c54de
     0.04%  truffleruby      librubyvm.so        [.] RubyParser_yyparse_1637dd1edb6031aa7267a3950d2eed307469fe5e
     0.04%  truffleruby      [kernel.kallsyms]   [k] mem_cgroup_page_lruvec
     0.04%  truffleruby      librubyvm.so        [.] StringSupport_searchNonAscii_4fd03383170a29ea34d435b48783e2540428e792
     0.04%  truffleruby      librubyvm.so        [.] DefaultStringExportsGen$InteropLibraryExports$Uncached_asString_c9908dd04430576b80152dee2478754dd7d466e4
     0.04%  truffleruby      librubyvm.so        [.] RubyCallNode_executeWithArgumentsEvaluated_33e903d29d66c3ad61ba9ec7a14ba271a7570c13
     0.04%  truffleruby      librubyvm.so        [.] BooleanCastWithDefaultNodeGen_execute_3e5e66ac05b9d0bd44532cb15aae4393d2290a75
     0.04%  truffleruby      librubyvm.so        [.] IntegerNodesFactory$LeftShiftNodeFactory$LeftShiftNodeGen_executeLeftShift_3f82077058daa763f00d6ec535262836a355380b
     0.04%  truffleruby      librubyvm.so        [.] OptimizedDirectCallNode_onInterpreterCall_cf4bc10d1cc0a57739a9ac903bfdda7e29182fb3
     0.04%  truffleruby      librubyvm.so        [.] BooleanLiteralNode_execute_68f6cc40b89337e01c8c39b26fad0b90387a311f
     0.04%  truffleruby      [kernel.kallsyms]   [k] refill_stock
     0.04%  truffleruby      librubyvm.so        [.] RubyCheckArityRootNode_checkArity_7c53967206fb4fd552a82735f6ecea26a2c5bea8
     0.04%  truffleruby      librubyvm.so        [.] RubyCheckArityRootNode_checkArity_296a726ca6df0f2a98494a5c9f8f000ef165c39e
     0.04%  truffleruby      librubyvm.so        [.] PhysicalStackFrameVisitor_matches_e8108c73663100fa5c7aaa1483381df7292e5bfa
     0.04%  truffleruby      [kernel.kallsyms]   [k] unlock_page
     0.04%  truffleruby      [kernel.kallsyms]   [k] format_decode
     0.04%  truffleruby      librubyvm.so        [.] JavaStackWalker_continueWalk_68b099752cb72c8863f50a2f836e308ad1fb40b0
     0.04%  truffleruby      librubyvm.so        [.] NodeClass_get_2890efda8d94cc7950dacab99ed8ee604241634c
     0.04%  truffleruby      librubyvm.so        [.] DispatchNode_dispatch_bea6d42fd6b7c390cf27ba8fc43f20ee01fcd4c7
     0.04%  truffleruby      ld-2.31.so          [.] check_match
     0.04%  truffleruby      librubyvm.so        [.] ZeroLengthArrayStoreGen$ArrayStoreLibraryExports_createCached_34b2c59ac462f6f51ec32b70f8e5b0233c436492
     0.04%  truffleruby      librubyvm.so        [.] StringNodesFactory$EndWithNodeFactory$EndWithNodeGen_execute_cbdf60ce63d32530df5ebffaab26aaaed9ba0fe0
     0.04%  truffleruby      librubyvm.so        [.] String_subSequence_9a757c6b8f143b7042bd3cb1c21e05a59894a329
     0.04%  truffleruby      librubyvm.so        [.] JNIFunctions_GetIntField_cc20eaa35b54deb80db2eb05b754b96465828e2c
     0.04%  truffleruby      [kernel.kallsyms]   [k] release_pages
     0.04%  truffleruby      librubyvm.so        [.] LookupConstantWithLexicalScopeNodeGen_executeLookupConstant_5a00e7482ef5db04e25019620248fd48da85902c
     0.04%  truffleruby      [kernel.kallsyms]   [k] __mod_lruvec_state
     0.04%  truffleruby      librubyvm.so        [.] InlinedEqualNodeGen_execute_085c88840bea55736db778bc044b44eb8fc4ef98
     0.04%  truffleruby      librubyvm.so        [.] HashMap_hash_92c0bb595f0f5bb9eeac903191083c8f0c2c0962
     0.04%  truffleruby      librubyvm.so        [.] ProfileArgumentNodeGen_execute_855bbda4ae5fde8e90bf37085f53f0d1597df585
     0.04%  truffleruby      librubyvm.so        [.] ModuleFields_getOrComputeConstantEntry_1db133942136fa45962f1b95c2ef4295dd74cc3a
     0.04%  truffleruby      librubyvm.so        [.] InteropNodesFactory$InteropEvalNFINodeFactory$InteropEvalNFINodeGen_execute_461cc59d1f7f93ff459a86b75e576c5bb4cd5adf
     0.04%  truffleruby      librubyvm.so        [.] CachedSupplier_get_bb24335baa8cb9cc006e564c396fc77deb8df02d
     0.04%  truffleruby      librubyvm.so        [.] EngineAccessor$EngineImpl_getInstrumentationHandler_a3fd095a2267edbc34dc47505c0bd079a109eb02
     0.04%  truffleruby      librubyvm.so        [.] JavaMemoryUtil_copyPrimitiveArrayForward_04558096db261373c167eb1c8cc366001be76728
     0.04%  truffleruby      librubyvm.so        [.] LookupConstantNode_guardName_880cdef9d19ba248c5ccefbaf6efaa4fe51bc2d2
     0.04%  truffleruby      librubyvm.so        [.] UTF_8$Decoder_decodeArrayLoop_98fcab346304bf123fd7562509865106501847fb
     0.04%  truffleruby      [kernel.kallsyms]   [k] cgroup1_show_options
     0.04%  truffleruby      librubyvm.so        [.] RubyNode_hasSource_dbb6664975ea352d5e31c8854b74af0cb3b5cd9a
     0.04%  truffleruby      librubyvm.so        [.] BufferedReader_readLine_49482cc1adbe362e9d219262c390fbc755737e48
     0.04%  truffleruby      librubyvm.so        [.] String_equals_951b4dc388763a53473bf39dd2f3d308fc60450a
     0.04%  truffleruby      librubyvm.so        [.] Class_getSimpleBinaryName_5fdcc48ca22f09665660d4a37603f594f0621038
     0.04%  truffleruby      librubyvm.so        [.] SelfNodeGen_executeAndSpecialize_af59e34af87b409a4ecd96b29da3268baab282d9
     0.04%  truffleruby      librubyvm.so        [.] NonmovableArrays_addressOf_7bac1f85a98daa5e5b4c7cc146659483836bfc0b
     0.04%  truffleruby      [kernel.kallsyms]   [k] pagevec_lru_move_fn
     0.04%  truffleruby      librubyvm.so        [.] AbstractStringBuilder_newCapacity_d43ce688a8a374b868e20a02af9e886a6b6a408c
     0.04%  truffleruby      librubyvm.so        [.] JavaMemoryUtil_copyForward_28eeebf6236ef8c3a86676bdede3a056a0f062b0
     0.04%  truffleruby      librubyvm.so        [.] ClassNodes$NewNode_newInstance_4997849734415c83189e7c8348dc1e45109a4fd7
     0.04%  truffleruby      librubyvm.so        [.] GCImpl_walkStack_db4fc1334f940e49aed72298697727fa7c734a34
     0.04%  truffleruby      librubyvm.so        [.] EconomicMapImpl_setValue_e5d2bf5a610c5981bb9ed05ff8672560d297ab86
     0.04%  truffleruby      librubyvm.so        [.] ReusableTypeReader_getU1_b60de50e41132537ce1318b53a68f95baaf9ee19
     0.04%  truffleruby      librubyvm.so        [.] ParameterCollector_visitArrayNode_1d34d81a21202aabd08aa753e7c75f085d881a68
     0.04%  truffleruby      librubyvm.so        [.] GetMethodObjectNodeGen_executeAndSpecialize_84b1bdff1d1ed3d704b05cbdecc352d2430cf21b
     0.04%  truffleruby      librubyvm.so        [.] CodeInfoDecoder_lookupCodeInfo_67ecc97b485dcbb7c24e3ce422ff7a1f87da8240
     0.04%  truffleruby      librubyvm.so        [.] Translator_loadSelf_41cb4b8542d102fa40bb75b12c9fbcba6c6e21f8
     0.04%  truffleruby      librubyvm.so        [.] Utf8_utf8ToString_400bd3bfae6ff0d1e0d8b80687d3fb192785bb08
     0.04%  truffleruby      librubyvm.so        [.] LibraryFactory_create_3cd3639cccc296eef06c128a317b1bbc549e2197
     0.04%  truffleruby      librubyvm.so        [.] BodyTranslator_translateRescueArrayParseNode_8fcecb2d87eb73272a9bd2528f57a43359ccceed
     0.04%  truffleruby      librubyvm.so        [.] PolyglotSourceCache$WeakSourceKey_hashCode_2dca9fa5c930ee9d997edce5b73480f262eed02a
     0.04%  truffleruby      librubyvm.so        [.] Node_adoptAndCountHelper_ea4d50332dd7d3b2840401892e6b65937c7fb157
     0.04%  truffleruby      librubyvm.so        [.] DelegatedArrayStorageGen$ArrayStoreLibraryExports$Cached_read_82da0f7c6fc192185bc97f93c2c344c684b80393
     0.04%  truffleruby      librubyvm.so        [.] CgroupSubsystemFactory_determineType_46a1f3b138549c3ee69989c4de942b2ba7277625
     0.04%  truffleruby      librubyvm.so        [.] SymbolNodes$HashSymbolNode_hash_22a7240e958fd1e7c831210103d49b63dd798ff3
     0.04%  truffleruby      librubyvm.so        [.] UnalignedChunkRememberedSet_walkDirtyObjects_8c77cdb67f09eac82dbb2b2814d8000b70438eea
     0.04%  truffleruby      librubyvm.so        [.] RopeNodesFactory$BytesEqualNodeGen_execute_0fdb31a8f2c78bce4363c97e9687151bef5d92a6
     0.04%  truffleruby      librubyvm.so        [.] OptimizedCallTarget_initialize_f50caccdea9233088eded81a07c48d159ee4d148
     0.04%  truffleruby      librubyvm.so        [.] AncestorIterator_next_502d00c4e03561449b4077ab6117e133e6bc384c
     0.04%  truffleruby      librubyvm.so        [.] ReentrantLock_unlock_86cdca028e9dd52644b7822ba738ec004cf0c360
     0.04%  truffleruby      librubyvm.so        [.] InteropNodesFactory$ExecuteNodeFactory_createNode_b63dfb4865c507b870e276de5755a18a24b6d9e9
     0.04%  truffleruby      librubyvm.so        [.] DynamicObjectLibraryImplGen$DynamicObjectLibraryExports$Cached_putLong_7c048024dd5f5aabd2d30442323fb43aec6145fd
     0.04%  truffleruby      librubyvm.so        [.] InstrumentationHandler$AbstractAsyncCollection_compact_b7fd96b0dbb70527c14f72b81278eb4b0cfd042d
     0.04%  truffleruby      librubyvm.so        [.] BucketsHashStore_rehash_00cfc283944907580949a58a3d337b94033e930b
     0.04%  truffleruby      librubyvm.so        [.] ModuleOperations_lookupConstant_0a50950b2b0be5379c03f05ea318a9438862eb8f
     0.04%  truffleruby      librubyvm.so        [.] Hashing_stringHash_a41e1cd15715b71ad0b5d392c8fc48667f834d59
     0.04%  truffleruby      [kernel.kallsyms]   [k] do_syscall_64
     0.04%  truffleruby      librubyvm.so        [.] InlinedCallNode_execute_22b4a86ba8d95460fcbb6808f36b15eebdb64455
     0.04%  truffleruby      librubyvm.so        [.] CodeInfoAccess_lookupCodeInfo_21c06291db16d553a47621e78f5d0824b3515aa4
     0.04%  truffleruby      librubyvm.so        [.] RubyArguments_pack_85e894b35ef78744dee707cd44b4995f199a57ca
     0.04%  truffleruby      librubyvm.so        [.] KernelNodes$RespondToNode_respondToMissing_9abf921356ddcb0b8049b64fc309a1c9d9d3168a
     0.04%  truffleruby      [kernel.kallsyms]   [k] find_vma
     0.04%  gnal Dispatcher  [kernel.kallsyms]   [k] __tlb_remove_page_size
     0.04%  truffleruby      [kernel.kallsyms]   [k] mm_update_next_owner
     0.03%  truffleruby      [kernel.kallsyms]   [k] tlb_finish_mmu
     0.03%  truffleruby      [kernel.kallsyms]   [k] perf_iterate_ctx
     0.02%  truffleruby      [kernel.kallsyms]   [k] __memcg_kmem_charge
     0.02%  nfi-gc           [kernel.kallsyms]   [k] __update_idle_core
     0.02%  Thread-2         [kernel.kallsyms]   [k] rwsem_spin_on_owner
     0.02%  Logging-Cleaner  librubyvm.so        [.] MultiThreadedMonitorSupport_getOrCreateMonitorFromObject_922cf11599fedc7c0bfa829f3c2f09fcdebe2077
     0.02%  Interrupt-Timer  [kernel.kallsyms]   [k] do_syscall_64
     0.02%  Interrupt-Timer  [kernel.kallsyms]   [k] futex_wake
     0.02%  Thread-2         [kernel.kallsyms]   [k] native_queued_spin_lock_slowpath
     0.02%  Logging-Cleaner  [kernel.kallsyms]   [k] update_cfs_group
     0.02%  truffleruby      librubyvm.so        [.] HeapChunkProvider_popUnusedAlignedChunk_076a3ebad49576ee9de8be8f1e0bd9f3f22d6327
     0.02%  truffleruby      [kernel.kallsyms]   [k] rwsem_optimistic_spin
     0.02%  truffleruby      [kernel.kallsyms]   [k] __rb_insert_augmented
     0.01%  truffleruby      [kernel.kallsyms]   [k] down_write_killable
     0.01%  Thread-2         librubyvm.so        [.] GraalTruffleRuntimeListenerDispatcher_invokeListeners_8957fabbe00a82ce8cd608c1c6a53c4764fe8661
     0.01%  Logging-Cleaner  [kernel.kallsyms]   [k] try_charge
     0.01%  truffleruby      [kernel.kallsyms]   [k] entry_SYSCALL_64_after_hwframe
     0.01%  truffleruby      [kernel.kallsyms]   [k] nmi_restore
     0.01%  truffleruby      [kernel.kallsyms]   [k] flush_tlb_func_common.constprop.0
     0.01%  truffleruby      [kernel.kallsyms]   [k] security_task_getscheduler
     0.01%  truffleruby      librubyvm.so        [.] PosixJavaThreads_setNativeName_ad1428f6ffd25a626f703670d3ed7e20656291a9
     0.01%  truffleruby      [kernel.kallsyms]   [k] finish_task_switch
     0.01%  truffleruby      [kernel.kallsyms]   [k] page_counter_cancel
     0.01%  truffleruby      libc-2.31.so        [.] __ctype_init
     0.00%  perf             [kernel.kallsyms]   [k] default_do_nmi
     0.00%  truffleruby      [kernel.kallsyms]   [k] fill_pmd
     0.00%  perf             [kernel.kallsyms]   [k] memcpy_fromio
     0.00%  truffleruby      [kernel.kallsyms]   [k] ghes_notify_nmi
     0.00%  truffleruby      [kernel.kallsyms]   [k] native_write_msr
     0.00%  truffleruby      [kernel.kallsyms]   [k] apei_read
     0.00%  truffleruby      [kernel.kallsyms]   [k] apei_check_gar
     0.00%  truffleruby      [kernel.kallsyms]   [k] nmi_handle
     0.00%  perf             [kernel.kallsyms]   [k] native_sched_clock
     0.00%  truffleruby      [kernel.kallsyms]   [k] intel_bts_enable_local
     0.00%  perf             [kernel.kallsyms]   [k] native_write_msr
     0.00%  truffleruby      [kernel.kallsyms]   [k] __intel_pmu_enable_all.constprop.0
     0.00%  perf             [unknown]           [.] 0000000000000000
#
# (Cannot load tips.txt file, please install perf!)
#
```

</details>


Discussion / hints:
Notes on invoking profiling with other tools than perf:

- Xcode `xcrun xctrace record --template 'Time Profiler' --output tr2.trace --launch -- /Users/smarr/Projects/FastStart/truffleruby/mxbuild/truffleruby-native/languages/ruby/bin/ruby --experimental-options --engine.Compilation=false harness.rb MicroDispatchBase 200 40`

- Java's Flight Recorder needs the following parameters: `-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=delay=10s,duration=10d,name=fr-recording2,filename=fr-recording2.jfr,settings=profile`

Compilation Changes

- GraalVM native image compilation may or may not need the some of following arguments: `-H:-DeleteLocalSymbols -g`
Some useful links, also to web-based profile inspectors:
- https://www.markhansen.co.nz/profiler-uis/
- https://profiler.firefox.com/
- https://www.speedscope.app/

One may want to keep the raw data of profiles around for inspection in an IDE context, or local tools. Though, for longer-term archival, we probably need to keep more compact information.



Fix patch:
diff --git a/docs/config.md b/docs/config.md
index b14da7a0..37918bc1 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -800,6 +800,45 @@ executors:
       - make
 ```
 
+---
+
+**profiler:**
+
+An executor may specify how it can be profiled.
+If a `profiler` is given, then it can be part of an experiment
+with the `action: profiling` set.
+
+Currently, `perf` is supported.
+
+Example:
+
+```yaml
+executors:
+  MyBin1:
+    profiler:
+      perf: ~  # ~ is used for empty settings
+```
+
+ReBench has built-in support for `perf`, and extracts some useful information.
+Though, the settings and processing may not be desired and can be adapted
+with the following settings:
+
+```yaml
+executors:
+  MyBin1:
+    profiler:
+      perf:
+        # perf record is used to record the profile
+        # the standard setting uses 9999hz sampling frequency
+        # and determines the call-graph using the LBR approach.
+        record_args: record -g -F 9999 --call-graph lbr
+        # perf report is used to convert the raw results into
+        # report that shows for a function how much of a share of the overall
+        # run time it took.
+        report_args: report -g graph --no-children --stdio
+```
+
+
 ---
 
 **run details and variables:**
@@ -860,6 +899,28 @@ experiments:
 
 ---
 
+**action:**
+
+The default for experiments is that they run as benchmarks, to measure
+their performance.
+
+Alternatively, we can run experiments to obtain profiling information.
+This would give a more detailed insight into the execution.
+
+Possible values: `benchmark`, `profile`
+
+Default: `benchmark`
+
+Example:
+
+```yaml
+experiments:
+  Example:
+    action: profile
+```
+
+---
+
 **suites:**
 
 List of benchmark suites to be used.
diff --git a/rebench/__init__.py b/rebench/__init__.py
index 5c4105cd..540a06ce 100644
--- a/rebench/__init__.py
+++ b/rebench/__init__.py
@@ -1,1 +1,1 @@
-__version__ = "1.0.1"
+__version__ = "1.1.dev1"
diff --git a/rebench/configurator.py b/rebench/configurator.py
index 1451704c..8f9e7a97 100644
--- a/rebench/configurator.py
+++ b/rebench/configurator.py
@@ -263,10 +263,10 @@ def run_details(self):
     def has_executor(self, executor_name):
         return executor_name in self._executors
 
-    def get_executor(self, executor_name, run_details, variables):
+    def get_executor(self, executor_name, run_details, variables, action):
         executor = Executor.compile(
             executor_name, self._executors[executor_name],
-            run_details, variables, self.build_commands)
+            run_details, variables, self.build_commands, action)
         return executor
 
     def get_suite(self, suite_name):
diff --git a/rebench/denoise.py b/rebench/denoise.py
index 49054653..ed748398 100644
--- a/rebench/denoise.py
+++ b/rebench/denoise.py
@@ -30,13 +30,16 @@ def __init__(self, succeeded, warn_msg, use_nice, use_shielding, details):
         self.details = details
 
 
-def minimize_noise(show_warnings, ui):
+def minimize_noise(show_warnings, ui, for_profiling):
     result = {}
 
+    cmd = ['sudo', '-n', 'rebench-denoise']
+    if for_profiling:
+        cmd += ['--for-profiling']
+    cmd += ['--json', 'minimize']
+
     try:
-        output = output_as_str(subprocess.check_output(
-            ['sudo', '-n', 'rebench-denoise', '--json', 'minimize'],
-            stderr=subprocess.STDOUT))
+        output = output_as_str(subprocess.check_output(cmd, stderr=subprocess.STDOUT))
         try:
             result = json.loads(output)
             got_json = True
@@ -224,19 +227,32 @@ def _set_no_turbo(with_no_turbo):
     return with_no_turbo
 
 
-def _minimize_perf_sampling():
+def _configure_perf_sampling(for_profiling):
     try:
         # pylint: disable-next=unspecified-encoding
         with open("/proc/sys/kernel/perf_cpu_time_max_percent", "w") as perc_file:
-            perc_file.write("1\n")
+            if for_profiling:
+                perc_file.write("0\n")
+            else:
+                perc_file.write("1\n")
 
         # pylint: disable-next=unspecified-encoding
         with open("/proc/sys/kernel/perf_event_max_sample_rate", "w") as sample_file:
-            sample_file.write("1\n")
+            # for profiling we just disabled it above, and then don't need to set it
+            if not for_profiling:
+                sample_file.write("1\n")
+
+        if for_profiling:
+            # pylint: disable-next=unspecified-encoding
+            with open("/proc/sys/kernel/perf_event_paranoid", "w") as perf_file:
+                perf_file.write("-1\n")
     except IOError:
         return "failed"
 
-    return 1
+    if for_profiling:
+        return 0
+    else:
+        return 1
 
 
 def _restore_perf_sampling():
@@ -244,15 +260,24 @@ def _restore_perf_sampling():
         # pylint: disable-next=unspecified-encoding
         with open("/proc/sys/kernel/perf_cpu_time_max_percent", "w") as perc_file:
             perc_file.write("25\n")
+
+        # pylint: disable-next=unspecified-encoding
+        with open("/proc/sys/kernel/perf_event_max_sample_rate", "w") as sample_file:
+            sample_file.write("50000\n")
+
+        # pylint: disable-next=unspecified-encoding
+        with open("/proc/sys/kernel/perf_event_paranoid", "w") as perf_file:
+            perf_file.write("3\n")
     except IOError:
         return "failed"
     return "restored"
 
 
-def _minimize_noise(num_cores, use_nice, use_shielding):
+def _minimize_noise(num_cores, use_nice, use_shielding, for_profiling):
     governor = _set_scaling_governor(SCALING_GOVERNOR_PERFORMANCE, num_cores)
     no_turbo = _set_no_turbo(True)
-    perf = _minimize_perf_sampling()
+    perf = _configure_perf_sampling(for_profiling)
+
     can_nice = _can_set_niceness() if use_nice else False
     shielding = _activate_shielding(num_cores) if use_shielding else False
 
@@ -343,6 +368,8 @@ def _shell_options():
                         dest='use_nice', help="Don't try setting process niceness")
     parser.add_argument('--without-shielding', action='store_false', default=True,
                         dest='use_shielding', help="Don't try shielding cores")
+    parser.add_argument('--for-profiling', action='store_true', default=False,
+                        dest='for_profiling', help="Don't restrict CPU usage by profiler")
     parser.add_argument('command',
                         help=("`minimize`|`restore`|`exec -- `|`test`: "
                               "`minimize` sets system to reduce noise. "
@@ -363,7 +390,7 @@ def main_func():
     result = {}
 
     if args.command == 'minimize':
-        result = _minimize_noise(num_cores, args.use_nice, args.use_shielding)
+        result = _minimize_noise(num_cores, args.use_nice, args.use_shielding, args.for_profiling)
     elif args.command == 'restore':
         result = _restore_standard_settings(num_cores, args.use_shielding)
     elif args.command == 'exec':
diff --git a/rebench/executor.py b/rebench/executor.py
index 72cd1544..f4bb7781 100644
--- a/rebench/executor.py
+++ b/rebench/executor.py
@@ -269,12 +269,14 @@ def __init__(self, runs, do_builds, ui, include_faulty=False,
 
         self._use_nice = use_nice
         self._use_shielding = use_shielding
+        self.use_denoise = use_nice or use_shielding
+
         self._print_execution_plan = print_execution_plan
 
         self._do_builds = do_builds
         self.ui = ui
         self._include_faulty = include_faulty
-        self._debug = debug
+        self.debug = debug
         self._scheduler = self._create_scheduler(scheduler)
         self.build_log = build_log
         self._artifact_review = artifact_review
@@ -298,16 +300,17 @@ def _create_scheduler(self, scheduler):
     def _construct_cmdline(self, run_id, gauge_adapter):
         cmdline = ""
 
-        use_denoise = self._use_nice or self._use_shielding
-        if use_denoise:
+        if self.use_denoise:
             cmdline += "sudo rebench-denoise "
             if not self._use_nice:
                 cmdline += "--without-nice "
             if not self._use_shielding:
                 cmdline += "--without-shielding "
+            if run_id.is_profiling():
+                cmdline += "--for-profiling "
             cmdline += "exec -- "
 
-        cmdline += gauge_adapter.acquire_command(run_id.cmdline())
+        cmdline += gauge_adapter.acquire_command(run_id)
 
         return cmdline
 
@@ -399,7 +402,7 @@ def process_output(self, name, stdout_result, stderr_result):
 
     def execute_run(self, run_id):
         gauge_adapter = self._get_gauge_adapter_instance(
-            run_id.benchmark.gauge_adapter)
+            run_id.get_gauge_adapter_name())
 
         cmdline = self._construct_cmdline(run_id, gauge_adapter)
 
@@ -425,7 +428,9 @@ def execute_run(self, run_id):
         mean_of_totals = run_id.get_mean_of_totals()
         if terminate:
             run_id.report_run_completed(cmdline)
-            if (not run_id.is_failed and run_id.min_iteration_time
+            if (not run_id.is_failed
+                    and not run_id.is_profiling()
+                    and run_id.min_iteration_time
                     and mean_of_totals < run_id.min_iteration_time
                     and not self._artifact_review):
                 self.ui.warning(
@@ -450,7 +455,7 @@ def _get_gauge_adapter_instance(self, adapter_name):
                 except ImportError:
                     mod = None
             if mod is not None and hasattr(mod, adapter_name):
-                return getattr(mod, adapter_name)(self._include_faulty)
+                return getattr(mod, adapter_name)(self._include_faulty, self)
         return None
 
     def _generate_data_point(self, cmdline, gauge_adapter, run_id,
@@ -466,7 +471,7 @@ def _keep_alive(seconds):
 
             (return_code, output, _) = subprocess_timeout.run(
                 cmdline, cwd=run_id.location, stdout=subprocess.PIPE,
-                stderr=subprocess.STDOUT, shell=True, verbose=self._debug,
+                stderr=subprocess.STDOUT, shell=True, verbose=self.debug,
                 timeout=run_id.max_invocation_time,
                 keep_alive_output=_keep_alive)
         except OSError as err:
@@ -531,7 +536,9 @@ def _eval_output(self, output, run_id, gauge_adapter, cmdline):
                 msg += "{ind}{ind}Recorded %d data points, show last 20...\n" % num_points
             i = 0
             for data_point in data_points:
-                if warmup is not None and warmup > 0:
+                if run_id.is_profiling():
+                    run_id.add_data_point(data_point, False)
+                elif warmup is not None and warmup > 0:
                     warmup -= 1
                     run_id.add_data_point(data_point, True)
                 else:
diff --git a/rebench/interop/adapter.py b/rebench/interop/adapter.py
index d974d0b0..8b54b540 100644
--- a/rebench/interop/adapter.py
+++ b/rebench/interop/adapter.py
@@ -31,12 +31,13 @@ class GaugeAdapter(object):
     re_segfault = re.compile("Segmentation fault")
     re_bus_error = re.compile("Bus error")
 
-    def __init__(self, include_faulty):
+    def __init__(self, include_faulty, executor):
         self._include_faulty = include_faulty
         self._other_error_definitions = None
+        self._executor = executor
 
-    def acquire_command(self, command):
-        return command
+    def acquire_command(self, run_id):
+        return run_id.cmdline()
 
     def parse_data(self, data, run_id, invocation):
         raise NotImplementedError()
diff --git a/rebench/interop/multivariate_adapter.py b/rebench/interop/multivariate_adapter.py
index 77a19afc..080bb2b1 100644
--- a/rebench/interop/multivariate_adapter.py
+++ b/rebench/interop/multivariate_adapter.py
@@ -40,8 +40,8 @@ class MultivariateAdapter(GaugeAdapter):
     variable_re = re.compile(r"(?:(\d+):)?RESULT-(\w+):(?:(\w+):)?\s*(\d+(\.\d+)?)")
     # optional datapoint counter, mandatory variable, optional unit, mandatory int-or-float
 
-    def __init__(self, include_faulty):
-        super(MultivariateAdapter, self).__init__(include_faulty)
+    def __init__(self, include_faulty, executor):
+        super(MultivariateAdapter, self).__init__(include_faulty, executor)
         self._other_error_definitions = [re.compile("FAILED")]
 
     def parse_data(self, data, run_id, invocation):
diff --git a/rebench/interop/perf_adapter.py b/rebench/interop/perf_adapter.py
new file mode 100644
index 00000000..82df0553
--- /dev/null
+++ b/rebench/interop/perf_adapter.py
@@ -0,0 +1,22 @@
+from .adapter import GaugeAdapter
+from ..model.profile_data import ProfileData
+
+
+class PerfAdapter(GaugeAdapter):
+
+    @staticmethod
+    def _get_profiler(run_id):
+        profilers = run_id.benchmark.suite.executor.profiler
+        assert len(profilers) == 1
+
+        return profilers[0]  # TODO: needs changing when we support multiple profilers
+
+    def parse_data(self, data, run_id, invocation):
+        profiler = self._get_profiler(run_id)
+        json = profiler.process_profile(run_id, self._executor)
+
+        return [ProfileData(run_id, json, run_id.iterations, invocation)]
+
+    def acquire_command(self, run_id):
+        profiler = self._get_profiler(run_id)
+        return profiler.command + " " + profiler.record_args + " " + run_id.cmdline()
diff --git a/rebench/interop/perf_parser.py b/rebench/interop/perf_parser.py
new file mode 100644
index 00000000..a4efc3b1
--- /dev/null
+++ b/rebench/interop/perf_parser.py
@@ -0,0 +1,178 @@
+import json
+import re
+import sys
+
+_re_name_and_sha = re.compile(r"^(\S+)_[0-9a-f]{40}$")
+
+
+def _unmangle(method_name):
+    m = _re_name_and_sha.match(method_name)
+    if m:
+        return m.group(1)
+    return method_name
+
+
+def _list_of_elem_or_str_to_json(trace):
+    assert trace
+    result = []
+    for e in trace:
+        if isinstance(e, Element):
+            result.append(e.to_json())
+        else:
+            result.append(e)
+    return result
+
+
+class Element(object):
+
+    def __init__(self, percent, method, exe_type = None, binary=None, shared_object=None):
+        self.prev_divider = None
+        self.trace = None
+        self.percent = percent
+        self.method = _unmangle(method)
+        self.type = exe_type
+        self.binary = binary
+        self.shared_object = shared_object
+
+    def to_json(self):
+        result = {"p": self.percent, "m": self.method}
+        if self.trace:
+            result["t"] = _list_of_elem_or_str_to_json(self.trace)
+        return result
+
+
+def _create_element(m):
+    percent = float(m.group(1))
+    binary = m.group(2)
+    shared_object = m.group(3)
+    exe_type = m.group(4)
+    method = m.group(5)
+    top_elem = Element(percent, method, exe_type, binary, shared_object)
+    return top_elem
+
+
+class PerfParser(object):
+
+    re_main_item = re.compile(r"^\s+(\d+\.\d\d)%\s\s(.+)\s\s(\S+)\s+\[(\S)]\s(\S+)$")
+    re_child_divider = re.compile(r"^\s+(\|\s*)+$")
+
+    re_child = re.compile(r"^\s+(?:\|\s*)*--(\d+\.\d\d)%--(\S+)$")
+    re_stack_elements = re.compile(r"^\s+(?:\|\s+)*(?:---)?(\S+)$")
+
+    def __init__(self, filename=None):
+        self._filename = filename
+        self._elements = []
+
+    def parse_lines(self, lines):
+        try:
+            self._parse_lines(lines)
+        except Exception as e:  # pylint: disable=broad-except
+            exp_str = str(e)
+            print("Failed to parse: " + exp_str)
+            print("-----------perf-output------------")
+            print("\n".join(lines))
+            print("-----------perf-output-end--------")
+
+    def _parse_lines(self, lines):
+        top_elements = self._elements
+        stack = []
+        prev_divider = ""
+
+        for line in lines:
+            if not line:
+                continue
+
+            # ignore comments
+            if line.startswith("#"):
+                continue
+
+            m = self.re_child_divider.match(line)
+            if m:
+                top_of_stack = stack[-1]
+
+                if len(prev_divider) > len(line):
+                    while (top_of_stack.prev_divider is None
+                           or len(top_of_stack.prev_divider) > len(line)):
+                        stack.pop()
+                        top_of_stack = stack[-1]
+                else:
+                    top_of_stack.prev_divider = line
+                prev_divider = line
+                continue
+
+            m = self.re_main_item.match(line)
+            if m:
+                top_elem = _create_element(m)
+                top_elements.append(top_elem)
+                stack = [top_elem]
+                prev_divider = ""
+                continue
+
+            if len(stack) > 0:
+                if line == "\n":
+                    stack = []
+                    prev_divider = ""
+                    continue
+
+                m = self.re_child.match(line)
+                if m:
+                    percent = float(m.group(1))
+                    method = m.group(2)
+                    elem = Element(percent, method)
+                    if stack[-1].trace is None:
+                        stack[-1].trace = []
+                    stack[-1].trace.append(elem)
+                    stack.append(elem)
+                    continue
+
+                m = self.re_stack_elements.match(line)
+                if m:
+                    top_of_stack = stack[-1]
+                    if top_of_stack.trace is None:
+                        top_of_stack.trace = []
+
+                    stack_element = m.group(1)
+                    top_of_stack.trace.append(_unmangle(stack_element))
+                    continue
+
+    def parse(self):
+        with open(self._filename) as perf_file:  # pylint: disable=unspecified-encoding
+            self.parse_lines(perf_file)
+
+    def print_elements(self):
+        for e in self._elements:
+            print("     %.2f%%  %s  %s  [%s] %s"
+                  % (e.percent, e.binary, e.shared_object, e.type, e.method))
+            if e.trace:
+                if isinstance(e.trace[0], Element):
+                    print("            |          ")
+                for i in range(len(e.trace)):  # pylint: disable=consider-using-enumerate
+                    is_last = i == len(e.trace) - 1
+                    self._print_child(e.trace[i], is_last, "            ")
+            print("")
+
+    def _print_child(self, e, is_last, indentation):
+        if isinstance(e, Element):
+            last_char = " " if is_last else " "
+            print("%s%s--%.2f%%--%s" % (indentation, last_char, e.percent, e.method))
+            if e.trace:
+                if isinstance(e.trace[0], Element):
+                    print(indentation + "           |          ")
+                for i in range(len(e.trace)):  # pylint: disable=consider-using-enumerate
+                    is_last = i == len(e.trace) - 1
+                    self._print_child(e.trace[i], is_last, indentation + "           ")
+        else:
+            print(indentation + "          " + e)
+
+    def to_json(self):
+        return _list_of_elem_or_str_to_json(self._elements)
+
+    def get_elements(self):
+        return self._elements
+
+
+if __name__ == "__main__":
+    p = PerfParser(sys.argv[1])
+    p.parse()
+    print(json.dumps(p.to_json()))
+    # p.print_elements()
diff --git a/rebench/interop/plain_seconds_log_adapter.py b/rebench/interop/plain_seconds_log_adapter.py
index 89d0f97d..893a23d2 100644
--- a/rebench/interop/plain_seconds_log_adapter.py
+++ b/rebench/interop/plain_seconds_log_adapter.py
@@ -35,8 +35,8 @@ class PlainSecondsLogAdapter(GaugeAdapter):
     re_incorrect = re.compile(r".*incorrect.*")
     re_err = re.compile(r".*error.*")
 
-    def __init__(self, include_faulty):
-        super(PlainSecondsLogAdapter, self).__init__(include_faulty)
+    def __init__(self, include_faulty, executor):
+        super(PlainSecondsLogAdapter, self).__init__(include_faulty, executor)
         self._other_error_definitions = [self.re_NPB_partial_invalid,
                                          self.re_NPB_invalid, self.re_incorrect,
                                          self.re_err]
diff --git a/rebench/interop/rebench_log_adapter.py b/rebench/interop/rebench_log_adapter.py
index f1e18bd1..ef73ed19 100644
--- a/rebench/interop/rebench_log_adapter.py
+++ b/rebench/interop/rebench_log_adapter.py
@@ -40,8 +40,8 @@ class RebenchLogAdapter(GaugeAdapter):
     re_NPB_invalid = re.compile(r".*Benchmark done.*verification failed")
     re_incorrect = re.compile(r".*incorrect.*")
 
-    def __init__(self, include_faulty):
-        super(RebenchLogAdapter, self).__init__(include_faulty)
+    def __init__(self, include_faulty, executor):
+        super(RebenchLogAdapter, self).__init__(include_faulty, executor)
         self._other_error_definitions = [self.re_NPB_partial_invalid,
                                          self.re_NPB_invalid, self.re_incorrect]
 
diff --git a/rebench/interop/time_adapter.py b/rebench/interop/time_adapter.py
index 352bb78a..f9e54b11 100644
--- a/rebench/interop/time_adapter.py
+++ b/rebench/interop/time_adapter.py
@@ -38,11 +38,12 @@ class TimeAdapter(GaugeAdapter):
     re_formatted_time = re.compile(r"^wall-time \(secounds\): (\d+\.\d+)")
     re_formatted_rss = re.compile(r"^max rss \(kb\): (\d+)")
 
-    def __init__(self, include_faulty):
-        GaugeAdapter.__init__(self, include_faulty)
+    def __init__(self, include_faulty, executor):
+        GaugeAdapter.__init__(self, include_faulty, executor)
         self._use_formatted_time = False
 
-    def acquire_command(self, command):
+    def acquire_command(self, run_id):
+        command = run_id.cmdline()
         try:
             formatted_output = subprocess.call(
                 ['/usr/bin/time', '-f', TimeAdapter.time_format, '/bin/sleep', '1'],
@@ -118,5 +119,5 @@ class TimeManualAdapter(TimeAdapter):
        user to use the /usr/bin/time manually.
        This is useful for runs on remote machines like the Tilera or ARM boards.
     """
-    def acquire_command(self, command):
-        return command
+    def acquire_command(self, run_id):
+        return run_id.cmdline()
diff --git a/rebench/interop/validation_log_adapter.py b/rebench/interop/validation_log_adapter.py
index 8c261358..66b662e3 100644
--- a/rebench/interop/validation_log_adapter.py
+++ b/rebench/interop/validation_log_adapter.py
@@ -42,8 +42,8 @@ class ValidationLogAdapter(GaugeAdapter):
     re_NPB_invalid = re.compile(r".*Benchmark done.*verification failed")
     re_incorrect = re.compile(r".*incorrect.*")
 
-    def __init__(self, include_faulty):
-        super(ValidationLogAdapter, self).__init__(include_faulty)
+    def __init__(self, include_faulty, executor):
+        super(ValidationLogAdapter, self).__init__(include_faulty, executor)
         self._other_error_definitions = [self.re_NPB_partial_invalid,
                                          self.re_NPB_invalid, self.re_incorrect]
 
diff --git a/rebench/model/executor.py b/rebench/model/executor.py
index 550d3ec2..7eb0725a 100644
--- a/rebench/model/executor.py
+++ b/rebench/model/executor.py
@@ -22,12 +22,14 @@
 from .build_cmd import BuildCommand
 from .exp_run_details import ExpRunDetails
 from .exp_variables import ExpVariables
+from .profiler import Profiler
+from ..configuration_error import ConfigurationError
 
 
 class Executor(object):
 
     @classmethod
-    def compile(cls, executor_name, executor, run_details, variables, build_commands):
+    def compile(cls, executor_name, executor, run_details, variables, build_commands, action):
         path = executor.get('path')
         if path:
             path = os.path.abspath(path)
@@ -39,14 +41,20 @@ def compile(cls, executor_name, executor, run_details, variables, build_commands
         description = executor.get('description')
         desc = executor.get('desc')
 
+        profiler = Profiler.compile(executor.get('profiler'))
+
         run_details = ExpRunDetails.compile(executor, run_details)
         variables = ExpVariables.compile(executor, variables)
 
+        if action == "profile" and len(profiler) == 0:
+            raise ConfigurationError("Executor " + executor_name + " is configured for profiling, "
+                                     + "but no profiler details are given.")
+
         return Executor(executor_name, path, executable, args, build, description or desc,
-                        run_details, variables)
+                        profiler, run_details, variables, action)
 
     def __init__(self, name, path, executable, args, build, description,
-                 run_details, variables):
+                 profiler, run_details, variables, action):
         """Specializing the executor details in the run definitions with the settings from
            the executor definitions
         """
@@ -58,10 +66,13 @@ def __init__(self, name, path, executable, args, build, description,
 
         self.build = build
         self.description = description
+        self.profiler = profiler
 
         self.run_details = run_details
         self.variables = variables
 
+        self.action = action
+
     def as_dict(self):
         result = {
             'name': self.name,
diff --git a/rebench/model/experiment.py b/rebench/model/experiment.py
index 7911c5ba..6669c981 100644
--- a/rebench/model/experiment.py
+++ b/rebench/model/experiment.py
@@ -29,9 +29,13 @@ class Experiment(object):
 
     @classmethod
     def compile(cls, name, exp, configurator):
+        action = exp.get('action')
         description = exp.get('description')
         desc = exp.get('desc')
-        data_file = exp.get('data_file') or configurator.data_file
+        if action == 'profile':
+            data_file = exp.get('data_file') or configurator.data_file + ".profiles"
+        else:
+            data_file = exp.get('data_file') or configurator.data_file
 
         reporting = Reporting.compile(exp.get('reporting', {}), configurator.reporting,
                                       configurator.options, configurator.ui)
@@ -42,21 +46,21 @@ def compile(cls, name, exp, configurator):
         executions = exp.get('executions')
         suites = exp.get('suites')
 
-        return Experiment(name, description or desc, data_file, reporting,
+        return Experiment(name, description or desc, action, data_file, reporting,
                           run_details, variables, configurator, executions, suites)
 
-    def __init__(self, name, description, data_file, reporting, run_details,
+    def __init__(self, name, description, action, data_file, reporting, run_details,
                  variables, configurator, executions, suites):
         self.name = name
         self._description = description
-        self._data_file = data_file
+        self._action = action
 
         self._run_details = run_details
         self._variables = variables
         self._reporting = reporting
 
         self._data_store = configurator.data_store
-        self._persistence = self._data_store.get(data_file, configurator)
+        self._persistence = self._data_store.get(data_file, configurator, action)
 
         self._suites = self._compile_executors_and_benchmark_suites(
             executions, suites, configurator)
@@ -101,7 +105,8 @@ def _compile_executors_and_benchmark_suites(self, executions, suites, configurat
             else:
                 suites_for_executor = suites
 
-            executor = configurator.get_executor(executor_name, run_details, variables)
+            executor = configurator.get_executor(
+                executor_name, run_details, variables, self._action)
 
             for suite_name in suites_for_executor:
                 suite = BenchmarkSuite.compile(
diff --git a/rebench/model/profile_data.py b/rebench/model/profile_data.py
new file mode 100644
index 00000000..0fc85579
--- /dev/null
+++ b/rebench/model/profile_data.py
@@ -0,0 +1,40 @@
+import json
+
+from ..model.run_id import RunId
+
+
+class ProfileData(object):
+    def __init__(self, run_id, processed_data, num_iterations, invocation):
+        self.run_id = run_id
+        self.processed_data = processed_data
+        self.num_iterations = num_iterations
+        self.invocation = invocation
+
+    @staticmethod
+    def get_total_unit():
+        return None
+
+    @staticmethod
+    def get_total_value():
+        return None
+
+    def as_dict(self):
+        return {
+            'd': self.processed_data,
+            'nit': self.num_iterations,
+            'in': self.invocation
+        }
+
+    def as_str_list(self):
+        as_json = json.dumps(self.processed_data)
+        return ([str(self.invocation), str(self.num_iterations)]
+                + self.run_id.as_str_list() + [as_json])
+
+    @classmethod
+    def from_str_list(cls, data_store, str_list, _line_number=None, _filename=None):
+        invocation = int(str_list[0])
+        num_iterations = int(str_list[1])
+        run_id = RunId.from_str_list(data_store, str_list[2:-1])
+        processed_data = str_list[-1]
+
+        return ProfileData(run_id, processed_data, num_iterations, invocation)
diff --git a/rebench/model/profiler.py b/rebench/model/profiler.py
new file mode 100644
index 00000000..e3721310
--- /dev/null
+++ b/rebench/model/profiler.py
@@ -0,0 +1,54 @@
+from ..interop.perf_parser import PerfParser
+from ..subprocess_with_timeout import run
+from ..ui import UIError
+
+
+class Profiler(object):
+
+    @classmethod
+    def compile(cls, profiler_data):
+        profilers = []
+        if profiler_data is None:
+            return profilers
+
+        for k, v in profiler_data.items():
+            if k == "perf":
+                perf = PerfProfiler(k, v)
+                profilers.append(perf)
+            else:
+                raise Exception("Not yet supported profiler type: " + k)
+        return profilers
+
+    def __init__(self, name, gauge_name):
+        self.name = name
+        self.gauge_adapter_name = gauge_name
+
+
+class PerfProfiler(Profiler):
+
+    def __init__(self, name, cfg):
+        super(PerfProfiler, self).__init__(name, "Perf")
+        self.record_args = cfg.get('record_args') + " --output=profile.perf "
+        self.report_args = cfg.get('report_args') + " --input=profile.perf "
+        self.command = "perf"
+
+    def _construct_report_cmdline(self, executor):
+        # need to use sudo, otherwise, the profile.perf file won't be accessible
+        cmd = ""
+        if executor.use_denoise:
+            cmd += "sudo rebench-denoise --without-nice --without-shielding exec -- "
+        return cmd + self.command + " " + self.report_args
+
+    def process_profile(self, run_id, executor):
+        cmdline = self._construct_report_cmdline(executor)
+        (return_code, output, _) = run(cmdline, cwd=run_id.location, shell=True,
+                                       verbose=executor.debug)
+
+        if return_code != 0:
+            raise UIError(
+                "perf failed with error code when processing the profile to create a report: "
+                + str(return_code), None)
+
+        parser = PerfParser()
+        parser.parse_lines(output.split("\n"))
+        return parser.to_json()
diff --git a/rebench/model/run_id.py b/rebench/model/run_id.py
index 93f8efd1..4e204cae 100644
--- a/rebench/model/run_id.py
+++ b/rebench/model/run_id.py
@@ -21,7 +21,7 @@
 
 from .benchmark import Benchmark
 from .termination_check import TerminationCheck
-from ..statistics import StatisticProperties
+from ..statistics import StatisticProperties, SampleCounter
 from ..ui import UIError
 
 
@@ -36,7 +36,10 @@ def __init__(self, benchmark, cores, input_size, var_value, machine):
 
         self._reporters = set()
         self._persistence = set()
-        self.statistics = StatisticProperties()
+        if self.is_profiling():
+            self.statistics = SampleCounter()
+        else:
+            self.statistics = StatisticProperties()
         self.total_unit = None
 
         self._termination_check = None
@@ -103,6 +106,16 @@ def location(self):
             return None
         return self._expand_vars(self.benchmark.suite.location)
 
+    def get_gauge_adapter_name(self):
+        if self.is_profiling():
+            # TODO: needs changing once we want to support different profilers
+            perf_profile = self.benchmark.suite.executor.profiler[0]
+            return perf_profile.gauge_adapter_name
+        return self.benchmark.gauge_adapter
+
+    def is_profiling(self):
+        return self.benchmark.suite.executor.action == "profile"
+
     def build_commands(self):
         commands = set()
         builds = self.benchmark.suite.executor.build
diff --git a/rebench/persistence.py b/rebench/persistence.py
index 30d4c2bd..967e3ff1 100644
--- a/rebench/persistence.py
+++ b/rebench/persistence.py
@@ -29,6 +29,7 @@
 from .environment import determine_environment, determine_source_details
 from .model.data_point  import DataPoint
 from .model.measurement import Measurement
+from .model.profile_data import ProfileData
 from .model.run_id      import RunId
 from .rebenchdb         import get_current_time
 from .ui                import UIError
@@ -48,7 +49,7 @@ def load_data(self, runs, discard_run_data):
         for persistence in list(self._files.values()):
             persistence.load_data(runs, discard_run_data)
 
-    def get(self, filename, configurator):
+    def get(self, filename, configurator, action):
         if filename not in self._files:
             source = determine_source_details(configurator)
             if configurator.use_rebench_db and source['commitId'] is None:
@@ -62,11 +63,17 @@ def get(self, filename, configurator):
             if configurator.options and configurator.options.branch:
                 source['branchOrTag'] = configurator.options.branch
 
-            p = _FilePersistence(filename, self, configurator, self.ui)
+            if action == "profile":
+                p = _ProfileFilePersistence(filename, self, configurator, self.ui)
+            else:
+                p = _FilePersistence(filename, self, configurator, self.ui)
             self.ui.debug_output_info('ReBenchDB enabled: {e}\n', e=configurator.use_rebench_db)
 
             if configurator.use_rebench_db:
-                db = _ReBenchDB(configurator, self, self.ui)
+                if action == "profile":
+                    db = _ProfileReBenchDB(configurator, self, self.ui)
+                else:
+                    db = _ReBenchDB(configurator, self, self.ui)
                 p = _CompositePersistence(p, db)
 
             self._files[filename] = p
@@ -258,30 +265,8 @@ def _process_lines(self, data_file, runs, filtered_data_file):
                 continue
 
             try:
-                measurement = Measurement.from_str_list(
-                    self._data_store, line.rstrip('\n').split(self._SEP),
-                    line_number, self._data_filename)
-
-                run_id = measurement.run_id
-                if filtered_data_file and runs and run_id in runs:
-                    continue
-
-                # these are all the measurements that are not filtered out
-                if filtered_data_file:
-                    filtered_data_file.write(line)
-
-                if previous_run_id is not run_id:
-                    data_point = DataPoint(run_id)
-                    previous_run_id = run_id
-
-                data_point.add_measurement(measurement)
-
-                if measurement.is_total():
-                    run_id.loaded_data_point(data_point,
-                                             (measurement.iteration <= run_id.warmup_iterations
-                                              if run_id.warmup_iterations else False))
-                    data_point = DataPoint(run_id)
-
+                data_point, previous_run_id = self._parse_data_line(
+                    data_point, line, line_number, runs, filtered_data_file, previous_run_id)
             except ValueError as err:
                 msg = str(err)
                 if not errors:
@@ -292,6 +277,33 @@ def _process_lines(self, data_file, runs, filtered_data_file):
                     self.ui.debug_error_info("{ind}" + msg + "\n")
                     errors.add(msg)
 
+    def _parse_data_line(
+            self, data_point, line, line_number, runs, filtered_data_file, previous_run_id):
+        measurement = Measurement.from_str_list(
+            self._data_store, line.rstrip('\n').split(self._SEP),
+            line_number, self._data_filename)
+
+        run_id = measurement.run_id
+        if filtered_data_file and runs and run_id in runs:
+            return data_point, previous_run_id
+
+        # these are all the measurements that are not filtered out
+        if filtered_data_file:
+            filtered_data_file.write(line)
+
+        if previous_run_id is not run_id:
+            data_point = DataPoint(run_id)
+            previous_run_id = run_id
+
+        data_point.add_measurement(measurement)
+
+        if measurement.is_total():
+            run_id.loaded_data_point(data_point,
+                                     (measurement.iteration <= run_id.warmup_iterations
+                                      if run_id.warmup_iterations else False))
+            data_point = DataPoint(run_id)
+        return data_point, previous_run_id
+
     def _open_file_and_append_execution_comment(self):
         """
         Append a shebang (#!/path/to/executable) to the data file.
@@ -318,6 +330,11 @@ def _open_file_and_append_execution_comment(self):
 
     _SEP = "\t"  # separator between serialized parts of a measurement
 
+    def _persists_data_point_in_open_file(self, data_point):
+        for measurement in data_point.get_measurements():
+            line = self._SEP.join(measurement.as_str_list())
+            self._file.write(line + "\n")
+
     def persist_data_point(self, data_point):
         """
         Serialize all measurements of the data point and persist them
@@ -325,11 +342,7 @@ def persist_data_point(self, data_point):
         """
         with self._lock:
             self._open_file_to_add_new_data()
-
-            for measurement in data_point.get_measurements():
-                line = self._SEP.join(measurement.as_str_list())
-                self._file.write(line + "\n")
-
+            self._persists_data_point_in_open_file(data_point)
             self._file.flush()
 
     def run_completed(self):
@@ -345,6 +358,32 @@ def close(self):
             self._file = None
 
 
+class _ProfileFilePersistence(_FilePersistence):
+    def _persists_data_point_in_open_file(self, data_point):
+        assert isinstance(data_point, ProfileData)
+        line = self._SEP.join(data_point.as_str_list())
+        assert "\n" not in line, "The newline character is now allowed in a data line"
+        self._file.write(line + "\n")
+
+    def _parse_data_line(
+            self, data_point, line, line_number, runs, filtered_data_file, previous_run_id):
+        str_list = line.rstrip('\n').split(self._SEP)
+
+        data_point = ProfileData.from_str_list(
+            self._data_store, str_list, line_number, self._data_filename)
+
+        run_id = data_point.run_id
+        if filtered_data_file and runs and run_id in runs:
+            return data_point
+
+        # these are all the measurements that are not filtered out
+        if filtered_data_file:
+            filtered_data_file.write(line)
+
+        run_id.loaded_data_point(data_point, False)
+        return data_point, run_id
+
+
 class _ReBenchDB(_ConcretePersistence):
 
     def __init__(self, configurator, data_store, ui):
@@ -408,7 +447,7 @@ def _send_data(self, cache):
             criteria_index.append({'c': c[0], 'u': c[1], 'i': idx})
 
         self.ui.debug_output_info(
-            "ReBenchDB: Send {num_m} measures. startTime: {st}\n",
+            "ReBenchDB: Sending {num_m} measures. startTime: {st}\n",
             num_m=num_measurements, st=self._start_time)
         return self._rebench_db.send_results({
             'data': all_data,
@@ -420,3 +459,27 @@ def _send_data(self, cache):
     def close(self):
         with self._lock:
             self._send_data_and_empty_cache()
+
+
+class _ProfileReBenchDB(_ReBenchDB):
+
+    def _send_data(self, cache):
+        self.ui.debug_output_info("ReBenchDB: Prepare data for sending\n")
+        num_profiles = 0
+        all_data = []
+        for run_id, data_points in cache.items():
+            profile_data = [dp.as_dict() for dp in data_points]
+            num_profiles += len(profile_data)
+            all_data.append({
+                'runId': run_id.as_dict(),
+                'p': profile_data
+            })
+
+        self.ui.debug_output_info(
+            "ReBenchDB: Sending {num_m} profiles. startTime: {st}\n",
+            num_m=num_profiles, st=self._start_time)
+        return self._rebench_db.send_results({
+            'data': all_data,
+            'env': determine_environment(),
+            'startTime': self._start_time,
+            'source': determine_source_details(self._configurator)}, num_profiles)
diff --git a/rebench/rebench-schema.yml b/rebench/rebench-schema.yml
index 60015146..9c9d9999 100644
--- a/rebench/rebench-schema.yml
+++ b/rebench/rebench-schema.yml
@@ -250,6 +250,22 @@ schema;executor_type:
       type: str
     build:
       include: build_type
+    profiler:
+      type: map
+      allowempty: True
+      mapping:
+        perf:
+          type: map
+          allowempty: True
+          mapping:
+            record_args:
+              type: str
+              desc: Arguments given to `perf` when recording a profile
+              default: record -g -F 9999 --call-graph lbr
+            report_args:
+              type: str
+              desc: Argument given to `perf` when processing the recording
+              default: report -g graph --no-children --stdio
 
 schema;exp_suite_type:
   desc: A list of suites
@@ -282,6 +298,11 @@ schema;experiment_type:
     data_file:
       desc: The data for this experiment goes into a separate file
       type: str
+    action:
+      desc: Whether to do benchmarking or profiling. This controls how experiemnts are executed and how results are analyzed.
+      type: str
+      pattern: benchmark|profile
+      default: benchmark
     reporting:
       include: reporting_type
 
diff --git a/rebench/rebench.py b/rebench/rebench.py
index a06265c0..0435ca67 100755
--- a/rebench/rebench.py
+++ b/rebench/rebench.py
@@ -255,13 +255,14 @@ def run(self, argv=None):
             return self._report_completion()
 
         runs = self._config.get_runs()
+        does_profiling = any(r.is_profiling() for r in runs)
 
         denoise_result = None
         show_denoise_warnings = not (self._config.artifact_review
                                      or self._config.options.execution_plan)
 
         try:
-            denoise_result = minimize_noise(show_denoise_warnings, self.ui)
+            denoise_result = minimize_noise(show_denoise_warnings, self.ui, does_profiling)
             init_environment(denoise_result, self.ui)
 
             data_store.load_data(runs, self._config.options.do_rerun)
diff --git a/rebench/rebenchdb.py b/rebench/rebenchdb.py
index 2716d37e..f30d7bf0 100644
--- a/rebench/rebenchdb.py
+++ b/rebench/rebenchdb.py
@@ -49,13 +49,13 @@ def __init__(self, server_base_url, project_name, experiment_name, ui):
         self._project_name = project_name
         self._experiment_name = experiment_name
 
-    def send_results(self, benchmark_data, num_measurements):
+    def send_results(self, benchmark_data, num_items):
         success, response = self._send_to_rebench_db(benchmark_data, '/results')
 
         if success:
             self.ui.verbose_output_info(
-                "ReBenchDB: Sent {num_m} results to ReBenchDB, response was: {resp}\n",
-                num_m=num_measurements, resp=response)
+                "ReBenchDB: Sent {num_i} results to ReBenchDB, response was: {resp}\n",
+                num_i=num_items, resp=response)
 
         return success, response
 
diff --git a/rebench/statistics.py b/rebench/statistics.py
index a258cc49..4054739f 100644
--- a/rebench/statistics.py
+++ b/rebench/statistics.py
@@ -20,6 +20,16 @@
 import math
 
 
+class SampleCounter(object):
+
+    def __init__(self):
+        self.num_samples = 0
+        self.mean = 0
+
+    def add_sample(self, _sample):
+        self.num_samples += 1
+
+
 class StatisticProperties(object):
     """
     The class maintains running statistics for the added data points.


Test patch:
diff --git a/rebench/interop/test_vm_adapter.py b/rebench/interop/test_vm_adapter.py
index 30b6fc22..5dcfe9a6 100644
--- a/rebench/interop/test_vm_adapter.py
+++ b/rebench/interop/test_vm_adapter.py
@@ -31,8 +31,8 @@ class TestExecutorAdapter(GaugeAdapter):
 
     re_time = re.compile(r"RESULT-(\w+):\s*(\d+\.\d+)")
 
-    def __init__(self, include_faulty):
-        super(TestExecutorAdapter, self).__init__(include_faulty)
+    def __init__(self, include_faulty, executor):
+        super(TestExecutorAdapter, self).__init__(include_faulty, executor)
         self._other_error_definitions = [re.compile("FAILED")]
 
     def parse_data(self, data, run_id, invocation):
diff --git a/rebench/tests/bugs/issue_4_run_equality_and_params_test.py b/rebench/tests/bugs/issue_4_run_equality_and_params_test.py
index 8de6a574..3aa0b4db 100644
--- a/rebench/tests/bugs/issue_4_run_equality_and_params_test.py
+++ b/rebench/tests/bugs/issue_4_run_equality_and_params_test.py
@@ -36,7 +36,7 @@ def setUp(self):
     @staticmethod
     def _create_template_run_id():
         executor = Executor('MyVM', 'foo_bar_path', 'foo_bar_bin',
-                            None, None, None, None, None)
+                            None, None, None, None, None, None, "benchmark")
         suite = BenchmarkSuite("MySuite", executor, '', '%(benchmark)s %(cores)s %(input)s',
                                None, None, [], None, None, None)
         benchmark = Benchmark("TestBench", "TestBench", None, suite, None,
@@ -46,7 +46,7 @@ def _create_template_run_id():
     @staticmethod
     def _create_hardcoded_run_id():
         executor = Executor('MyVM', 'foo_bar_path', 'foo_bar_bin',
-                            None, None, None, None, None)
+                            None, None, None, None, None, None, "benchmark")
         suite = BenchmarkSuite('MySuite', executor, '', '%(benchmark)s %(cores)s 2 3',
                                None, None, [], None, None, None)
         benchmark = Benchmark("TestBench", "TestBench", None, suite,
diff --git a/rebench/tests/denoise_test.py b/rebench/tests/denoise_test.py
index e06456a6..09720ccf 100644
--- a/rebench/tests/denoise_test.py
+++ b/rebench/tests/denoise_test.py
@@ -9,7 +9,7 @@ def setUp(self):
         self._set_path(__file__)
 
     def test_minimize(self):
-        result = minimize_noise(False, self.ui)
+        result = minimize_noise(False, self.ui, True)
         self.assertIsInstance(result.succeeded, bool)
         self.assertIsInstance(result.use_nice, bool)
         self.assertIsInstance(result.use_shielding, bool)
diff --git a/rebench/tests/features/issue_32_jmh_support_test.py b/rebench/tests/features/issue_32_jmh_support_test.py
index 10a5ed48..9a941875 100644
--- a/rebench/tests/features/issue_32_jmh_support_test.py
+++ b/rebench/tests/features/issue_32_jmh_support_test.py
@@ -35,7 +35,7 @@ def setUp(self):
             self._data = data_file.read()
 
     def test_parsing(self):
-        adapter = JMHAdapter(False)
+        adapter = JMHAdapter(False, None)
         data_points = adapter.parse_data(self._data, None, 1)
 
         self.assertEqual(4  # number of experiments
diff --git a/rebench/tests/interop/plain_seconds_log_adapter_test.py b/rebench/tests/interop/plain_seconds_log_adapter_test.py
index d7b48633..fcce5d5a 100644
--- a/rebench/tests/interop/plain_seconds_log_adapter_test.py
+++ b/rebench/tests/interop/plain_seconds_log_adapter_test.py
@@ -26,15 +26,18 @@
 class PlainSecondsAdapterTest(TestCase):
 
     def test_acquire_command(self):
-        adapter = PlainSecondsLogAdapter(False)
-        cmd = adapter.acquire_command("FOO")
+        class _TestRunId(object):
+            def cmdline(self):
+                return "FOO"
+        adapter = PlainSecondsLogAdapter(False, None)
+        cmd = adapter.acquire_command(_TestRunId())
         self.assertEqual("FOO", cmd)
 
     def test_parse_data(self):
         data = """100
 50
 1"""
-        adapter = PlainSecondsLogAdapter(False)
+        adapter = PlainSecondsLogAdapter(False, None)
         data = adapter.parse_data(data, None, 2)
         self.assertEqual(3, len(data))
 
@@ -48,5 +51,5 @@ def test_parse_data(self):
         self.assertEqual(1000, data[2].get_total_value())
 
     def test_parse_no_data(self):
-        adapter = PlainSecondsLogAdapter(False)
+        adapter = PlainSecondsLogAdapter(False, None)
         self.assertRaises(OutputNotParseable, adapter.parse_data, "", None, 1)
diff --git a/rebench/tests/interop/rebench_log_adapter_test.py b/rebench/tests/interop/rebench_log_adapter_test.py
index 0ce81b00..c2eebcd0 100644
--- a/rebench/tests/interop/rebench_log_adapter_test.py
+++ b/rebench/tests/interop/rebench_log_adapter_test.py
@@ -37,37 +37,37 @@ def _assert_two_measures(self, data, val1, unit1, criterion1, val_t, unit_t):
         self.assertEqual(unit_t, measure.unit)
 
     def test_simple_name(self):
-        adapter = RebenchLogAdapter(True)
+        adapter = RebenchLogAdapter(True, None)
         data = adapter.parse_data("Dispatch: iterations=1 runtime: 557ms", None, 1)
         self._assert_basics(data, 557, 'ms', 'total', True)
 
     def test_doted_name(self):
-        adapter = RebenchLogAdapter(True)
+        adapter = RebenchLogAdapter(True, None)
         data = adapter.parse_data(
             "LanguageFeatures.Dispatch: iterations=1 runtime: 309557us", None, 1)
         self._assert_basics(data, 309.557, 'ms', 'total', True)
 
     def test_doted_and_ms(self):
-        adapter = RebenchLogAdapter(True)
+        adapter = RebenchLogAdapter(True, None)
         data = adapter.parse_data(
             "LanguageFeatures.Dispatch: iterations=1 runtime: 557ms", None, 1)
         self._assert_basics(data, 557, 'ms', 'total', True)
 
     def test_high_iter_count(self):
-        adapter = RebenchLogAdapter(True)
+        adapter = RebenchLogAdapter(True, None)
         data = adapter.parse_data(
             "LanguageFeatures.Dispatch: iterations=2342 runtime: 557ms", None, 1)
         self._assert_basics(data, 557, 'ms', 'total', True)
 
     def test_total_explicit(self):
-        adapter = RebenchLogAdapter(True)
+        adapter = RebenchLogAdapter(True, None)
         data = adapter.parse_data(
             "LanguageFeatures.Dispatch total: iterations=2342 runtime: 557ms",
             None, 1)
         self._assert_basics(data, 557, 'ms', 'total', True)
 
     def test_alloc_criterion(self):
-        adapter = RebenchLogAdapter(True)
+        adapter = RebenchLogAdapter(True, None)
         data = adapter.parse_data(
             """LanguageFeatures.Dispatch alloc: iterations=2342 runtime: 222ms
 LanguageFeatures.Dispatch total: iterations=2342 runtime: 557ms""",
@@ -75,7 +75,7 @@ def test_alloc_criterion(self):
         self._assert_two_measures(data, 222, 'ms', 'alloc', 557, 'ms')
 
     def test_foobar_criterion(self):
-        adapter = RebenchLogAdapter(True)
+        adapter = RebenchLogAdapter(True, None)
         data = adapter.parse_data(
             """LanguageFeatures.Dispatch foobar: iterations=2342 runtime: 550ms
 LanguageFeatures.Dispatch total: iterations=2342 runtime: 557ms""",
@@ -83,7 +83,7 @@ def test_foobar_criterion(self):
         self._assert_two_measures(data, 550, 'ms', 'foobar', 557, 'ms')
 
     def test_foobar_criterion_no_doted_name(self):
-        adapter = RebenchLogAdapter(True)
+        adapter = RebenchLogAdapter(True, None)
         data = adapter.parse_data(
             """Dispatch foobar: iterations=2342 runtime: 550ms
 LanguageFeatures.Dispatch total: iterations=2342 runtime: 557ms""",
@@ -91,21 +91,21 @@ def test_foobar_criterion_no_doted_name(self):
         self._assert_two_measures(data, 550, 'ms', 'foobar', 557, 'ms')
 
     def test_some_prefix_before_data(self):
-        adapter = RebenchLogAdapter(True)
+        adapter = RebenchLogAdapter(True, None)
         data = adapter.parse_data(
             "some prefix: Dispatch: iterations=2342 runtime: 557ms",
             None, 11)
         self._assert_basics(data, 557, 'ms', 'total', True)
 
     def test_path_as_name(self):
-        adapter = RebenchLogAdapter(True)
+        adapter = RebenchLogAdapter(True, None)
         data = adapter.parse_data(
             "core-lib/Benchmarks/Join/FibSeq.ns: iterations=1 runtime: 129us",
             None, 12)
         self._assert_basics(data, 0.129, 'ms', 'total', True)
 
     def test_other_data(self):
-        adapter = RebenchLogAdapter(True)
+        adapter = RebenchLogAdapter(True, None)
         data = adapter.parse_data("""Savina.Chameneos: trace size:    3903398byte
 Savina.Chameneos: external data: 40byte
 Savina.Chameneos: iterations=1 runtime: 64208us
diff --git a/rebench/tests/interop/time_adapter_test.py b/rebench/tests/interop/time_adapter_test.py
index 1efdd248..a9b6e0e7 100644
--- a/rebench/tests/interop/time_adapter_test.py
+++ b/rebench/tests/interop/time_adapter_test.py
@@ -23,18 +23,23 @@
 from ...interop.time_adapter import TimeAdapter, TimeManualAdapter
 
 
+class _TestRunId(object):
+    def cmdline(self):
+        return "FOO"
+
+
 class TimeAdapterTest(TestCase):
 
     def test_acquire_command(self):
-        adapter = TimeAdapter(False)
-        cmd = adapter.acquire_command("FOO")
+        adapter = TimeAdapter(False, None)
+        cmd = adapter.acquire_command(_TestRunId())
         self.assertTrue(cmd.startswith("/usr/bin/time"))
 
     def test_parse_data(self):
         data = """real        11.00
 user         5.00
 sys          1.00"""
-        adapter = TimeAdapter(False)
+        adapter = TimeAdapter(False, None)
         data = adapter.parse_data(data, None, 1)
         self.assertEqual(1, len(data))
 
@@ -43,10 +48,10 @@ def test_parse_data(self):
         self.assertEqual(11000, data[0].get_total_value())
 
     def test_parse_no_data(self):
-        adapter = TimeAdapter(False)
+        adapter = TimeAdapter(False, None)
         self.assertRaises(OutputNotParseable, adapter.parse_data, "", None, 1)
 
     def test_manual_adapter(self):
-        adapter = TimeManualAdapter(False)
-        cmd = adapter.acquire_command("FOO")
+        adapter = TimeManualAdapter(False, None)
+        cmd = adapter.acquire_command(_TestRunId())
         self.assertEqual("FOO", cmd)
diff --git a/rebench/tests/perf/__init__.py b/rebench/tests/perf/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/rebench/tests/perf/cat-first.sh b/rebench/tests/perf/cat-first.sh
new file mode 100755
index 00000000..c3d7f0c2
--- /dev/null
+++ b/rebench/tests/perf/cat-first.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+cat $1
\ No newline at end of file
diff --git a/rebench/tests/perf/issue_166.conf b/rebench/tests/perf/issue_166.conf
new file mode 100644
index 00000000..f76f3d8c
--- /dev/null
+++ b/rebench/tests/perf/issue_166.conf
@@ -0,0 +1,40 @@
+default_experiment: profile
+
+benchmark_suites:
+  Suite:
+    gauge_adapter: TestExecutor
+    command: TestBenchMarks %(benchmark)s %(warmup)s
+    benchmarks:
+      - Bench1:
+          warmup: 13
+
+executors:
+    TestRunner1:
+        path: .
+        executable: issue_15_vm.py
+        profiler:
+          perf: {}
+    TestRunner2:
+        path: .
+        executable: issue_15_vm.py
+        profiler:
+          perf:
+            record_args: record custom-args
+            report_args: report custom-args
+
+experiments:
+    profile:
+        action: profile
+        suites:
+          - Suite
+        executions:
+          - TestRunner1
+          - TestRunner2
+
+    profile2:
+      action: profile
+      invocations: 7
+      suites:
+        - Suite
+      executions:
+        - TestRunner1
diff --git a/rebench/tests/perf/issue_166_profiling_test.py b/rebench/tests/perf/issue_166_profiling_test.py
new file mode 100644
index 00000000..1c6e9cc7
--- /dev/null
+++ b/rebench/tests/perf/issue_166_profiling_test.py
@@ -0,0 +1,194 @@
+from ..mock_http_server import MockHTTPServer
+from ...configurator import Configurator, load_config
+from ...executor import Executor
+from ...model.profile_data import ProfileData
+from ...persistence import DataStore
+from ...interop.perf_adapter import PerfAdapter
+
+from ..rebench_test_case import ReBenchTestCase
+from ...rebench import ReBench
+
+
+class Issue166ProfilingSupportTest(ReBenchTestCase):
+    def setUp(self):
+        super(Issue166ProfilingSupportTest, self).setUp()
+        self._set_path(__file__)
+
+    def test_check_executors_raw_values(self):
+        cnf = Configurator(load_config(self._path + '/issue_166.conf'), DataStore(self.ui),
+                           self.ui, data_file=self._tmp_file)
+        execs = cnf._executors
+
+        self.assertEqual(2, len(execs))
+
+        self.assertEqual(execs['TestRunner1']['profiler']['perf']['record_args'],
+                         "record -g -F 9999 --call-graph lbr")
+        self.assertEqual(execs['TestRunner1']['profiler']['perf']['report_args'],
+                         "report -g graph --no-children --stdio")
+
+        self.assertEqual(execs['TestRunner2']['profiler']['perf']['record_args'],
+                         "record custom-args")
+        self.assertEqual(execs['TestRunner2']['profiler']['perf']['report_args'],
+                         "report custom-args")
+
+    def test_run_id_includes_profiling_details(self):
+        cnf = Configurator(load_config(self._path + '/issue_166.conf'), DataStore(self.ui),
+                           self.ui, data_file=self._tmp_file)
+        run_id = list(cnf.get_runs())[0]
+        profilers = run_id.benchmark.suite.executor.profiler
+        self.assertEqual(len(profilers), 1)
+
+        profiler = profilers[0]
+
+        self.assertEqual(profiler.name, "perf")
+        self.assertEqual(profiler.command, "perf")
+        self.assertEqual(profiler.record_args,
+                         "record -g -F 9999 --call-graph lbr --output=profile.perf ")
+        self.assertEqual(profiler.report_args,
+                         "report -g graph --no-children --stdio --input=profile.perf ")
+
+        # TODO: how do we deal with having multiple profilers defined?
+        # this is something for when we support more than one
+        # perhaps it's a command line flag, or a setting of the experiment, ...
+        # depends where we want to OS-dependent bits to come in...
+
+    def _load_config_and_use_tmp_as_data_file(self):
+        raw_config = load_config(self._path + '/issue_166.conf')
+        raw_config['experiments']['profile']['data_file'] = self._tmp_file
+        return raw_config
+
+    def test_persist_profile_data(self):
+        raw_config = self._load_config_and_use_tmp_as_data_file()
+        cnf = Configurator(raw_config, DataStore(self.ui), self.ui)
+        runs = list(cnf.get_runs())
+        run_id = runs[0]
+
+        self.assertEqual(0, run_id.completed_invocations)
+        self.assertEqual(0, run_id.get_number_of_data_points())
+
+        data_point = ProfileData(run_id, "TEST-DATA, not json though, just a string", 1, 1)
+        run_id.add_data_point(data_point, False)
+        run_id.close_files()
+        self.assertEqual(1, run_id.completed_invocations)
+        self.assertEqual(1, run_id.get_number_of_data_points())
+
+        # create new data store, and load data file
+        data_store = DataStore(self.ui)
+        cnf = Configurator(raw_config, data_store, self.ui)
+        data_store.get(self._tmp_file, cnf, "profile")
+        data_store.load_data(None, False)
+
+        # confirm that data was loaded (we don't have direct access to it,
+        # so, just check that completion count is correct)
+        run_id2 = list(cnf.get_runs())[0]
+        self.assertIsNot(run_id, run_id2)
+        self.assertEqual(1, run_id2.completed_invocations)
+        self.assertEqual(1, run_id2.get_number_of_data_points())
+
+    def test_perf_gauge_adapter_reads_perf_report(self):
+        cnf = Configurator(load_config(self._path + '/issue_166.conf'), DataStore(self.ui),
+                           self.ui, data_file=self._tmp_file)
+        runs = list(cnf.get_runs())
+        run_id = runs[0]
+
+        self._make_profiler_return_small_report(run_id)
+
+        executor = Executor(runs, False, self.ui)
+        executor.use_denoise = False
+
+        perf_adapter = PerfAdapter(False, executor)
+        out_from_benchmark = ""  # don't really need it
+
+        data = perf_adapter.parse_data(out_from_benchmark, run_id, 1)
+        self.assertEqual(1, len(data))
+
+        profile_data = data[0]
+        self.assertEqual(1, profile_data.invocation)
+        self.assertEqual(1, profile_data.num_iterations)
+        self.assertIsNotNone(profile_data.processed_data)
+
+        result_data = profile_data.processed_data
+        self.assertEqual(len(result_data), 10)
+
+        self.assertEqual(
+            'MessageSendNode$AbstractMessageSendNode_evaluateArguments', result_data[0]['m'])
+        self.assertEqual('intel_pmu_handle_irq', result_data[9]['m'])
+
+    def test_execute_profiling(self):
+        raw_config = self._load_config_and_use_tmp_as_data_file()
+        cnf = Configurator(raw_config, DataStore(self.ui), self.ui, data_file=self._tmp_file)
+        runs = cnf.get_runs()
+        run_id = list(cnf.get_runs())[0]
+        self.assertEqual(0, run_id.completed_invocations)
+        self.assertEqual(0, run_id.get_number_of_data_points())
+
+        self._make_profiler_return_small_report(run_id)
+
+        executor = Executor(runs, False, self.ui)
+        executor.execute()
+
+        self.assertEqual(1, run_id.completed_invocations)
+        self.assertEqual(1, run_id.get_number_of_data_points())
+
+    def test_execute_profiling_profile2(self):
+        raw_config = self._load_config_and_use_tmp_as_data_file()
+        cnf = Configurator(
+            raw_config, DataStore(self.ui), self.ui, exp_name="profile2", data_file=self._tmp_file)
+
+        runs = cnf.get_runs()
+        run_id = list(cnf.get_runs())[0]
+        self.assertEqual(0, run_id.completed_invocations)
+        self.assertEqual(0, run_id.get_number_of_data_points())
+
+        self._make_profiler_return_small_report(run_id)
+
+        executor = Executor(runs, False, self.ui)
+        executor.execute()
+
+        self.assertEqual(7, run_id.completed_invocations)
+        self.assertEqual(7, run_id.get_number_of_data_points())
+
+    def test_send_to_rebench_db(self):
+        server = MockHTTPServer()
+        port = server.get_free_port()
+        server.start()
+
+        raw_config = self._load_config_and_use_tmp_as_data_file()
+        raw_config['reporting'] = {}
+        raw_config['reporting']['rebenchdb'] = {
+            'db_url': 'http://localhost:' + str(port),
+            'repo_url': 'http://repo.git',
+            'project_name': 'Persistency Test',
+            'send_to_rebench_db': True,
+            'record_all': True}
+
+        option_parser = ReBench().shell_options()
+        cmd_config = option_parser.parse_args(['--experiment=Test', 'ignored'])
+
+        try:
+            cnf = Configurator(
+                raw_config, DataStore(self.ui), self.ui, cmd_config, data_file=self._tmp_file)
+            runs = cnf.get_runs()
+            run_id = list(cnf.get_runs())[0]
+            self._make_profiler_return_small_report(run_id)
+
+            executor = Executor(runs, False, self.ui)
+            executor.execute()
+
+            run_id.close_files()
+
+            self.assertEqual(1, run_id.completed_invocations)
+            self.assertEqual(1, run_id.get_number_of_data_points())
+
+            self.assertEqual(1, server.get_number_of_put_requests())
+        finally:
+            server.shutdown()
+
+    @staticmethod
+    def _make_profiler_return_small_report(run_id):
+        # need first to mess with the profiler, to load our test data
+        profilers = run_id.benchmark.suite.executor.profiler
+        profiler = profilers[0]
+        profiler.command = "./cat-first.sh"
+        profiler.record_args = "perf-small.report"
+        profiler.report_args = "perf-small.report"
diff --git a/rebench/tests/perf/perf-small.report b/rebench/tests/perf/perf-small.report
new file mode 100644
index 00000000..9c4bc628
--- /dev/null
+++ b/rebench/tests/perf/perf-small.report
@@ -0,0 +1,74 @@
+# To display the perf.data header info, please use --header/--header-only options.
+#
+#
+# Total Lost Samples: 0
+#
+# Samples: 5K of event 'cycles'
+# Event count (approx.): 2041096754
+#
+# Overhead  Command          Shared Object          Symbol
+# ........  ...............  .....................  ............................................................................................................................
+#
+     7.20%  som-native-inte  som-native-interp-ast  [.] MessageSendNode$AbstractMessageSendNode_evaluateArguments_bf7729bae6effddecf0ca8938ecdffedaf15af80
+            |
+             --6.87%--MessageSendNode$AbstractMessageSendNode_evaluateArguments_bf7729bae6effddecf0ca8938ecdffedaf15af80
+                       MessageSendNode$AbstractMessageSendNode_executeGeneric_ce143f167036af2090f6f15e30925550ece327b1
+                       EagerBinaryPrimitiveNode_executeGeneric_bf7fec9ded572fea61a9eb9b0031d6b40ef4bfd5
+                       ExpressionNode_executeLong_60573f5a2d4614ca6dba4dee6fc4c0360506579e
+                       LocalVariableNodeFactory$LocalVariableWriteNodeGen_executeGeneric_long1_8df9fa806730986c6ab0936a7d9664e0804872dd
+                       LocalVariableNodeFactory$LocalVariableWriteNodeGen_executeGeneric_d34e37175ec510884af37c4981ffe17309cec6f9
+                       IntToDoInlinedLiteralsNode_doLooping_fb28898ad8110f21d8b57027a624697a9988f4df
+                       IntToDoInlinedLiteralsNode_doIntToDo_54685947c4bcab224870fc73d385c495122b828b
+                       |
+                        --6.82%--IntToDoInlinedLiteralsNodeFactory$IntToDoInlinedLiteralsNodeGen_executeGeneric_long_long0_428318a36ea78a9e61e6131f65153ae65cab856e
+                                  IntToDoInlinedLiteralsNodeFactory$IntToDoInlinedLiteralsNodeGen_executeGeneric_6c504e8fb74533c0c8f482ceba93fbeb804e2309
+                                  SequenceNode_executeAllButLast_7ffffa02f868d75a4ead8de6598d3a6c60cc77b5
+                                  SequenceNode_executeGeneric_364feac66f6f18a1c2b66d8747b1dbd96f2ec1fe
+                                  Invokable_execute_d564e72a18f8c94ffa706cc3f56f49e5f8bffad6
+                                  OptimizedCallTarget_executeRootNode_a43d01f11c960918e3be5d613c7f9397ed47b422
+                                  |
+                                   --3.13%--OptimizedCallTarget_profiledPERoot_afb4ccd0d1f43f0bbf82d042837d2118c889aac3
+                                             OptimizedCallTarget_callBoundary_945c18e26ecf71ada2e42c0edd94022a51217b1a
+                                             SubstrateOptimizedCallTarget_doInvoke_c3dbb37c50b0da98609ebaac00eaa5abf3d20158
+                                             OptimizedCallTarget_callDirect_fa23f04a788131fce3f957bec1f0bf5253856350
+                                             OptimizedDirectCallNode_call_ba221ffaf307f8b4cdcc1da9e0b137c8c24c957a
+                                             |
+                                              --3.06%--CachedDispatchNode_executeDispatch_25c10c62eef54a3b9bcd3e8ec866c36ad670747a
+                                                        |
+                                                         --1.72%--MessageSendNode$GenericMessageSendNode_doPreEvaluated_b0c6be8786ca7c0b2225a86f9d4ef06280c767d7
+                                                                   MessageSendNode$AbstractMessageSendNode_executeGeneric_ce143f167036af2090f6f15e30925550ece327b1
+                                                                   MessageSendNode$AbstractMessageSendNode_evaluateArguments_bf7729bae6effddecf0ca8938ecdffedaf15af80
+                                                                   MessageSendNode$AbstractMessageSendNode_executeGeneric_ce143f167036af2090f6f15e30925550ece327b1
+
+     0.68%  som-native-inte  som-native-interp-ast  [.] Math_addExact_82781cf4703b1f9361345a357477b948d4847383
+            |
+            ---Math_addExact_82781cf4703b1f9361345a357477b948d4847383
+               AdditionPrimFactory$AdditionPrimNodeGen_executeEvaluated_73ce65ad96187e7b4675410d98c15f7d7d11f8aa
+               EagerBinaryPrimitiveNode_executeEvaluated_6bd1130635df6bfc662b95445aab9a123815b924
+               EagerBinaryPrimitiveNode_executeGeneric_bf7fec9ded572fea61a9eb9b0031d6b40ef4bfd5
+               ExpressionNode_executeLong_60573f5a2d4614ca6dba4dee6fc4c0360506579e
+               LocalVariableNodeFactory$LocalVariableWriteNodeGen_executeGeneric_long1_8df9fa806730986c6ab0936a7d9664e0804872dd
+               LocalVariableNodeFactory$LocalVariableWriteNodeGen_executeGeneric_d34e37175ec510884af37c4981ffe17309cec6f9
+               IntToDoInlinedLiteralsNode_doLooping_fb28898ad8110f21d8b57027a624697a9988f4df
+               IntToDoInlinedLiteralsNode_doIntToDo_54685947c4bcab224870fc73d385c495122b828b
+               |
+                --0.65%--IntToDoInlinedLiteralsNodeFactory$IntToDoInlinedLiteralsNodeGen_executeGeneric_long_long0_428318a36ea78a9e61e6131f65153ae65cab856e
+                          IntToDoInlinedLiteralsNodeFactory$IntToDoInlinedLiteralsNodeGen_executeGeneric_6c504e8fb74533c0c8f482ceba93fbeb804e2309
+                          SequenceNode_executeAllButLast_7ffffa02f868d75a4ead8de6598d3a6c60cc77b5
+                          SequenceNode_executeGeneric_364feac66f6f18a1c2b66d8747b1dbd96f2ec1fe
+                          Invokable_execute_d564e72a18f8c94ffa706cc3f56f49e5f8bffad6
+                          OptimizedCallTarget_executeRootNode_a43d01f11c960918e3be5d613c7f9397ed47b422
+
+     0.37%  som-native-inte  som-native-interp-ast  [.] HeapChunkProvider_resetAlignedHeapChunk_3b0d29e3728eb7a6fc10e5e8f65655e2b0d220ca
+     0.37%  som-native-inte  [kernel.kallsyms]      [k] native_irq_return_iret
+     0.32%  som-native-inte  [kernel.kallsyms]      [k] clear_page_erms
+     0.00%  som-native-inte  [kernel.kallsyms]      [k] native_apic_msr_write
+     0.00%  perf             [kernel.kallsyms]      [k] native_apic_msr_write
+     0.00%  som-native-inte  [kernel.kallsyms]      [k] intel_bts_enable_local
+     0.00%  som-native-inte  [kernel.kallsyms]      [k] intel_pmu_handle_irq
+     0.00%  perf             [kernel.kallsyms]      [k] intel_pmu_handle_irq
+
+
+#
+# (Cannot load tips.txt file, please install perf!)
+#
diff --git a/rebench/tests/perf/perf_parser_test.py b/rebench/tests/perf/perf_parser_test.py
new file mode 100644
index 00000000..ce2fc601
--- /dev/null
+++ b/rebench/tests/perf/perf_parser_test.py
@@ -0,0 +1,218 @@
+# pylint: disable=line-too-long
+import json
+from unittest import TestCase
+
+from ...interop.perf_parser import PerfParser
+
+
+class PerfParserTest(TestCase):
+
+    def setUp(self):
+        self.p = None
+
+    def _assert_json_is_serializable(self):
+        data = self.p.to_json()
+        json_str = json.dumps(data)
+        self.assertIsInstance(json_str, str)
+
+    def _parse(self, data):
+        self.p = p = PerfParser(None)
+        p.parse_lines(data.split("\n"))
+        return p.get_elements()
+
+    def test_simple_main_entries(self):
+        data = """
+     0.37%  som-native-inte  som-native-interp-ast  [.] HeapChunkProvider_resetAlignedHeapChunk_3b0d29e3728eb7a6fc10e5e8f65655e2b0d220ca
+     0.37%  som-native-inte  [kernel.kallsyms]      [k] native_irq_return_iret
+     0.32%  som-native-inte  [kernel.kallsyms]      [k] clear_page_erms
+     0.27%  som-native-inte  [kernel.kallsyms]      [k] sync_regs
+"""
+        elements = self._parse(data)
+        self.assertEqual(len(elements), 4)
+
+        e1 = elements[0]
+        e4 = elements[3]
+
+        self.assertIsNone(e1.trace)
+        self.assertIsNone(e4.trace)
+        self.assertEqual(e1.method, "HeapChunkProvider_resetAlignedHeapChunk")
+        self.assertEqual(e4.method, "sync_regs")
+
+        self.assertEqual(e1.percent, 0.37)
+        self.assertEqual(e4.percent, 0.27)
+
+        self._assert_json_is_serializable()
+
+    def test_simple_hierarchy(self):
+        data = """
+     7.20%  som-native-inte  som-native-interp-ast  [.] MessageSendNode$AbstractMessageSendNode_evaluateArguments_bf7729bae6effddecf0ca8938ecdffedaf15af80
+            |          
+             --6.87%--MessageSendNode$AbstractMessageSendNode_evaluateArguments_bf7729bae6effddecf0ca8938ecdffedaf15af80
+                       MessageSendNode$AbstractMessageSendNode_executeGeneric_ce143f167036af2090f6f15e30925550ece327b1
+                       IntToDoInlinedLiteralsNode_doIntToDo_54685947c4bcab224870fc73d385c495122b828b
+                       |          
+                        --6.82%--IntToDoInlinedLiteralsNodeFactory$IntToDoInlinedLiteralsNodeGen_executeGeneric_long_long0_428318a36ea78a9e61e6131f65153ae65cab856e
+                                  OptimizedCallTarget_executeRootNode_a43d01f11c960918e3be5d613c7f9397ed47b422
+                                  |          
+                                   --3.13%--OptimizedCallTarget_profiledPERoot_afb4ccd0d1f43f0bbf82d042837d2118c889aac3
+                                             OptimizedDirectCallNode_call_ba221ffaf307f8b4cdcc1da9e0b137c8c24c957a
+                                             |          
+                                              --3.06%--CachedDispatchNode_executeDispatch_25c10c62eef54a3b9bcd3e8ec866c36ad670747a
+                                                        |          
+                                                         --1.72%--MessageSendNode$GenericMessageSendNode_doPreEvaluated_b0c6be8786ca7c0b2225a86f9d4ef06280c767d7
+                                                                   MessageSendNode$AbstractMessageSendNode_executeGeneric_ce143f167036af2090f6f15e30925550ece327b1
+"""
+        elements = self._parse(data)
+        self.assertEqual(len(elements), 1)
+        e = elements[0]
+
+        self.assertIsNotNone(e.trace)
+        self.assertEqual(len(e.trace), 1)
+        self.assertEqual(e.method, "MessageSendNode$AbstractMessageSendNode_evaluateArguments")
+        self.assertEqual(e.percent, 7.20)
+
+        e = e.trace[0]
+        self.assertIsNotNone(e.trace)
+        self.assertEqual(len(e.trace), 3)
+        self.assertEqual(e.method, "MessageSendNode$AbstractMessageSendNode_evaluateArguments")
+        self.assertEqual(e.percent, 6.87)
+
+        e = e.trace[2]
+        self.assertIsNotNone(e.trace)
+        self.assertEqual(len(e.trace), 2)
+        self.assertEqual(e.method, "IntToDoInlinedLiteralsNodeFactory$IntToDoInlinedLiteralsNodeGen_executeGeneric_long_long0")
+        self.assertEqual(e.percent, 6.82)
+
+        e = e.trace[1]
+        self.assertIsNotNone(e.trace)
+        self.assertEqual(len(e.trace), 2)
+        self.assertEqual(e.method, "OptimizedCallTarget_profiledPERoot")
+        self.assertEqual(e.percent, 3.13)
+
+        e = e.trace[1]
+        self.assertIsNotNone(e.trace)
+        self.assertEqual(len(e.trace), 1)
+        self.assertEqual(e.method, "CachedDispatchNode_executeDispatch")
+        self.assertEqual(e.percent, 3.06)
+
+        e = e.trace[0]
+        self.assertIsNotNone(e.trace)
+        self.assertEqual(len(e.trace), 1)
+        self.assertEqual(e.method, "MessageSendNode$GenericMessageSendNode_doPreEvaluated")
+        self.assertEqual(e.percent, 1.72)
+
+        self._assert_json_is_serializable()
+
+    def test_hierarchy_with_some_nesting(self):
+        data = """
+     5.99%  som-native-inte  som-native-interp-ast  [.] LocalVariableNodeFactory$LocalVariableReadNodeGen_executeGeneric_b6d282cd7cee40289d20846bdb0b59a0940e00a5
+            |          
+             --5.78%--LocalVariableNodeFactory$LocalVariableReadNodeGen_executeGeneric_b6d282cd7cee40289d20846bdb0b59a0940e00a5
+                       |          
+                       |--2.92%--EagerBinaryPrimitiveNode_executeGeneric_bf7fec9ded572fea61a9eb9b0031d6b40ef4bfd5
+                       |          ExpressionNode_executeLong_60573f5a2d4614ca6dba4dee6fc4c0360506579e
+                       |          IntToDoInlinedLiteralsNode_doIntToDo_54685947c4bcab224870fc73d385c495122b828b
+                       |          |          
+                       |           --2.89%--IntToDoInlinedLiteralsNodeFactory$IntToDoInlinedLiteralsNodeGen_executeGeneric_long_long0_428318a36ea78a9e61e6131f65153ae65cab856e
+                       |          
+                        --2.86%--MessageSendNode$AbstractMessageSendNode_evaluateArguments_bf7729bae6effddecf0ca8938ecdffedaf15af80
+                                  IntToDoInlinedLiteralsNode_doIntToDo_54685947c4bcab224870fc73d385c495122b828b
+                                  |          
+                                   --2.83%--IntToDoInlinedLiteralsNodeFactory$IntToDoInlinedLiteralsNodeGen_executeGeneric_long_long0_428318a36ea78a9e61e6131f65153ae65cab856e
+"""
+        elements = self._parse(data)
+        self.assertEqual(len(elements), 1)
+
+        e = elements[0]
+        self.assertEqual(e.method, "LocalVariableNodeFactory$LocalVariableReadNodeGen_executeGeneric")
+        self.assertEqual(e.percent, 5.99)
+        self.assertEqual(len(e.trace), 1)
+
+        e = e.trace[0]
+        self.assertEqual(e.method,
+                         "LocalVariableNodeFactory$LocalVariableReadNodeGen_executeGeneric")
+        self.assertEqual(e.percent, 5.78)
+        self.assertEqual(len(e.trace), 2)
+
+        e1 = e.trace[0]
+        e2 = e.trace[1]
+        self.assertEqual(e1.method,
+                         "EagerBinaryPrimitiveNode_executeGeneric")
+        self.assertEqual(e2.method,
+                         "MessageSendNode$AbstractMessageSendNode_evaluateArguments")
+
+        self._assert_json_is_serializable()
+
+    def test_trace_from_main(self):
+        data = """
+     4.25%  som-native-inte  som-native-interp-ast  [.] OptimizedCallTarget_profileArguments_e8668a5ca6b9022553c0ee2866178043ad99124a
+            |
+            ---OptimizedCallTarget_profileArguments_e8668a5ca6b9022553c0ee2866178043ad99124a
+               OptimizedDirectCallNode_call_ba221ffaf307f8b4cdcc1da9e0b137c8c24c957a
+"""
+        elements = self._parse(data)
+        self.assertEqual(len(elements), 1)
+
+        e = elements[0]
+        self.assertEqual(e.method,
+                         "OptimizedCallTarget_profileArguments")
+        self.assertEqual(e.percent, 4.25)
+        self.assertEqual(len(e.trace), 2)
+
+        e1 = e.trace[0]
+        e2 = e.trace[1]
+        self.assertEqual(e1, "OptimizedCallTarget_profileArguments")
+        self.assertEqual(e2, "OptimizedDirectCallNode_call")
+
+        self._assert_json_is_serializable()
+
+    def test_trace_from_main_and_nested(self):
+        data = """
+     2.84%  som-native-inte  som-native-interp-ast  [.] FrameWithoutBoxing_getTag_371fb5158808fd7258a82f07cb9b58a2fe4c410c
+            |
+            ---FrameWithoutBoxing_getTag_371fb5158808fd7258a82f07cb9b58a2fe4c410c
+               LocalVariableNodeFactory$LocalVariableReadNodeGen_executeGeneric_b6d282cd7cee40289d20846bdb0b59a0940e00a5
+               |          
+               |--1.91%--MessageSendNode$AbstractMessageSendNode_evaluateArguments_bf7729bae6effddecf0ca8938ecdffedaf15af80
+               |          IntToDoInlinedLiteralsNode_doIntToDo_54685947c4bcab224870fc73d385c495122b828b
+               |          |          
+               |           --1.89%--IntToDoInlinedLiteralsNodeFactory$IntToDoInlinedLiteralsNodeGen_executeGeneric_long_long0_428318a36ea78a9e61e6131f65153ae65cab856e
+               |                     IntToDoInlinedLiteralsNodeFactory$IntToDoInlinedLiteralsNodeGen_executeGeneric_6c504e8fb74533c0c8f482ceba93fbeb804e2309
+               |          
+                --0.93%--EagerBinaryPrimitiveNode_executeGeneric_bf7fec9ded572fea61a9eb9b0031d6b40ef4bfd5
+                          ExpressionNode_executeLong_60573f5a2d4614ca6dba4dee6fc4c0360506579e
+     """
+        elements = self._parse(data)
+        self.assertEqual(len(elements), 1)
+
+        e = elements[0]
+        self.assertEqual(e.method,
+                         "FrameWithoutBoxing_getTag")
+        self.assertEqual(e.percent, 2.84)
+        self.assertEqual(len(e.trace), 4)
+
+        self.assertEqual(e.trace[0], "FrameWithoutBoxing_getTag")
+        self.assertEqual(e.trace[1], "LocalVariableNodeFactory$LocalVariableReadNodeGen_executeGeneric")
+
+        e3 = e.trace[2]
+        e4 = e.trace[3]
+
+        self.assertEqual(e3.method, "MessageSendNode$AbstractMessageSendNode_evaluateArguments")
+        self.assertEqual(e4.method, "EagerBinaryPrimitiveNode_executeGeneric")
+
+        self._assert_json_is_serializable()
+
+    def test_main_item_with_space(self):
+        data = """
+     0.76%  gnal Dispatcher  [kernel.kallsyms]   [k] zap_pte_range.isra.0
+            |
+            ---zap_pte_range.isra.0
+               unmap_page_range
+"""
+        elements = self._parse(data)
+        e = elements[0]
+
+        self.assertEqual(e.percent, 0.76)
+        self.assertEqual(e.binary, "gnal Dispatcher")
+        self.assertEqual(e.method, "zap_pte_range.isra.0")
+        self.assertEqual(e.shared_object, "[kernel.kallsyms]")
diff --git a/rebench/tests/persistency_test.py b/rebench/tests/persistency_test.py
index 00bc37f5..b171d99e 100644
--- a/rebench/tests/persistency_test.py
+++ b/rebench/tests/persistency_test.py
@@ -38,7 +38,7 @@ class PersistencyTest(ReBenchTestCase):
     def test_de_serialization(self):
         data_store = DataStore(self.ui)
         executor = ExecutorConf("MyVM", '', '',
-                                None, None, None, None, None)
+                                None, None, None, None, None, None, "benchmark")
         suite = BenchmarkSuite("MySuite", executor, '', '', None, None,
                                None, None, None, None)
         benchmark = Benchmark("Test Bench [>", "Test Bench [>", None,
diff --git a/rebench/tests/test.conf b/rebench/tests/test.conf
index eaf04757..687ef478 100644
--- a/rebench/tests/test.conf
+++ b/rebench/tests/test.conf
@@ -85,6 +85,8 @@ executors:
         ## any other benchmarks in parallel.
         ## true is the standard setting
         execute_exclusively: false
+        profiler:
+          perf: {}
 
 # define the benchmarks to be executed for a re-executable benchmark run
 # special definitions done here should override benchmark suite definitions, and
@@ -131,3 +133,11 @@ experiments:
            - TestBrokenCommandFormatSuite2
         executions:
            - TestRunner2
+
+    ProfileTest:
+        description: Define a profiling run
+        action: profile
+        suites:
+            - TestSuite1
+        executions:
+            - TestRunner2