Groovy в течение времени выполнения цикла

Это может быть легко решено на раскадровке:

Выберите представление, которое добавляется как UIBarButtonItem Container & amp; установить его "Clip Subviews" & amp; Запустите приложение.

enter image description here

12
задан rest_day 28 May 2009 в 12:33
поделиться

3 ответа

Хорошо . Вот мое мнение о том, почему?

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

  1. ForInLoop использует Range. Итератор используется для продвижения во время каждого цикла. Сравнение (<) выполняется непосредственно с int (или Integer), чтобы определить, выполнено ли условие выхода
  2. ForLoop использует традиционное приращение, условие проверки и выполнение действия. Для проверки условия i <10000000 он использует Groovy's ScriptBytecodeAdapter .compareLessThan. Если вы углубитесь в код этого метода, вы обнаружите, что обе стороны сравнения принимаются как объект, и происходит так много вещей, приведения, сравнения их как объекта и т. Д. Опять же, поправьте меня, если я ошибаюсь или что-то упускаю ...

9
ответ дан 2 December 2019 в 21:45
поделиться

Во время тестирования обязательно «разогрейте» JVM перед тем, как принимать меры, иначе вы можете запустить различные действия при запуске на платформе (загрузка класса, JIT-компиляция). Также запускайте тесты много раз подряд. Кроме того, если вы выполнили второй тест во время сборки мусора, это могло иметь влияние. Попробуйте запустить каждый из ваших тестов 100 раз и распечатать время после каждого теста, и посмотрите, что это вам скажет.

2
ответ дан 2 December 2019 в 21:45
поделиться

Если вы можете устранить потенциальные артефакты во время запуска, как предлагает Джим, то я рискну предположить, что цикл for в стиле Java в Groovy не так хорошо реализован, как исходный стиль Groovy. для цикла. Он был добавлен только в версии 1.5 после запросов пользователей, поэтому, возможно, его реализация была немного запоздалой.

Вы смотрели байт-код, сгенерированный для ваших двух примеров, чтобы увидеть, есть ли какие-либо различия? Здесь было обсуждение производительности Groovy , в котором в одном из комментариев (от одного «johnchase») говорится следующее:

Интересно, связана ли разница, которую вы видели, с тем, как Groovy использует числа (примитивы) - поскольку он включает все примитивы в их эквивалентные классы-оболочки Java (int -> Integer), я полагаю, что это немного замедлит работу. Мне было бы интересно увидеть производительность кода Java, который выполняет 10 000 000 циклов с использованием классов-оболочек вместо целых чисел.

Так, может быть, исходный цикл Groovy for не страдает от этого? Хотя на самом деле это всего лишь предположение с моей стороны.

1
ответ дан 2 December 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: