Время выполнения метода Java API - PullRequest
3 голосов
/ 18 июня 2010

Есть ли хороший ресурс для получения времени выполнения стандартных функций API? Это несколько сбивает с толку при попытке оптимизировать вашу программу. Я знаю, что Java не предназначена для того, чтобы быть особенно быстрой, но я не могу найти много информации об этом вообще.

Пример задачи: Если я ищу определенный токен в файле, то быстрее ли сканировать каждую строку, используя string.contains (...) или ввести, скажем, около 100 строк, помещая их в локальную строку, которую они выполняют в этом фрагменте.

Ответы [ 6 ]

5 голосов
/ 18 июня 2010

AFAIK, нет стандартных эталонов для методов API, и на самом деле, могут быть различные реализации, основанные на используемой JVM. Соедините это с JIT-оптимизацией JVM, сборками мусора и многими другими вещами, и я сомневаюсь, что вы могли бы получить глобально значимые числа. Самое большее, что вы можете сделать, это написать свои собственные тесты.

Некоторые методы определяют вычислительную сложность операций в своих JavaDocs. Некоторые другие методы описывают другие проблемы производительности. Убедитесь, что вы знаете о них и прислушаетесь к ним.

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

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

3 голосов
/ 18 июня 2010
1 голос
/ 18 июня 2010

, если мы пропустим время дискового ввода-вывода и просто учтем время ЦП, потраченное на ваш код, второй вариант будет намного медленнее первого.

1 голос
/ 18 июня 2010

Я согласен с идеями об использовании Profiler - но вы также можете рассмотреть возможность использования log4j (или ведения журнала Apache Commons и т. Д.) Для получения дешевой статистики о производительности программы - в том, что записи журнала в результирующих файлах журнала будут иметь временную метку с точностью до миллисекунды: поскольку в любом случае при отладке логирование обычно полезно, вероятно, стоит сначала это сделать.

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

1 голос
/ 18 июня 2010

Если я правильно понимаю ваш вопрос, вы спрашиваете, лучше ли прочитать строку откуда-нибудь или прочитать строку из памяти. Всегда будет быстрее загружать текст в память для сканирования, чем читать его из потока ввода-вывода, особенно с диска. Скорость чтения не имеет ничего общего с Java, но как быстро источник может передавать эти данные в вашу программу.

1 голос
/ 18 июня 2010

Нет документации, так как она будет значительно отличаться от машины к машине, от ОС к ОС. Чтобы получить точные сроки для вашей программы, используйте profiler . Профилировщик NetBeans хорош.

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

...