Glen Mazza wrote:

Well, instanceof is slower I believe, but better
self-commenting.

[J.Pietschmann]


Instanceof is exactly as fast as a simple function call
after warm-up.

That is not what I remembered, so I made a small test program and ran it with 3 different versions of jdk:


[/d/fop] /c/java/jdk1.2.2/jre/bin/java.exe -cp . x
false method call 160
true method call 170
false instanceof 581
true instanceof 581

[/d/fop] /c/java/jdk1.3.1_03/jre/bin/java.exe -cp . x
false method call 16614
true method call 881
false instanceof 1162
true instanceof 2083

[/d/fop] /c/java/j2sdk1.4.2_02/bin/java.exe -cp . x
false method call 581
true method call 661
false instanceof 2153
true instanceof 2734

I really don't know what to conclude from this test, but at least I'm glad I didn't mentioned performance as the reason why I prefer the get<type> way of testing for subclasses.

I'm surprised of the slow performance of calling non-overridden methods in jdk1.3.1. I don't have any explanation for that.

regards,
finn



import java.io.*;
import java.net.*;


public class x { public static final int ITERS = 100000000;

    public static void main(String[] args) throws Exception {
        Prop prop = new Prop();
        Prop stringprop = new StringProp();

        // Warm up the JIT.
        testCall(prop);
        testInstanceOf(prop);

long now;

        now = System.currentTimeMillis();
        testCall(prop);
        System.out.println("false method call " +
                (System.currentTimeMillis() - now));

        now = System.currentTimeMillis();
        testCall(stringprop);
        System.out.println("true method call " +
                (System.currentTimeMillis() - now));

        now = System.currentTimeMillis();
        testInstanceOf(prop);
        System.out.println("false instanceof " +
                (System.currentTimeMillis() - now));

        now = System.currentTimeMillis();
        testInstanceOf(stringprop);
        System.out.println("true instanceof " +
                (System.currentTimeMillis() - now));


}


    public static void testInstanceOf(Prop prop) {
        for (int i = ITERS; i >= 0; i--) {
            boolean x = prop.getString() != null;
        }
    }

    public static void testCall(Prop prop) {
        for (int i = ITERS; i >= 0; i--) {
            boolean x = prop instanceof StringProp;
        }
    }

    public static class Prop {
        public String getString() {
            return null;
        }
    }

    public static class StringProp extends Prop{
        String value = "a string";
        public String getString() {
            return value;
        }
    }
}



Reply via email to