Различие между перемещением вперед Итератора с для оператора и некоторое время оператором

Опыт анекдотичен, поэтому возьмите его с крошкой соли.

Мы A / B проверили позиции GTM на главном (> 17 млн. Сессий / месяц) веб-сайте и не обнаружили реальной разницы в результатах между позиционированием его в верхнем или нижнем колонтитуле, что оказалось неожиданным, поскольку мы ожидали потеря данных (вот почему Google предлагает поставить код как можно выше).

Перемещение GTM не влияло на общее время загрузки (так как количество загруженных ресурсов было одинаковым), но оно ускоряло время, прежде чем пользователи могли взаимодействовать со страницей.

Перемещение GTM помогло нам сохранить несколько событий; были некоторые данные, которые мы должны были взять из существующей разметки или переменных на странице. До того, как нам нужно было отправить событие в DOM ready, после перемещения мы могли отправить те же данные, что и пользовательские измерения, с просмотром страницы (однако это обходной путь, но в идеале все необходимые данные должны быть помещены в слой данных).

Это не означает, что я думаю, что GTM может быть безопасно размещен внизу страницы во всех случаях; Я предполагаю, что чем больше материалов вы загружаете на свою страницу, тем больше вероятность того, что пользователь отменит загрузку перед выполнением GTM. Но это означает, что я не думаю, что абсолютный запрет на использование кода в нижнем колонтитуле имеет смысл, единственный способ узнать наверняка - проверить оба.

14
задан 6 revs, 5 users 49% 21 September 2017 в 22:26
поделиться

5 ответов

Правильный синтаксис для для цикла:

for (Iterator it = ...; it.hasNext(); ){
    //...
}

(Предыдущее объявление в Вашем коде является лишним, а также дополнительная точка с запятой в для заголовка цикла.)

, Используете ли Вы этот синтаксис или while, цикл является вопросом вкуса, оба переводят в точно то же. Универсальный синтаксис для цикла:

for (<init stmt>; <loop cond>; <iterate stmt>) { <body>; }

, который эквивалентен:

<init stmt>;
while (<loop cond>) { <body>; <iterate stmt>; }

Редактирование: На самом деле, вышеупомянутые две формы не совсем эквивалентны, , если (как в вопросе) переменная объявляется с init оператором. В этом случае будет различие в пределах переменной итератора. С для цикла, объем ограничен самим циклом, в случае цикла с условием продолжения, однако, объем расширяется в конец блока включения (никакое большое удивление, так как объявление вне цикла).

кроме того, как другие указали в более новых версиях Java, существует краткая нотация для для цикла:

for (Iterator<Foo> it = myIterable.iterator(); it.hasNext(); ) {
    Foo foo = it.next();
    //...
}

может быть записан как:

for (Foo foo : myIterable) {
    //...
}

С этой формой, Вы, конечно, теряете прямую ссылку итератору, который необходим, например, если Вы хотите удалить объекты из набора при итерации.

32
ответ дан 1 December 2019 в 06:05
поделиться

Это - просто вещь стиля, и как Вы я предпочитаю для цикла при использовании чего-то с индексом. При использовании Java 5, необходимо, конечно, использовать цикл foreach по набору так или иначе:

Collection<String> someCollection = someCollectionOfString();
for (String element : someCollection) {
....
}
9
ответ дан 1 December 2019 в 06:05
поделиться

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

, Когда Вы объявляете Iterator за пределами цикла, затем ссылка все еще допустима / живой после того, как цикл завершается. 99,99% времени, Вы не должны продолжать использовать Iterator, после того как цикл завершается, таким образом, такой стиль может привести к ошибкам как это:

//iterate over first collection
Iterator it1 = collection1.iterator();
while(it1.hasNext()) {
   //blah blah
}

//iterate over second collection
Iterator it2 = collection2.iterator();
while(it1.hasNext()) {
   //oops copy and paste error! it1 has no more elements at this point
}
9
ответ дан 1 December 2019 в 06:05
поделиться

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

существует на самом деле третий метод к этому, также. Вместо того, чтобы писать, например,

for (Iterator<SomeObject> it = foo.iterator(); it.hasNext();) {
  SomeObject so = foo.next();
}

можно чаще всего писать

for (SomeObject so: foo) {...}

Эти два, равные тому же самому...

4
ответ дан 1 December 2019 в 06:05
поделиться

Люди могут использовать явное ('старый стиль') для цикла просто, потому что это чувствует инструмент для очистки им, возможно, они еще не корректировались к новому синтаксису (который я лично думаю, является намного более чистым).

Одно фактическое определенное преимущество дольше для конструкции цикла состоит в том, что Вы имеете ссылку на итератор и так можете назвать методы на нем другим затем next(). В частности, hasNext() может часто быть полезно для вызова - воображают, хотите ли Вы распечатать список разделенных от запятой строк:

StringBuilder sb = new StringBuilder();
for (Iterator it=...; it.hasNext();){
   sb.append(it.next());
   if (it.hasNext())
      sb.append(", ");
}

Это только для различения, "это - последнее" случай как это при использовании более подробного для цикла.

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

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