Hi there,

ELParser has a field named jj_ls of type LookaheadSuccess which extends Error. It is created during each instantiation of an ELParser object. Creating an Error is quite slow, because e.g. it calls java.lang.Throwable.fillInStack() during init.

This jj_ls is only used once in jj_scan_token() where it is thrown in case of certain condition, see line 2985:

2968 private boolean jj_scan_token(int kind) {
2969 if (jj_scanpos == jj_lastpos) {
2970 jj_la--;
2971 if (jj_scanpos.next == null) {
2972 jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
2973 } else {
2974 jj_lastpos = jj_scanpos = jj_scanpos.next;
2975 }
2976 } else {
2977 jj_scanpos = jj_scanpos.next;
2978 }
2979 if (jj_rescan) {
2980 int i = 0; Token tok = token;
2981 while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
2982 if (tok != null) jj_add_error_token(kind, i);
2983 }
2984 if (jj_scanpos.kind != kind) return true;
2985 if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
2986 return false;
2987 }

This is generated code and it is the only place were jj_ls is being used.

I noticed this situation because I'm doing a performance analysis of an application. I wonder whether creating this jj_ls for each new ELParser instance in advance is the right thing to do. One could also put the burden on the usage side, e.g. generating it when it is needed to be thrown. Unfortunately I don't know enough about the typical runtime details of ELParser. E.g. it might be that typically only few instances of it are created because they get reused (which doesn't seem to be the case, we only create and use it method local in createNodeInternal.createNodeInternal()) or their results get cached (which seems to be the case).

I'll have a look at how effective the caching is for the application in question, but I'd be interested if there is an opinion whether the pattern to create the Error object eagerly when creating the ELParser object seems appropriate. No idea currently, how one would change it though, because it is generated code.

Regards,

Rainer

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to