Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are arithmetic operations on literals calculated at compile time or run time?

Tags:

java

I have the following:

double timeInMinutes = (double) timeInMilliseconds / (1000 * 60); 

Is the operation (1000 * 60) done at compile time or at run time? In other words, are there performance differences during run time between the code snippet above and:

double timeInMinutes = (double) timeInMilliseconds / 60000; 

EDIT: my question is different from Will the Java compiler precalculate sums of literals?, as I'm mixing the use of variables and literals in the arithmetic operations. It's a small difference, but as @TagirValeev noted in the comments (Are arithmetic operations on literals calculated at compile time or run time?), there are instances where some literals aren't pre-compiled even though they could be.

like image 345
neverendingqs Avatar asked Oct 09 '15 14:10

neverendingqs


People also ask

What is checked at compile time?

Compile-time checking occurs during the compile time. Compile time errors are error occurred due to typing mistake, if we do not follow the proper syntax and semantics of any programming language then compile time errors are thrown by the compiler.


1 Answers

As per JLS §15.2 - Forms of Expressions

Some expressions have a value that can be determined at compile time. These are constant expressions (§15.28).

Multiplicative operators like *, /, and % falls under constant expressions, so it would be determined at compile time.

@SergeyMorozov was faster than me to write and get byte code proof (#2 = Integer 60000) but here is the practical proof and above is theoretical/official statement:

Try generating byte code at your end as well using 1000 * 60 and 60000, and you will see same byte code instructions, and hence there would be same runtime performance.

Java class:

public class Test {     public static void main(String[] args) {         int compileTest = 1000 * 60;     } } 

Byte code:

Classfile /E:/Test.class   Last modified Oct 9, 2015; size 265 bytes   MD5 checksum fd115be769ec6ef7995e4c84f7597d67   Compiled from "Test.java" public class Test   SourceFile: "Test.java"   minor version: 0   major version: 51   flags: ACC_PUBLIC, ACC_SUPER Constant pool:    #1 = Methodref          #4.#13         //  java/lang/Object."<init>":()V    #2 = Integer            60000    #3 = Class              #14            //  Test    #4 = Class              #15            //  java/lang/Object    #5 = Utf8               <init>    #6 = Utf8               ()V    #7 = Utf8               Code    #8 = Utf8               LineNumberTable    #9 = Utf8               main   #10 = Utf8               ([Ljava/lang/String;)V   #11 = Utf8               SourceFile   #12 = Utf8               Test.java   #13 = NameAndType        #5:#6          //  "<init>":()V   #14 = Utf8               Test   #15 = Utf8               java/lang/Object {   public Test();     flags: ACC_PUBLIC     Code:       stack=1, locals=1, args_size=1          0: aload_0          1: invokespecial #1                  // Method java/lang/Object."<init>":()V          4: return       LineNumberTable:         line 1: 0    public static void main(java.lang.String[]);     flags: ACC_PUBLIC, ACC_STATIC     Code:       stack=1, locals=2, args_size=1          0: ldc           #2                  // int 60000          2: istore_1          3: return       LineNumberTable:         line 3: 0         line 4: 3 } 
like image 98
hagrawal Avatar answered Oct 14 '22 00:10

hagrawal