A while back I did some experiments with JDK 8. The Java 8 compiler appears to 
be faster in general than Janino, if I remember correctly. (Not surprising: 
many people focus on optimizing the Java compiler, a smaller team maintains 
Janino...)


Another experiment was to do "plain Java" code generation and compile rather 
than the compile & byte-code merge we do now. The compilation was faster as was 
code execution. The main reason for the speed-up is that "plan Java" does fewer 
steps: it just compiles and loads. However, "traditional" Drill code generation 
compiles, does a byte code copy and merge and then loads. Some "templates" are 
rather large. By using "plain Java" subclassing, we need not copy the base 
class code as we do when doing the byte-code merge.


Also, because each generated class (with plain Java) uses the same base class 
code, the JVM can reuse its JIT optimizations; it does not have to rediscover 
them for each new generated class.


We've not had time to do full testing, so we conservatively stick with what we 
know works. Still,  preliminary testing did show that "plain Java" is both 
faster and more convenient. You can experiment with this option. Find the 
commented out line like the following in each operator (record batch):


      // Uncomment out this line to debug the generated code.

//    cg.saveCodeForDebugging(true);

Uncomment the line. You'll get debuggable plain Java code and compilation. The 
generated source code goes into /tmp/drill/codegen by default.

Or, if you want to try for performance, and avoid the step of writing code to 
disk, use the following instead:

    cg.preferPlainJava(true);

More details appears in [1].

Thanks,

- Paul

[1] 
https://github.com/paul-rogers/drill/wiki/Code-Generation-and-%22Short%2C-Fat%22-Queries
________________________________
From: Aman Sinha <amansi...@apache.org>
Sent: Sunday, July 30, 2017 9:16:09 AM
To: dev@drill.apache.org
Subject: Re: Which code compiler is better

Weijie,
what is the size (in KB) of your generated code for the aggregate operator
that is doing the 20 SUM/AVG ?  Also, what JDK version are you using ?

>From what I recall, Janino was faster than JDK 1.7  up to about 256 KB
source code file.  That's the current threshold in Drill; if the size is
greater than that, Drill automatically switches to JDK compiler.   Newer
JDK could potentially be faster, so we would need to do the comparison
again.   Perhaps you should file a JIRA with your observations.

There is also the complexity of the expressions.  For simple expressions,
my understanding is Janino is typically better.  Can you provide the query
pattern you used ?

On Sun, Jul 30, 2017 at 6:10 AM, weijie tong <tongweijie...@gmail.com>
wrote:

> The compile process is long when we have 20 sum or avg expression and the
> compiler is janino. But if we change the compiler to jdk,we gain lower
> compile process time. It seems jdk compiler is better .If that's tue,why
> not let jdk be the default one?
>

Reply via email to