aboutsummaryrefslogtreecommitdiffstats
path: root/lib/stdlib/src/io_lib_format.erl
diff options
context:
space:
mode:
authorJosé Valim <[email protected]>2016-07-16 22:24:50 +0200
committerJosé Valim <[email protected]>2016-08-04 13:22:14 +0200
commita5fcd4f26969a768950dc643eeed2fdb41a5dc41 (patch)
treec20bcd4a5dfeea6ccdc6a05ebd0eeaaeb0854a4d /lib/stdlib/src/io_lib_format.erl
parentddfae156c2b21d5266bd6eb82bf9ca7c508226fd (diff)
downloadotp-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/stdlib/src/io_lib_format.erl')
0 files changed, 0 insertions, 0 deletions