diff options
author | José Valim <[email protected]> | 2016-07-16 22:24:50 +0200 |
---|---|---|
committer | José Valim <[email protected]> | 2016-08-04 13:22:14 +0200 |
commit | a5fcd4f26969a768950dc643eeed2fdb41a5dc41 (patch) | |
tree | c20bcd4a5dfeea6ccdc6a05ebd0eeaaeb0854a4d /lib/debugger/test | |
parent | ddfae156c2b21d5266bd6eb82bf9ca7c508226fd (diff) | |
download | otp-a5fcd4f26969a768950dc643eeed2fdb41a5dc41.tar.gz otp-a5fcd4f26969a768950dc643eeed2fdb41a5dc41.tar.bz2 otp-a5fcd4f26969a768950dc643eeed2fdb41a5dc41.zip |
Move expansion of strings in binaries to v3_core
This speeds up the compilation of binary literals
with string values in them. For example, compiling
a file with a ~340kB binary would yield the following
times by the compiler:
Compiling "foo"
parse_module : 0.130 s 5327.6 kB
transform_module : 0.000 s 5327.6 kB
lint_module : 0.011 s 5327.8 kB
expand_module : 0.508 s 71881.2 kB
v3_core : 0.463 s 11.5 kB
Notice the increase in memory and processing time
in expand_module and v3_core. This happened because
expand_module would expand the string in binaries
into chars. For example, the binary <<"foo">>, which
is represented as
{bin, 1, [
{bin_element, 1, {string, 1, "foo"}, default, default}
]}
would be converted to
{bin, 1, [
{bin_element, 1, {char, 1, $f}, default, default},
{bin_element, 1, {char, 1, $o}, default, default},
{bin_element, 1, {char, 1, $o}, default, default}
]}
However, v3_core would then traverse all of those
characters and convert it into an actual binary, as it
is a literal value.
This patch addresses this issue by moving the expansion
of string into chars to v3_core and only if a literal
value cannot not be built. This reduces the compilation
time of the file mentioned above to the values below:
Compiling "bar"
parse_module : 0.134 s 5327.6 kB
transform_module : 0.000 s 5327.6 kB
lint_module : 0.005 s 5327.8 kB
expand_module : 0.000 s 5328.7 kB
v3_core : 0.013 s 11.2 kB
Diffstat (limited to 'lib/debugger/test')
-rw-r--r-- | lib/debugger/test/bs_bincomp_SUITE.erl | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/lib/debugger/test/bs_bincomp_SUITE.erl b/lib/debugger/test/bs_bincomp_SUITE.erl index 39e2240f2d..064e9567b3 100644 --- a/lib/debugger/test/bs_bincomp_SUITE.erl +++ b/lib/debugger/test/bs_bincomp_SUITE.erl @@ -66,6 +66,7 @@ end_per_group(_GroupName, Config) -> byte_aligned(Config) when is_list(Config) -> <<"abcdefg">> = << <<(X+32)>> || <<X>> <= <<"ABCDEFG">> >>, + <<"AxyzBxyzCxyz">> = << <<X, "xyz">> || <<X>> <= <<"ABC">> >>, <<1:32/little,2:32/little,3:32/little,4:32/little>> = << <<X:32/little>> || <<X:32>> <= <<1:32,2:32,3:32,4:32>> >>, <<1:32/little,2:32/little,3:32/little,4:32/little>> = |