Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А нельзя ли прочитать внимательно, что я написал, прежде чем второй раз вольные фантазии городить ? Вот здесь, в конце. PD>http://www.rsdn.ru/forum/message/2723755.1.aspx
Очень внимательно прочитал и ждал описания конкретики тестов (см. ниже).
PD>На всякий случай повторяю
[skipped]
Вас там ниже Cyberax спросил, как именно вы запускаете тесты: пачка из N-тестов должна запускать в рамках одной виртуальной машины, а не каждый тест отдельно. Динамическая компиляция итеративный процесс выполняемый JIT-ом, который накапливает и использует для оптимизации информацию о вашей программе. Ждал с нетерпением ответа на тот вопрос, но увы, его не последовало.
Да и вообще, прочитав статьи Гетца, ссылки на которые давал вам выше, про тестирование производительности на управляемых платформах, начинаешь очень иронично относиться к любым таким попыткам... тем более людей, имеющих только опыт программирования на языках статической компиляции.
PD>P.S. Вообще, если тебя раздражают мои вопросы — можно и не отвечать вообще. Я не флейма ради эту дискуссию затеял, мне реальный ответ нужен.
Меня вовсе не раздражает, а несколько забавляет, как вам множество раз говорят одно и тоже, а вы упорно это игнорируете.
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, Andrei N.Sobchuck, Вы писали:
B>Ну, о чем собственно уважаемому Павлу Дворкину и твердят с начала топике. Что оптимизации GC через параметры будет гораздо эффективней всяких выдумок на уровне кода.
Уважаемый Павел Дворкин ничего против этого не имеет, но , насколько я понимаю, эта самая оптимизация коснется не только этой части (которая в конце концов есть только 1% от суммарного времени, если не меньше), но и всей системы в целом. И сейчас я просто не готов ни оценить все это, ни решить, насколько такое допустимо. А за совет спасибо.
Здравствуйте, rsn81, Вы писали:
R>Вас там ниже Cyberax спросил, как именно вы запускаете тесты: пачка из N-тестов должна запускать в рамках одной виртуальной машины, а не каждый тест отдельно.
>Динамическая компиляция итеративный процесс выполняемый JIT-ом, который накапливает и использует для оптимизации информацию о вашей программе. Ждал с нетерпением ответа на тот вопрос, но увы, его не последовало.
for (Integer test = 1; test <= 200; test++) {
file_name = "D:\\tester\\XMLData\\" + test.toString() ;
File in = new File(file_name);
test(in);
}
Достаточно на этот раз ясно или нет ?
R>Да и вообще, прочитав статьи Гетца, ссылки на которые давал вам выше, про тестирование производительности на управляемых платформах, начинаешь очень иронично относиться к любым таким попыткам... тем более людей, имеющих только опыт программирования на языках статической компиляции.
Ну если так, то ответь мне на вопрос, который я задал здесь. Предположение Cyberax о HotSpot, я полагаю, отметено, вот и ответь.
И еще одно я сделал. Нашел некий SAX piccolo (http://piccolo.sourceforge.net/), который, как там утверждается, быстрее Xerces. Попробовал его. В среднем быстрее, но на некоторых образцах раза в 3-4 медленнее, причем нестабильно : пропускаю тесты один раз — медленнее, еще раз — нормально. Из-за чего ? Я могу отнести это только на какие-то проблемы с выделением/освобождением памяти, поскольку все остальное без изменений.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Ну если так, то ответь мне на вопрос, который я задал здесь. Предположение Cyberax о HotSpot, я полагаю, отметено, вот и ответь.
А как со статистикой от GC?
Попробовал. В варианте собственно разбора (выдать список всех имен по механизму getNext()) работает примерно на 50% быстрее чем Xerces SAX с его callback. Любопытно и даже очень. Если это удастся прикрутить к иерархии классов без серьезных затрат времени, то будет просто замечательно. Большое спасибо.
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Ну если так, то ответь мне на вопрос, который я задал здесь. Предположение Cyberax о HotSpot, я полагаю, отметено, вот и ответь. C>А как со статистикой от GC?
Пока никак. Незнаком я с этим в Яве. Если можно, ткни куда смотреть.
C>Ну и наконец: используй профайлер.
То же самое. Вот в Visual C++ 6.0 я на нем собаку съел (а в VS 7 они его, паразиты, убрали).
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>>Ну если так, то ответь мне на вопрос, который я задал здесь. Предположение Cyberax о HotSpot, я полагаю, отметено, вот и ответь. C>>А как со статистикой от GC? PD>Пока никак. Незнаком я с этим в Яве. Если можно, ткни куда смотреть.
Самое простое: http://rsdn.ru/Forum/Default.aspx?mid=2724014&flat=0
C>>Ну и наконец: используй профайлер. PD>То же самое. Вот в Visual C++ 6.0 я на нем собаку съел (а в VS 7 они его, паразиты, убрали).
Bottleneck'и, в принципе, почти все профиляторы нормально могут. Мне больше всего пока вот этот нравится: http://www.yourkit.com/
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Уважаемый Павел Дворкин ничего против этого не имеет, но , насколько я понимаю, эта самая оптимизация коснется не только этой части (которая в конце концов есть только 1% от суммарного времени, если не меньше), но и всей системы в целом. И сейчас я просто не готов ни оценить все это, ни решить, насколько такое допустимо. А за совет спасибо.
Это кстати паршиво, выходит конкретно тюнить GC под твое решение смысла нет. Остается только профайлить.
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>>>Ну если так, то ответь мне на вопрос, который я задал здесь. Предположение Cyberax о HotSpot, я полагаю, отметено, вот и ответь. C>>>А как со статистикой от GC? PD>>Пока никак. Незнаком я с этим в Яве. Если можно, ткни куда смотреть. C>Самое простое: http://rsdn.ru/Forum/Default.aspx?mid=2724014&flat=0
Я тебе сегодня уже надоел со своими дилетантскими вопросами, но куда эти опции в Eclipse ставить и что с ними дальше делать ? Попробовал в VM settings — ничего не выдается вроде никуда
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Я тебе сегодня уже надоел со своими дилетантскими вопросами, но куда эти опции в Eclipse ставить и что с ними дальше делать ? Попробовал в VM settings — ничего не выдается вроде никуда
Зависит от используемой реализации JVM и её версии.
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Я тебе сегодня уже надоел со своими дилетантскими вопросами, но куда эти опции в Eclipse ставить и что с ними дальше делать ? Попробовал в VM settings — ничего не выдается вроде никуда
B>Зависит от используемой реализации JVM и её версии.
Вопрос снят. По крайней мере удалось в файл вывести
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Здравствуйте, Blazkowicz, Вы писали:
B>> тюнинг в создании объектов не более чем 0.1%
ANS>Зато тюнинг GC может дать на много больше. Для начала советую включить опции "-XX:+PrintGCDetails -XX:+PrintGCTimeStamps". Или можно включить "-XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime". Я не знаю какая норма отношения StoppedTime/ConcurrentTime, но если оно больше 5% то стопудово можно тюнить.
Попробовал "-XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime". Вот несколько строк
Application time: 0.0480905 seconds
0.106: [GC 511K->144K(1984K), 0.0035792 secs]
Total time for which application threads were stopped: 0.0038552 seconds
Application time: 0.0359529 seconds
0.145: [GC 656K->161K(1984K), 0.0019033 secs]
Total time for which application threads were stopped: 0.0021394 seconds
А вообще таких наборов строк штук 100. Почему, если не секрет ?
Соотношение , как видно, больше 5%, хоть и не сильно. Но оно примерно то же что у меня, что в примере от http://woodstox.codehaus.org/ я и его попробовал (со своим файлом).
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А вообще таких наборов строк штук 100. Почему, если не секрет ?
Это вполне нормально — собирается куча для новых объектов ("Эдем"). Она небольшая, поэтому сборка идет часто.
PD>Соотношение , как видно, больше 5%, хоть и не сильно. Но оно примерно то же что у меня, что в примере от http://woodstox.codehaus.org/ я и его попробовал (со своим файлом).
GC надо под конкретную задачу настраивать (на уже готовом приложении), причем микротесты часто ведут себя совсем по-другому, чем настоящее приложение.
Я бы лично пока дальше копал в направлении оптимизации работы с XML.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А вообще таких наборов строк штук 100. Почему, если не секрет ?
Молодое поколение (new gen) собирается часто.
Попробуй теперь с "-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution" и давай эту инфу сюда. На основании TenuringDistribution можно увеличить/уменьшить молодое поколение. Скажу сразу, правил я не знаю, всё эмпирическим путём
PD>Соотношение , как видно, больше 5%, хоть и не сильно. Но оно примерно то же что у меня, что в примере от http://woodstox.codehaus.org/ я и его попробовал (со своим файлом).
Если машина многоголовая, то можно включить параллельный коллектор "-XX:+UseParallelGC".
Здравствуйте, Blazkowicz, Вы писали:
PD>>которая в конце концов есть только 1% от суммарного времени, если не меньше B>Это кстати паршиво, выходит конкретно тюнить GC под твое решение смысла нет. Остается только профайлить.
Здравствуйте, Cyberax, Вы писали:
C>Я бы лично пока дальше копал в направлении оптимизации работы с XML.
Если выгода от оптимизации работы с XML 30%, а от оптимизации GC от силы 2%, то вывод очевиден. В принципе согласен — на микротестах тюнить GC смысла нет.
предположение По факту всё может быть веселее.
Если ты перечитаешь весь топик, то поймешь, что Павел разрабатывает решение в рамках большого работающего проекта. Работающего в той же JVM. Так вот тюнить каким-то образом GC под решение Павла смысла вообще нет. Так как в совокупности с остальной системой нужен будет совершенно новый анализ и совсем другие настройки.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Попробуй теперь с "-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution" и давай эту инфу сюда. На основании TenuringDistribution можно увеличить/уменьшить молодое поколение. Скажу сразу, правил я не знаю, всё эмпирическим путём
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>В общем, суть задачи предельно проста. Есть XML, заведомо валидный, проверка не требуется. Есть XSD, описывающий его схему, тоже валидный. Необходимо из XML создать экземпляр класса Java и обратно. И как можно быстрее.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>В общем, суть задачи предельно проста. Есть XML, заведомо валидный, проверка не требуется. Есть XSD, описывающий его схему, тоже валидный. Необходимо из XML создать экземпляр класса Java и обратно. И как можно быстрее.
А>Тебе ссылку http://javolution.org/api/javolution/xml/package-summary.html#package_description я зачем давал? Ты даже не удосужился попробовать.
А ты сам ее пробовал ? Если да, объясни, что я не так делаю.
По ссылке есть пример. В примере используются классы, которые не описаны, так что я его непосредственно пропустить не мог. Сделал по образцу простенький тест
package test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import javolution.xml.XMLBinding;
import javolution.xml.XMLFormat;
import javolution.xml.XMLObjectReader;
import javolution.xml.XMLObjectWriter;
import javolution.xml.XMLSerializable;
import javolution.xml.stream.XMLStreamException;
public class Graphic implements XMLSerializable {
static final long serialVersionUID = 1;
private String str;
public Graphic() {
str = "test";
}
// Default XML format with name associations (members identified by an unique name).
// See XMLFormat for examples of positional associations.
protected static final XMLFormat<Graphic> XML = new XMLFormat<Graphic>(Graphic.class) {
public void write(Graphic g, OutputElement xml) throws XMLStreamException {
xml.add(g.str, "str", String.class);
}
public void read(InputElement xml, Graphic g) throws XMLStreamException {
g.str = xml.get("str");
}
};
public static void main(String[] args) {
XMLBinding binding = new XMLBinding();
binding.setAlias(Graphic.class, "Graphic");
binding.setClassAttribute("type"); // Use "type" instead of "class" for class attribute.
// Writes the area to a file.
try {
Graphic g = new Graphic();
XMLObjectWriter writer = XMLObjectWriter.newInstance(new FileOutputStream("C:/area.xml"));
writer.setBinding(binding); // Optional.
writer.setIndentation("\t"); // Optional (use tabulation for indentation).
writer.write(g, "Graphic", Graphic.class);
writer.close();
// Reads the area back
XMLObjectReader reader = XMLObjectReader.newInstance(new FileInputStream("C:/area.xml"));
reader.setBinding(binding);
Graphic g1 = reader.read("Graphic", Graphic.class);
System.out.println(g1.str);
reader.close();
}
catch (XMLStreamException e) {
e.printStackTrace();
}
catch (FileNotFoundException e) {}
}
}
Писать — пишет, при чтении выдает
javolution.xml.stream.XMLStreamException: Cannot retrieve class (class attribute not found)
at javolution.xml.XMLBinding.readClassAttribute(Unknown Source)
at javolution.xml.XMLFormat$InputElement.get(Unknown Source)
at test.Graphic$1.read(Graphic.java:28)
at test.Graphic$1.read(Graphic.java:1)
at javolution.xml.XMLFormat$InputElement.get(Unknown Source)
at javolution.xml.XMLFormat$InputElement.get(Unknown Source)
at javolution.xml.XMLObjectReader.read(Unknown Source)
at test.Graphic.main(Graphic.java:48)