Оптимизация

4,167
68
693
Народ, давно мучает один вопрос:
Есть ли разница в следующих кодах с точки зрения простоты просчёта?

Код:
if ("Простое условие" && "Сложное условие")
{
  Действие
}
или
Код:
if ("Простое условие")
{
  if ("Сложное условие")
  {
    Действие
  }
}
 
Нет. Компилятор не дурак и оптимизирует такие структуры.
А за второй вариант в приличном обществе бьют мокрыми палками.
ЗЫ. Когда в первом больше 3-4 условий, тоже бьют.
 
Народ, подскажите плиз, какое преимущество есть у обычного массива перед ArrayList в отношении скорости и выделенной памяти в случае если у меня неизвестна общая длина массива, но известна его максимальная длина.
Я так понимаю, что при инициализации обычного массива, сразу выделяется нужный объём памяти. Но, в моём случае, объём может быть излишним, если длина будет меньше максимальной... С ArrayList-ом память выделяется динамически (я прав?). Не влияет ли это на производительность? С другой стороны, ArrayList как-то удобнее.

Если все-таки обычный массив лучше, как мне потом выцепить из него нужные непустые значения? Ну, кроме циклического перебора значений... Ведь в таким случае всё равно придётся создавать новый прореженный массив, и вся оптимизация сойдёт на нет.

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

Посоветуйте решение )
 
Если нужно добавление элементов, то естественно юзай лист и не парься. Только вот нужно подумать какой лист. ArrayList: сложность получения конкретного элемента O(1), сложность добавления нового элемента O(n).
LinkedList: сложность получения конкретного элемента O(n), сложность добавления нового элемента O(1).
Стоит выбрать тот, который более подходит для твоей цели.


И естественно, лучше сразу инициализировать. И если используешь ArrayList, то намного быстрее инициализировать его массивом, чем add'ом.
 
Спасибо за ответ )
Можешь конкретнее объяснить, что за О(1) и О(n) и в чём сложность?
А так же, как я уже писал выше, если я инициализирую массив в самом блоке, то не будет ли путаницы в апдейтах различных экземпляров этого блока?
Или мне инициализировать массив как таковой, а внутри апдейте всё равно создавать свою переменную равную этому массиву?
P.S. В течении апдейта массив должен заполнится, выполнить свои функции и очистится, чтобы заново заполниться уже в следующем блоке. Но может же такое быть, что несколько блоков обновляются одновременно (или не может)? Как в таком случае будет вести себя данный массив?


А... Всё, почитал про эти массивы. Кажется, понял. Мне подойдёт ArrayList.
Но про инициализацию вопрос открытый.
 
Блоки, как и итэмы - синглтонные объекты. Ты же создаешь только по одному экземпляру (перед регистрацией). Сами по себе новые не создаются. Поэтому один массив будет на все одинаковые блоки в мире. Не знаю, как сказать. Короче, логика такая же, как у итемов.
P.S. Если я правильно понял, что ты хочешь в целом, то мне кажется, что твоя идея не подойдет для этого.
 
Нет, программа же проходит по массиву блоков поочерёдно вызывая onUpdate. Если у тебя будет в конце onUpdate отчищенный лист, то проблем с пересечением не должно возникнуть.
 
Хочешь сказать, что одновременно обновляющихся блоков не может быть? Разве отдельные чанки не обновляются независимо? Генерируются они точно параллельно. Проверено на собственном опыте.
 
Для каких целей тебе нужен массив7
 
Народ, прошу совета. Возможно, кто-нибудь укажет верный путь.
В общем, беда следующая:
Есть у меня супернавороченный блок... Да-да, тот самый, с кучей массивов в обновлении. За один проход происходит обновление где-то 10-20 соседних блоков.
Так вот, когда их в мире не много, всё хорошо, а вот если их дофига, игра начинает слегка притормаживать.
При этом, это чисто визуальные задержки. Например, когда я плавно перемещаюсь в сторону, либо когда я резко поворачиваю камеру вбок, картинка на доли секунды задерживается... При этом ФПС показывает стабильно где-то 60-75 кадров, что меня и насторожило.
Задержки не глобальные, но выглядят не приятно... Хочу попробовать избавится от этого.
Кто-нибудь сталкивался с подобными лагами? Это всё-таки из-за обновления или, может быть, из-за рендера и количества вариантов блока (их где-то штук 50)? Так же, наблюдается достаточно долгое просчитывание света вблизи скопления этих блоков (они у меня ещё и прозрачные =)). То есть, ставлю факел, свет появляется не сразу. Возможно, причина в этом.

Код выкладывать не буду, ибо он достаточно объёмный. Но, может быть, кто-нибудь подскажет методику поиска причины лагов )
P.S. Сам пока буду пробовать постепенно отрубать части кода. Возможно, что-нибудь обнаружу.
Спасибо за участие )
 
>Это всё-таки из-за обновления или, может быть, из-за рендера
Открой меню F3 (Shift) там есть статистика использования ресурсов, сравни до того как ты разместил свои блоки и после.
P.s Кинь скриншот блока=) Интересно всё таки, конечно если не тайна.
 
Статистика - это ты про круговую диаграмму? Я не могу разобраться что так за что отвечает )))
Но я, вроде как, разобрался в причине... Хотя и не уверен.
Походу, это было из-за просчёта света... Блоки обновляются сразу кучей и свет каждый раз просчитывается по новому... От этого и лагало... Если делаю блоки прозрачными, то вроде и не лагает вовсе... Хотя, может быть, я просто привык уже... Там всё на уровне ощущений )
Попробовал добавить this.useNeighborBrightness = true;
Тормозить стало меньше.
P.S. Пока секрет, но скоро )
 
Поспрашиваю ещё умных людей на счёт оптимизации кода )))
На этот раз задумался над таким вот примером:
Какой из следующих вариантов лучше и выгоднее использовать?
Этот?
Код:
boolean check = false;
for (int x = -100; x <= 100; ++x) {
    for (int y = -100; y <= 100; ++y) {
      for (int z = -100; z <= 100; ++z) {
         if (!check && /*Очень сложное навороченное условие*/) {
            check = true;
         }
      }
   }
}
Или этот?
Код:
boolean check = false;
for (int x = -100; x <= 100; ++x) {
   for (int y = -100; y <= 100; ++y) {
      for (int z = -100; z <= 100; ++z) {
         check = /*Очень сложное навороченное условие*/;
         if (check) break;
      }
   if (check) break;
   }
if (check) break;
}

Да и вообще какое преимущество у break есть перед следующим вариантом?
Код:
for (int i = 0; i < 100; ++i) {
   if (/*Условие*/) {
      /*Делаем что-то...*/
      i = 100;
   }
}

Спасибо )
 
2 вариант конечно лучше.

А насчёт последнего вообще очевидно должно быть. Одно дело остановить цикл, а другое дело засетить и проверить переменную.
 
А чем второй вариант лучше? С точки зрения скорости выполнения
 
Назад
Сверху