Профилирование Java - Насколько надежный значения, которые оно дает?

Я работаю над простой текстовой Библиотекой Java разметки, которая должна быть, среди других требований, быстро.

С этой целью я сделал некоторое профилирование, но результаты дают мне худшие числа, которые затем измеряются при выполнении в режиме непрофиля.

Таким образом, мой вопрос - насколько надежный профилирование? Это дает просто информационное отношение времени, проведенного в методах? Это принимает JIT-компилятор во внимание, или профильный режим только интерпретируется? Я использую Профилировщика NetBeans и Sun JDK 1.6.

Спасибо.

7
задан Paul Sasik 17 January 2010 в 15:24
поделиться

6 ответов

При запуске профилирования вы всегда будете нести наказание на производительность, поскольку что-то должно измерить время начала / останова методов, отслеживать объекты кучи (для профилирования памяти), Так что есть над головой управления.

Однако он даст вам четкие указатели, чтобы узнать, где есть узкие места. Я склонен искать методы, где наиболее совокупное время потрачено и проверьте, могут ли быть оптимизации. Также полезно определить, называются ли методы без необходимости.

С методами, которые очень маленькие, примите результаты профиля с щепоткой соли, иногда процесс измерения может занять больше времени, чем сам способ вызова метода и перекоснуть результаты (может показаться, что небольшой, часто называемый метод имеет больше воздействия на производительность).

Надеюсь, что поможет.

5
ответ дан 6 December 2019 в 19:36
поделиться

Из-за приборостроения профилированный код в среднем будет работать медленнее, чем нефилированный код. Скорость измерения не целью профилирования, однако.

Профилирующий выпуск указывает на узкие места, места, которые темы проводят больше времени, код, который ведет себя хуже, чем ожидалось, или возможная утечка памяти.

Вы можете использовать эти намеки на улучшение указанных методов и профиля снова, пока вы не будете довольны результатами.

Профилировщик не будет решением стиля кодирования, которое X% медленнее, чем оптимальны, однако, вам все равно нужно проводить время, чтобы настроить эти части вашего кода, которые используются чаще, чем другие.

2
ответ дан 6 December 2019 в 19:36
поделиться

Я не удивлен тем фактом, что вы получаете худшие результаты при профилировании вашего приложения в качестве инструментального кода Java, как правило, всегда замедляет его выполнение. Это на самом деле хорошо захвачено страницей Википедии на Profific , которая упоминает, что прибороразборки могут вызывать изменения в выполнении программы, потенциально вызывающих неточные неточные результаты и Heisenbugs (из-за Эффект наблюдателя : наблюдатели влияют на то, что они наблюдают, простым актом наблюдают в себе ).

Наличие того, если вы хотите измерить скорость, я думаю, что вы не используете правильный инструмент. Профилировщики используются для поиска узких мест в приложении (и для этого, вы не заботитесь об общем воздействии). Но если вы хотите позорить свою библиотеку, вы должны использовать инструмент тестирования производительности (например, что-то вроде Jmeter ), который сможет дать вам среднее время выполнения за вызов. Вы получите гораздо лучшие и надежные результаты с правильным инструментом.

2
ответ дан 6 December 2019 в 19:36
поделиться

Профилирование не должно влиять на jit Compiler. Код, вставленный в профиль вашего приложения, однако, немного замедляет методы довольно много.
Profillers работают над серыми разными моделями, либо они вставляют код, чтобы увидеть, как долго и как часто используются методы, либо они принимают только образцы, повторно опрос, какой код в данный момент выполняется.
Первый замедляет ваш код довольно немного, а второй не на 100% точный, так как он может пропустить некоторые вызовы методов.

2
ответ дан 6 December 2019 в 19:36
поделиться

Поскольку у вас нет контроля над DLL, вы должны предположить, что DLL ожидает фактического файла. Это, вероятно, в какой-то момент делает предположение, что именно поэтому названные трубы терпят неудачу на вас.

Самым простым решением является создание временного файла во временном каталоге, запись данных из EXE во временный файл, а затем удаление временного файла.

Есть ли причина, по которой вы встраиваете этот «псевдофайл» в конце EXE, а не просто распространяете его с помощью нашего приложения? Вы, очевидно, уже распространяете эту стороннюю DLL с вашим приложением, так что еще один файл не кажется, что это навредит вам?

Другой вопрос, будут ли эти данные меняться? То есть вы хотите записать обратно данные этого «псевдофайла» в ваш EXE? Не думаю, что это сработает. Стандартные пользователи могут не иметь доступа к EXE для записи, что, вероятно, приведет к появлению антивирусных орехов.

И никакие CreateFileMapping и GetMappedFileName определенно не будут работать, так как они не дают вам имя файла, которое можно передать CreateFile. Если бы вы могли как-то получить эту DLL принять HANDLE, то это бы сработало.

И я бы даже не стал беспокоиться о перехвате API. Просто передайте DLL путь к действительному файлу.

-121--2470125-

Я не думаю, что вы найдете тонну поддержки для этого, о чем свидетельствует отсутствие активности по вашему вопросу. Средство администрирования веб-сайтов было удалено из CodePlex примерно в апреле 2009 года из-за бездействия ( Правила CodePlex гласят: Это должен быть текущий проект (без «заброшенных» проектов) ) и его использование/принятие действительно Многие проекты, которые использовали его как компонент, только что написали свои собственные после этого.

Было несколько альтернатив, которые появились в сообществе после того, как оно пропало:

Я думаю, что использование кода одного из этих двух проектов приблизится к тому, после чего вы будете доступны. Она не идеальна и потребует некоторой работы, чтобы работать с нужными бэкендами (оба из них используют бэкэнд SQL Server). Я знаю, что этот ответ отстой, но иногда это ответ. Я надеюсь, что кто-то придет и докажет, что я ошибаюсь, и что то, что вы хотите, есть там, или, по крайней мере, может предоставить исходный код WSAT, как это было в последний раз на codeplex... это будет огромным началом в том, чтобы заставить его работать.

Если вы имеете в виду другой WSAT, пожалуйста, прокомментируйте и исправьте меня.... это такой общий термин на самом деле, но это был на сегодняшний день самый популярный, поэтому я основывал этот ответ на этом.

-121--3702332-

Я обнаружил, что получаю разные результаты в зависимости от того, какой профилировщик я использую. Однако результаты часто являются достоверными, но с другой точки зрения на проблему. Что-то, что я часто делаю при профилировании загрузки ЦП, - это разрешает профилирование распределения памяти. Это часто дает мне разные результаты ЦП (из-за увеличения накладных расходов, вызванных профилированием памяти)и может дать мне несколько полезных мест для оптимизации.

1
ответ дан 6 December 2019 в 19:36
поделиться

Профилированный код обязан запустить медленнее, как указано в большинстве предыдущих комментариев. Я бы сказал, используйте профилирование для измерения только относительной производительности различных частей вашего кода (говорят методы). Не используйте меры из профилировщика в качестве индикатора того, как код будет выполняться в целом (если вы не хотите, чтобы в худшем случае, в этом случае то, что вы, были бы переоцененным значением.)

1
ответ дан 6 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: