[ 
https://issues.apache.org/jira/browse/JEXL-97?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12832418#action_12832418
 ] 

Henri Biestro commented on JEXL-97:
-----------------------------------

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.

Reply via email to