glsl: Avoid massive ralloc_strndup overhead in S-Expression parsing.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 15 Jul 2011 09:27:49 +0000 (02:27 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 20 Jul 2011 17:42:43 +0000 (10:42 -0700)
commit3875526926123259521514de9c8d675e3797275a
tree2919b6469aafb47cc70a1c16989deeb0dbaf8fa1
parent8d044047f133ad4e4c4f1f6b4a4a1c4a9fa477f5
glsl: Avoid massive ralloc_strndup overhead in S-Expression parsing.

When parsing S-Expressions, we need to store nul-terminated strings for
Symbol nodes.  Prior to this patch, we called ralloc_strndup each time
we constructed a new s_symbol.  It turns out that this is obscenely
expensive.

Instead, copy the whole buffer before parsing and overwrite it to
contain \0 bytes at the appropriate locations.  Since atoms are
separated by whitespace, (), or ;, we can safely overwrite the character
after a Symbol.  While much of the buffer may be unused, copying the
whole buffer is simple and guaranteed to provide enough space.

Prior to this, running piglit-run.py -t glsl tests/quick.tests with GLSL
1.30 enabled took just over 10 minutes on my machine.  Now it takes 5.

NOTE: This is a candidate for stable release branches (because it will
      make running comparison tests so much less irritating.)

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/s_expression.cpp
src/glsl/s_expression.h