tp: cut allocation and string work in the executor and CREATE TABLE (#7706) **Summary** Removes avoidable allocation and string work in code that runs whenever an operator retains rows, an `INTERVAL INTERSECTION` runs, or `CREATE PERFETTO TABLE` materializes a query. Each change is small; together they are 5-67% faster on the paths they touch. **Changes** **RowStore** - Reuses the chunks it copies borrowed columns into. It used to allocate a new chunk for every column of every batch and free them all on `Clear()`, which dominated operators run over and over on small inputs. A chunk is only reused once nothing else holds it. - Copies validity a word at a time (new `BitVector::FillBits`) instead of a bit at a time. **IntervalIntersect** - Groups lived in a `FlatHashMapV1`, whose minimum capacity of 1024 slots was walked and cleared on every rerun, and each group's intervals were freed each time. Groups are now reused across runs, held by pointer so their keys never move, and found through a `FlatHashMapV2` of `string_view`s. **Strings in `CREATE PERFETTO TABLE`** - The dataframe virtual table returned strings without their length, so SQLite ran `strlen` on every one. It now passes the length and marks them NUL-terminated (`SQLITE_UTF8_ZT`). - Strings read back from the string pool were hashed and interned again. A pointer into the pool is now mapped straight back to its id, checked against the size prefix before it and the terminator after it. This is done under the pool's lock, which is only taken when locking is enabled. **Benchmarks** Functions 64-byte aligned in both builds, so code placement does not skew results; best of 5. | Benchmark | Before | After | Ratio | |---|--:|--:|--:| | `BM_RowStore` (16 batches) | 216 µs | 92 µs | 0.43x | | `BM_RowStoreOneRow` | 201 ns | 66 ns | 0.33x | | `BM_IntervalIntersect` (100K rows) | 5.00 ms | 4.09 ms | 0.82x | | `BM_IntervalIntersectFourRows` | 3.27 µs | 0.50 µs | 0.15x | Real traces, query time: | Trace | `CREATE PERFETTO TABLE` copies of sched, thread_state, slice, counter, thread | `INTERVAL INTERSECTION` of sched and thread_state `PER utid`, 5 times | |---|--:|--:| | `wattson_syscore_suspend` | 122 → 111 ms (0.91x) | 117 → 116 ms (0.99x) | | `chrome_android_systrace` | 126 → 112 ms (0.89x) | 120 → 109 ms (0.91x) | | `example_android_trace_30s` | 77 → 74 ms (0.96x) | 230 → 222 ms (0.97x) | | `android_sched_and_ps` | 40 → 38 ms (0.95x) | 124 → 114 ms (0.92x) | Results are identical to before on all four traces. **Testing** New unit tests for `BitVector::FillBits` and for `RowStore` reusing chunks without overwriting ones still held. Unit and diff tests pass.
Perfetto is an open-source suite of SDKs, daemons and tools which use tracing to help developers understand the behaviour of complex systems and root-cause functional and performance issues on client and embedded systems.
It is a production-grade tool that is the default tracing system for the Android operating system and the Chromium browser.
Perfetto is not a single tool, but a collection of components that work together:
Perfetto was designed to be a versatile and powerful tracing system for a wide range of use cases.
ftrace, allowing you to visualize scheduling, syscalls, interrupts, and custom kernel tracepoints on a timeline.chrome://tracing. Use it to debug and root-cause issues in the browser, V8, and Blink.We‘ve designed our documentation to guide you to the right information as quickly as possible, whether you’re a newcomer to performance analysis or an experienced developer.
New to tracing? If you're unfamiliar with concepts like tracing and profiling, start here:
Ready to dive in? Our “Getting Started” guide is the main entry point for all users. It will help you find the right tutorials and documentation for your specific needs:
Want the full overview? For a comprehensive look at what Perfetto is, why it's useful, and who uses it, see our main documentation page:
For users interested in the Debian distribution of Perfetto, the official source of truth and packaging efforts are maintained at Debian Perfetto Salsa Repository
Have questions? Need help?
We follow Google's Open Source Community Guidelines.