92 lines
2 KiB
Markdown
92 lines
2 KiB
Markdown
# Benching `eh_elfs`
|
|
|
|
## Benchmark setup
|
|
|
|
Pick some name for your `eh_elfs` directory. We will call it `$EH_ELF_DIR`.
|
|
|
|
### Generate the `eh_elfs`
|
|
|
|
```bash
|
|
../../generate_eh_elf.py --deps -o "$EH_ELF_DIR" \
|
|
--keep-holes -O2 --global-switch --enable-deref-arg "$BENCHED_BINARY"
|
|
```
|
|
|
|
### Record a `perf` session
|
|
|
|
```bash
|
|
perf record --call-graph dwarf,4096 "$BENCHED_BINARY" [args]
|
|
```
|
|
|
|
### Set up the environment
|
|
|
|
```bash
|
|
source ../../env/apply [vanilla | vanilla-nocache | *eh_elf] [dbg | *release]
|
|
```
|
|
|
|
The first value selects the version of libunwind you will be running, the
|
|
second selects whether you want to run in debug or release mode (use release to
|
|
get readings, debug to check for errors).
|
|
|
|
You can reset your environment to its previous state by running `deactivate`.
|
|
|
|
If you pick the `eh_elf` flavour, you will also have to
|
|
|
|
```bash
|
|
export LD_LIBRARY_PATH="$EH_ELF_DIR:$LD_LIBRARY_PATH"
|
|
```
|
|
|
|
## Extract results
|
|
|
|
### Base readings
|
|
|
|
**In release mode** (faster), run
|
|
|
|
```bash
|
|
perf report 2>&1 >/dev/null
|
|
```
|
|
|
|
with both `eh_elf` and `vanilla` shells. Compare average time.
|
|
|
|
### Getting debug output
|
|
|
|
```bash
|
|
UNW_DEBUG_LEVEL=5 perf report 2>&1 >/dev/null
|
|
```
|
|
|
|
### Total number of calls to `unw_step`
|
|
|
|
```bash
|
|
UNW_DEBUG_LEVEL=5 perf report 2>&1 >/dev/null | grep -c "step:.* returning"
|
|
```
|
|
|
|
### Total number of vanilla errors
|
|
|
|
With the `vanilla` context,
|
|
|
|
```bash
|
|
UNW_DEBUG_LEVEL=5 perf report 2>&1 >/dev/null | grep -c "step:.* returning -"
|
|
```
|
|
|
|
### Total number of fallbacks to original DWARF
|
|
|
|
With the `eh_elf` context,
|
|
|
|
```bash
|
|
UNW_DEBUG_LEVEL=5 perf report 2>&1 >/dev/null | grep -c "step:.* falling back"
|
|
```
|
|
|
|
### Total number of fallbacks to original DWARF that actually used DWARF
|
|
|
|
With the `eh_elf` context,
|
|
|
|
```bash
|
|
UNW_DEBUG_LEVEL=5 perf report 2>&1 >/dev/null | grep -c "step:.* fallback with"
|
|
```
|
|
|
|
### Get succeeded fallback locations
|
|
|
|
```bash
|
|
UNW_DEBUG_LEVEL=5 perf report 2>&1 >/dev/null \
|
|
| grep "step: .* fallback with" -B 15 \
|
|
| grep "In memory map" | sort | uniq -c
|
|
```
|