К сожалению, я отталкиваюсь от смутных воспоминаний о том, как работает JIT-компилятор, и не могу найти соответствующую документацию. Лучшее, что мне удалось найти, это краткое описание процесса оптимизации от IBM.
Прежде чем я привыкну к реализации тестов на основе утверждений, я хотел знать, существуют ли — это лучшие практики, позволяющие минимизировать их влияние на производительность. Мне бы не хотелось проводить кучу тестов только для того, чтобы обнаружить, что их совокупный эффект существенно снижает производительность, даже если по отдельности их влияние незначительно.
Может ли кто-нибудь из вас скажите мне, будут ли следующие строки снижать производительность производственной сборки (с отключенным «assert», как по умолчанию)?
Код: Выделить всё
for (T obj : Collection){
assert obj.someProperty();
}
Код: Выделить всё
TreeMap map = new TreeMap();
int i = 0;
for (T obj : Collection){
map.put(i,obj);
assert obj.someProperty();
i++;
}
// assert something about map, then never use it again
Заранее спасибо!
Соответствующие выдержки из документации Oracle по оператору «assert»:
Здесь обсуждается, как удалить утверждения из файла класса, что меня не совсем беспокоит.
Удаление всех следов утверждений от файлов классов Программисты
, разрабатывающие приложения для устройств с ограниченными ресурсами, могут захотеть
полностью исключить утверждения из файлов классов. Хотя это делает невозможным
включение утверждений в поле, это также уменьшает размер файла класса
, что, возможно, приводит к повышению производительности загрузки классов. При
отсутствии высококачественного JIT это может привести к уменьшению
занимаемой площади и повышению производительности во время выполнения.
Средство утверждения не обеспечивает прямой поддержки для удаления
утверждений из файлов классов. Однако оператор Assert может
использоваться в сочетании с идиомой «условной компиляции», описанной
в Спецификации языка Java, позволяя компилятору удалять
все следы этих утверждений из класса. файлы, которые он генерирует:
static Final boolean Asserts = ... ; // false для устранения утверждений
if (asserts) Assert ;
и из раздела часто задаваемых вопросов:
Почему бы не предоставить флаг компилятора для полного исключения утверждений
из объектных файлов? Это твердое требование, чтобы можно было
включить утверждения в поле для повышения удобства обслуживания. Можно было бы также разрешить разработчикам исключать утверждения
из объектных файлов во время компиляции. Утверждения могут содержать побочные
эффекты, хотя они не должны этого делать, и поэтому такой флаг может существенно изменить
поведение программы. Считается хорошим
то, что с каждой допустимой программой Java
связана только одна семантика. Кроме того, мы хотим побудить пользователей оставлять утверждения в объектных
файлах, чтобы их можно было включить в поле. Наконец, спецификация требует
, чтобы утверждения вели себя так, как будто они включены, когда класс запускается до его
инициализации. Было бы невозможно предложить такую семантику, если бы
утверждения были удалены из файла класса. Однако обратите внимание, что
стандартная «идиома условной компиляции», описанная в спецификации языка Java
, может использоваться для достижения этого эффекта для
разработчиков, которые действительно этого хотят.
Подробнее здесь: https://stackoverflow.com/questions/209 ... -productio