You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Henri Biestro (JIRA)" <ji...@apache.org> on 2010/02/11 09:20:28 UTC

[jira] Issue Comment Edited: (JEXL-97) JEXL parses long expressions with lots of parenthesis slowly

    [ 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.