Время выполнения метода Java API

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

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

6 ответов

Решение

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

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

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

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

Вы ищете профилировщик

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

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

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

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

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

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

Другие вопросы по тегам