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

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

10 голосов
/ 17 декабря 2010

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

Ответы [ 2 ]

5 голосов
/ 17 декабря 2010

После поиска в Google «проверки границ горячих точек», a Документ с заголовком «Устранение проверки границ массива для клиентского компилятора HotSpot ™» обнаруживается (как первый результат) и дает нам некоторое понимание:

Аннотация:

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

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

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

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

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

1 голос
/ 17 декабря 2010

Хорошо, он работает, постоянно анализируя производительность программы в поисках «горячих точек», которые могут часто или многократно выполняться, которые затем предназначены для оптимизации для высокопроизводительного выполнения с минимальными издержками, для менее критичных для производительности code.

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

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

...