Проверка границ в Java

"Hotspot может удалить проверку границ в Java". Может ли кто-нибудь объяснить это, пожалуйста? Фактически я анализирую различия между С++ и Java. Это не домашнее задание и я анализирую свои собственные интересы.

Ответ 1

После поиска в Google "проверки границ точек доступа" появляется документ с заголовком "Исправление границ массива для компилятора клиента Java HotSpot ™" (как первый результат) и дает нам некоторое представление:

Аннотация:

Всякий раз, когда к элементу массива обращаются, Виртуальные машины Java выполняют сравните инструкцию, чтобы значение индекса находится в пределах действительного границы. Это уменьшает выполнение скорость Java-программ. Границы массива проверка исключений идентифицирует ситуации, в которых такие проверки избыточным и может быть удален. Мы представить проверку границ массива алгоритм исключения для Java HotSpot ™ VM на основе статического анализа в компиляторе "точно в момент времени".

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

Оценка показывает скорость, близкую к теоретический максимум для научный набор тестов SciMark (40% в среднем). Алгоритм также улучшает скорость выполнения для Набор тестов SPECjvm98 (2% на средний, максимум 12%).

Марк Майо объяснил это красиво.

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

Ответ 2

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

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

Из 2007 статья от Würthinger и др.: "Всякий раз, когда к элементу массива обращаются, виртуальные машины Java выполняют инструкцию сравнения, чтобы гарантировать, что Значение индекса находится в пределах допустимых границ, что уменьшает скорость выполнения Java-программ. Ограничение проверки границ массива определяет ситуации, в которых такие проверки являются избыточными и могут быть удалены. Мы представляем алгоритм исключения ограничений границ массива для Java HotSpot ™ VM на основе статический анализ в компиляторе" точно в момент времени".