[
https://issues.apache.org/jira/browse/JEXL-97?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12832418#action_12832418
]
Henri Biestro edited comment on JEXL-97 at 2/11/10 8:19 AM:
------------------------------------------------------------
I've been trying to reproduce this behavior on 2.x trunk with this code added
as a method in IssuesTest.java:
{code}
public void test97() throws Exception {
JexlContext ctxt = new MapContext();
for(char v = 'a'; v <= 'z'; ++v) {
ctxt.set(Character.toString(v), 10);
}
String input =
"(((((((((((((((((((((((((z+y)/x)*w)-v)*u)/t)-s)*r)/q)+p)-o)*n)-m)+l)*k)+j)/i)+h)*g)+f)/e)+d)-c)/b)+a)";
JexlEngine jexl = new JexlEngine();
Expression script;
// Make sure everything is loaded...
long start = System.nanoTime();
script = jexl.createExpression(input);
Object value = script.evaluate(ctxt);
assertEquals(Integer.valueOf(11), value);
long end = System.nanoTime();
System.out.printf("Parse took %.3f seconds\n", (end-start)/1e+9);
}
{code}
Runs in .003s on my box (os x, 2.8Ghz, jdk1.5 and jdk1.6).
Checked original code in 2.0 using jexl-compat lib and the performance is the
same (aka normal).
I've been able to reproduce it with JEXL 1; it seems to be fixed in 2.0.
was (Author: henrib):
I've been trying to reproduce this behavior on 2.x trunk with this code
added as a method in IssuesTest.java:
{code}
public void test97() throws Exception {
JexlContext ctxt = new MapContext();
for(char v = 'a'; v <= 'z'; ++v) {
ctxt.set(Character.toString(v), 10);
}
String input =
"(((((((((((((((((((((((((z+y)/x)*w)-v)*u)/t)-s)*r)/q)+p)-o)*n)-m)+l)*k)+j)/i)+h)*g)+f)/e)+d)-c)/b)+a)";
JexlEngine jexl = new JexlEngine();
Expression script;
// Make sure everything is loaded...
long start = System.nanoTime();
script = jexl.createExpression(input);
Object value = script.evaluate(ctxt);
assertEquals(Integer.valueOf(11), value);
long end = System.nanoTime();
System.out.printf("Parse took %.3f seconds\n", (end-start)/1e+9);
}
{code}
Runs in .003s on my box (os x, 2.8Ghz, jdk1.5 and jdk1.6).
Can you check again and/or upload a modified test that exhibits the performance
issue you describe?
The code you originally posted can only run on JEXL1.x (ExpressionFactory does
not exist in jexl2).
Thanks
> JEXL parses long expressions with lots of parenthesis slowly
> ------------------------------------------------------------
>
> Key: JEXL-97
> URL: https://issues.apache.org/jira/browse/JEXL-97
> Project: Commons JEXL
> Issue Type: Bug
> Affects Versions: 2.0, 1.1, 1.0
> Environment: Java
> Reporter: Jeff Ichnowski
> Priority: Minor
> Attachments: proposed.patch
>
>
> JEXL's parser uses an unbounded JavaCC LOOKAHEAD to distinguish assignment
> expressions from other expressions. The result is certain expressions take
> exponential time to parse. The example snippet below demonstrates the
> problem. On my machine parsing the expression below takes ~120 seconds.
> Changing the parser to remove the LOOKAHEAD can get this to parse in
> milliseconds. The lookahead appears to be in all versions of the parser
> source.
> import org.apache.commons.jexl.Expression;
> import org.apache.commons.jexl.ExpressionFactory;
> public class SlowParse {
> public static void main(String[] args) throws Exception {
> String input =
>
> "(((((((((((((((((((((((((z+y)/x)*w)-v)*u)/t)-s)*r)/q)+p)-o)*n)-m)+l)*k)+j)/i)+h)*g)+f)/e)+d)-c)/b)+a)";
> // Make sure everything is loaded...
> Expression expr = ExpressionFactory.createExpression(input);
> long start = System.nanoTime();
> expr = ExpressionFactory.createExpression(input);
> long end = System.nanoTime();
> System.out.printf("Parse took %.1f seconds\n", (end-start)/1e+9);
> }
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.