Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved speed of hex parsing in more places #227

Merged
merged 1 commit into from
Jun 24, 2022

Conversation

lamoreauxaj
Copy link
Contributor

@lamoreauxaj lamoreauxaj commented Jun 23, 2022

This addresses issue #93. Although #150 implemented fast hex string parsing, when I was magic-tracing magic-trace, I noticed this in the trace:
image

This section of the trace entirely occurs because of calling Int.Hex.of_string offset within parse_symbol_and_offset. And this tends to take around 200-250 ns. Since this occurs about once per line in the perf.data file, the trace I ran this on executed this around 1.8 million times which should save a few hundred ms (out of total time of a few seconds).

Here are the traces after and before this change (respectively) zoomed in on 3 decodes (which shows 3 executions of parse_symbol_and_offset) of a perf line containing an entry of the callstack sampled. The former is just below 2 us and the latter is around 2.6 us. However it is clear that most of the remaining time is now spent on evaluating regex in the former.

image
image

In regards to implementation, I extracted these functions out to a Util module and used them when possible else where in magic-trace (although only the offset calculation is expensive because it is called a lot, but it seems reasonable to use them if possible). I used first class modules to abstract around Int and Int64.

Copy link
Member

@Xyene Xyene left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch! Holding off on merging until you've rebased, but this looks good to me.

@lamoreauxaj lamoreauxaj force-pushed the use_fast_hex branch 2 times, most recently from 7a59d9d to b4532b1 Compare June 24, 2022 13:59
@Xyene Xyene marked this pull request as ready for review June 24, 2022 14:00
@lamoreauxaj lamoreauxaj force-pushed the use_fast_hex branch 2 times, most recently from d578b37 to 4dec2c3 Compare June 24, 2022 14:03
…f maps with int64_of_hex_string.

This addresses issue janestreet#93. Although janestreet#150 implemented fast hex string parsing,
when I was magic-tracing magic-trace, I noticed unexpected lengthy calls to
`Scanf` and related functions.

This occurs because of calling `Int.Hex.of_string offset` within
`parse_symbol_and_offset`. And this tends to take around 200-250 ns. Since this
occurs about once per line in the `perf.data` file, the trace I ran this on
executed this around 1.8 million times which should save a few hundred ms (out
of total time of a few seconds).

On traces after and before this change (respectively) of 3 decodes (which
contain 3 executions of `parse_symbol_and_offset`) of a perf line containing an
entry of the callstack sampled. The former is just below 2 us and the latter is
around 2.6 us. However it is clear that most of the remaining time is now spent
on evaluating regex in the former.

In regards to implementation, I extracted these functions out to a `Util` module
and used them when possible else where in magic-trace (although only the offset
calculation is expensive because it is called a lot, but it seems reasonable to
use them if possible). I used first class modules to abstract around `Int` and
`Int64`.

Signed-off-by: Aaron Lamoreaux <alamoreaux@janestreet.com>
@Xyene Xyene merged commit 3f3fee2 into janestreet:master Jun 24, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants