Java классы: runtime vs. compile time
Во многих языках программирования есть возможность создать либо инстанцию класса, либо какой-то обьект и придать ему свойства класса. Разница в том, что обычно приготовленные (инициализированные инстанции) классы внедрены в код посредством их прямого обьявления (что называется 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.
