Как мне написать правильный микро-тест в Java?

при условии, что я понял правильно, вы должны искать binascii.unhexlify

import binascii
a='45222e'
s=binascii.unhexlify(a)
b=[ord(x) for x in s]
814
задан Hearen 23 March 2019 в 07:01
поделиться

6 ответов

Подсказки о записи микро сравнительных тестов от создателей Java HotSpot:

Правило 0: читает уважаемую газету на JVMs и микросравнительном тестировании. Хороший - Brian Goetz, 2005. Не ожидайте слишком много от микросравнительных тестов; они измеряют только ограниченный диапазон рабочих характеристик JVM.

Правило 1: Всегда включают фазу прогрева, которая выполняет Ваше тестовое ядро полностью через, достаточно для инициирования всех инициализаций и компиляций прежде, чем синхронизировать фазу (фазы). (Меньше повторений в порядке на фазе прогрева. Эмпирическое правило является несколькими десятками тысяч повторений внутреннего цикла.)

Правило 2: Всегда выполняемый с -XX:+PrintCompilation, -verbose:gc, и т.д., таким образом, можно проверить, что компилятор и другие части JVM не делают неожиданной работы во время фазы синхронизации.

Правило 2.1: Печать обменивается сообщениями вначале и конец фаз синхронизации и прогрева, таким образом, можно проверить, что нет никакого вывода от Правила 2 во время фазы синхронизации.

Правило 3: знать о различии между -client и -server, и OSR и регулярные компиляции. -XX:+PrintCompilation флаг сообщает, что компиляции OSR со знаком at-sign обозначают неначальную точку входа, например: Trouble$1::run @ 2 (41 bytes). Предпочтите сервер клиенту, и регулярный к OSR, если Вы после лучшей производительности.

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

Правило 5: знать о deoptimization и эффектах перекомпиляции. Не берите путь выполнения кода впервые в фазе синхронизации, потому что компилятор может выбросить и перекомпилировать код, на основе более раннего оптимистического предположения, что путь не был используемым вообще. Правило 2 является Вашим первым оборонительным рубежом против таких эффектов.

Правило 6: Использование соответствующие инструменты, чтобы прочитать мысли компилятора и ожидать быть удивленным кодом это производит. Осмотрите код сами перед формирующимися теориями о том, что делает что-то быстрее или медленнее.

Правило 7: Уменьшают шум в Ваших измерениях. Выполните свой сравнительный тест на тихой машине и несколько раз выполняйте его, отбрасывая выбросы. Используйте -Xbatch, чтобы сериализировать компилятор с приложением и полагать, что установка -XX:CICompilerCount=1 препятствует тому, чтобы компилятор работал параллельно с собой. Старайтесь изо всех сил уменьшать GC наверху, устанавливать Xmx (достаточно большой), равняется Xms, и используйте UseEpsilonGC , если это доступно.

Правило 8: Пользуются библиотекой для Вашего сравнительного теста, поскольку это, вероятно, более эффективно и было уже отлажено для этой единственной цели. Такой как [1 114] JMH, Кронциркуль или счет и Превосходные Сравнительные тесты UCSD Paul для Java.

749
ответ дан 12 revs, 12 users 61%Eugene Kuleshov 23 March 2019 в 17:01
поделиться
  • 1
    +1, потому что это работает в консоли. Таким образом, я могу записать свои сессии с ttyrec и совместно использовать их с byobu/screen. – matiu 24 June 2013 в 13:02

При попытке сравнить два алгоритма, сделайте по крайней мере два сравнительных теста для каждого, чередовав порядок. т.е.:

for(i=1..n)
  alg1();
for(i=1..n)
  alg2();
for(i=1..n)
  alg2();
for(i=1..n)
  alg1();

я нашел некоторые заметные различия (5-10% иногда) во времени выполнения того же алгоритма в различных передачах..

кроме того, удостоверьтесь, что n является очень большим, так, чтобы время выполнения каждого цикла было по крайней мере 10 секундами или около этого. Больше повторений, более значащие цифры в Ваше время сравнительного теста и более надежное, которое данные.

15
ответ дан Hearen 23 March 2019 в 17:01
поделиться
  • 1
    это - немного раздражающая необходимость повредить выполнение для отключения точки останова – frankster 31 July 2009 в 02:45

сравнительный тест должен измерить время/повторение или повторения/время, и почему?

Это зависит от , что Вы пытаетесь протестировать.

, Если Вы интересуетесь задержка , используйте время/повторение и если Вы интересуетесь пропускная способность , используйте повторения/время.

22
ответ дан Hearen 23 March 2019 в 17:01
поделиться
  • 1
    На самом деле можно определить gdb сессию в Eclipse w/o проект. Просто определите программу в " Настройки отладочного процесса..." диалоговое окно, возможно с помощью " C/C++ Application" выбор конфигурации. После заполнения " C/C++ Application:" запись, и возможно " Arguments" вкладка, нажмите на " Apply" и " Debug" кнопки для получения до проекции отладки. – ysap 17 September 2013 в 07:22

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

15
ответ дан Peter Štibraný 23 March 2019 в 17:01
поделиться
  • 1
    и если Вы хотите отсоединиться от процесса, кажется, что необходимо вызвать его путем загрузки различного файла – frankster 31 July 2009 в 03:58

Важные вещи для сравнительных тестов Java:

  • Нагревают JIT сначала путем выполнения кода несколько раз прежде, чем синхронизировать , он
  • Удостоверяется, что Вы выполняете его довольно долго, чтобы смочь измерить результаты в секундах или (лучших) десятках секунд
  • , В то время как Вы не можете звонить System.gc() между повторениями, это - хорошая идея выполнить его между тестами, так, чтобы каждый тест, надо надеяться, заставил "чистое" пространство памяти работать с. (Да, gc() больше подсказки, чем гарантия, но это очень вероятно , что она действительно соберет "мусор", по моему опыту.)
  • мне нравится отображать повторения и время и счет времени/повторения, которое может масштабироваться таким образом, что "лучший" алгоритм получает счет 1,0, и другие выиграны относительным способом. Это означает, что можно работать весь алгоритмы в течение длинноватого времени, варьируясь и количество повторений и время, но все еще получая сопоставимые результаты.

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

84
ответ дан Hearen 23 March 2019 в 17:01
поделиться
  • 1
    Я просто ввожу расположение - оно дает ошибку, но заканчивается с расположением, самым полезным для меня: D – frankster 24 September 2009 в 00:19

Существует много возможных ловушек для записи микросравнительных тестов в Java.

Сначала: необходимо вычислить со всеми видами событий, которые занимают время более или менее случайные: Сборка "мусора", кэшируя эффекты (ОС для файлов и ЦП для памяти), IO и т.д.

112-секундный: Вы не можете доверять точности измеренных времен для очень коротких интервалов.

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

Мои рекомендации: Сделайте свой контрольный прогон несколькими секундами, который более надежен, чем время выполнения по миллисекундам. Нагрейтесь JVM (означает выполнять сравнительный тест, по крайней мере, однажды без измерения, что JVM может выполнить оптимизацию). И выполненный Ваш сравнительный тест многократно (возможно, 5 раз) и берут среднее значение. Работайте каждый микросравнительный тест в новом экземпляре JVM (призовите к каждому сравнительному тесту новый Java), иначе, эффекты оптимизации JVM могут влиять позже на запускающие тесты. Не выполняйте вещи, которые не выполняются в фазе прогрева (поскольку это могло инициировать загрузку класса и перекомпиляцию).

13
ответ дан Mnementh 23 March 2019 в 17:01
поделиться
  • 1
    хотя, с другой стороны, на что-то вроде боли походит просматривать значения выражений, такие как " Массив [Индекс].Struct. Member" – frankster 31 July 2009 в 02:25
Другие вопросы по тегам:

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