Does compilation remove "empty" methods?

16 views
Skip to first unread message

Gareth Murfin

unread,
Mar 20, 2019, 4:31:28 AM3/20/19
to CodenameOne Discussions
So I always make a method like this:

//for printing
    private static void _(String s)
    {
        if (Prefs.DEBUG)
        {
            com.codename1.io.Log.p(Prefs.ANSI_GREEN+"####StateMachine "+s);
        }
    }

then when it comes to release I set Prefs.DEBUG (which is final) to false, would this mean the method was stripped out during compilation? On both iOS/Android? Or not ? It's just that during dev I really need A LOT of print outs to follow my code, but then for release obviously I dont want any. In the old J2ME days I used to do a find and replace on all calls to _("hello"); etc before release, but im wondering if that's necessary anymore? 

I assume if its not stripped out during compilation then each call even if it really does nothing may add up (i do a lot in loops etc) to eventually slow certain things down (even by X many ms). But from what I understand modern java compilers would remove it since it really doesnt do anything if debug is false.

Steve Hannah

unread,
Mar 20, 2019, 7:50:41 AM3/20/19
to codenameone...@googlegroups.com
Build-time pruning does not make use of any runtime state for determining code paths.  Therefore changing the value of Prefs.DEBUG would have no effect.  

--
You received this message because you are subscribed to the Google Groups "CodenameOne Discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email to codenameone-discu...@googlegroups.com.
Visit this group at https://groups.google.com/group/codenameone-discussions.
To view this discussion on the web visit https://groups.google.com/d/msgid/codenameone-discussions/da3337af-e83e-4c7d-bdbf-487375537853%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


--
Steve Hannah
Software Developer
Codename One

Gareth Murfin

unread,
Mar 20, 2019, 10:24:01 AM3/20/19
to CodenameOne Discussions
Thanks for the answer. Oh shame, I thought proguard already did this a decade ago? I mean if the compiler is even slightly smart and a variable is declared final, then its not really runtime state I would have thought and therefore should be removed.  Would it be the same if you did something like:

if (1==1)
{
 _("hello");//this surely would be redundant code and removed?
 doSomeWork();//this surely would be redundant code and removed?
}

On Wednesday, March 20, 2019 at 7:50:41 PM UTC+8, Steve Hannah wrote:
Build-time pruning does not make use of any runtime state for determining code paths.  Therefore changing the value of Prefs.DEBUG would have no effect.  

On Wed, Mar 20, 2019 at 1:31 AM Gareth Murfin <gareth...@gmail.com> wrote:
So I always make a method like this:

//for printing
    private static void _(String s)
    {
        if (Prefs.DEBUG)
        {
            com.codename1.io.Log.p(Prefs.ANSI_GREEN+"####StateMachine "+s);
        }
    }

then when it comes to release I set Prefs.DEBUG (which is final) to false, would this mean the method was stripped out during compilation? On both iOS/Android? Or not ? It's just that during dev I really need A LOT of print outs to follow my code, but then for release obviously I dont want any. In the old J2ME days I used to do a find and replace on all calls to _("hello"); etc before release, but im wondering if that's necessary anymore? 

I assume if its not stripped out during compilation then each call even if it really does nothing may add up (i do a lot in loops etc) to eventually slow certain things down (even by X many ms). But from what I understand modern java compilers would remove it since it really doesnt do anything if debug is false.

--
You received this message because you are subscribed to the Google Groups "CodenameOne Discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email to codenameone-discussions+unsub...@googlegroups.com.

Gareth Murfin

unread,
Mar 20, 2019, 10:30:52 AM3/20/19
to CodenameOne Discussions
whoops i meant

if (1==2)
{
 _("hello");//this surely would be redundant code and removed?
 doSomeWork();//this surely would be redundant code and removed?
}

Shai Almog

unread,
Mar 21, 2019, 2:04:34 AM3/21/19
to CodenameOne Discussions
If it's public static final then javac could remove that call. But since it's copied you would need a clean build to get it working. public static final values are copied into the class so changing them and recompiling isn't enough.
Reply all
Reply to author
Forward
0 new messages