Java классы: runtime vs. compile time

April 27th, 2009 Quick link: http://oe.lv/504

Во многих языках программирования есть возможность создать либо инстанцию класса, либо какой-то обьект и придать ему свойства класса. Разница в том, что обычно приготовленные (инициализированные инстанции) классы внедрены в код посредством их прямого обьявления (что называется compile-time, т.е. их размер в памяти рассчитывается во время компиляции), в то время как придание свойств обьекту является созданием класса в real-time.
Каковы же расходы процессорного времени для создания обоих случаев? Вот листинг небольшой тестилки на Java:

    public static void main(String[] args) throws Exception {
        long l1 = System.currentTimeMillis();
        System.out.println("l1 = " + l1);
        for (int i = 0; i < 50000; i++) {
            other.qqmber str = new qqmber();
            str.asdasser = "asddddddd";
            str.icog = "qqqqqqqq";
            str.len();
        }
        long l2 = System.currentTimeMillis();
        System.out.println("l2 = " + l2);
        for (int i = 0; i < 50000; i++) {
            Object str = Class.forName("other.qqmber").newInstance();
            Field f1 = str.getClass().getField("asdasser");
            f1.set(str, "asddddddd");
            Field f2 = str.getClass().getField("icog");
            f2.set(str, "qqqqqqqq");
            Method m = str.getClass().getMethod("len", new Class[0]);
            Object len = m.invoke(str);
        }
        long l3 = System.currentTimeMillis();
        System.out.println("l3 = " + l3);
        System.out.println("diff=" + (l2 - l1) + ", " + (l3 - l2));
    }

qqmber.java:

public class qqmber {
 
    public String asdasser;
    public String icog;
 
    public qqmber() {
    }
 
    public int len() {
        return asdasser.length() + icog.length();
    }
}

У меня дифф получился 16мс для компила и 375мс для рантайма. Вывод – хотите достигнуть похожих результатов, используйте всеобьемлюще-тормознутые языки типа PHP.

No comments yet.

TOP