Наиболее эффективный способ создания нескольких объектов с параметрами и передачи их в другие объекты для добавления в список - PullRequest
0 голосов
/ 16 октября 2019

Я создал список объектов, который очень медленный, и мне нужно увеличить скорость построения списка. Объекты, добавленные в список, сами имеют несколько подобъектов, обычно 3 объекта, которые меняются на 2 или 1 в зависимости от того, сколько данных осталось добавить.

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

Это код, который у меня есть на данный момент:

List<MainObject> list = new ArrayList();
List<Data> dataList = getDataList();
MainObject mainObject;
int limit = 100;


for(int i = 0; i < limit; i += 3) {
                if(i == limit - 1) {
                    list.add(mainObject = new MainObject(new SubObject(dataList.get(i), this, bBool, tabs)));   
                }else if(i == limit - 2) {
                    list.add(mainObject = new MainObject(new SubObject(dataList.get(i), this, bBool, tabs), 
                            new SubObject(dataList.get(i +1), this, bBool, tabs)));
                }else {                    
                    list.add(mainObject = new MainObject(new SubObject(dataList.get(i), this, bBool, tabs), 
                            new SubObject(dataList.get(i +1), this, bBool, tabs), 
                            new SubObject(dataList.get(i +2), this, bBool, tabs)));
                }
}
return list;

Параметры "this, bBool, tabs" - все переменные класса и всегда одинаковы. Я действительно знаю, что последнее условие else будет выполняться большую часть времени, так что, вероятно, оно должно быть первым условием в операторах if, но я бы лучше нашел лучший способ построения списка все вместе.

Ответы [ 3 ]

2 голосов
/ 16 октября 2019
  1. Проверка типа списка, возвращаемого getDataList ();Это должен быть ArrayList для вашего сценария использования. Если это Linkedlist, получить индексный вызов тяжело и отнимает много времени

  2. Переместить случаи limit-1 и limit-2 наружу для цикла и выйти из цикласам предел-2.

1 голос
/ 16 октября 2019
  1. Вам не нужно назначать новый MainObject переменной
  2. Измените свой список MainObjects на LinkedList. Операция добавления более эффективна для LinkedList, потому что ArrayList должен перестраивать массив внутри, когда он заполнен - ​​это занимает много времени (или просто создать ArrayList с предельным размером: новый ArrayList <> (limit);)
  3. getDataList () метод долженвернуть LinkedList
0 голосов
/ 21 октября 2019

С вашим limit = 100 в показанном коде нет ничего, что могло бы быть медленным. Безусловно, вы можете выполнить некоторые низкоуровневые оптимизации, например, предложенные Срини («Переместить регистры limit-1 и limit-2 за пределы»), но виновник находится в другом месте: либо в конструкторах, либо в dataList::get.

* 1004. * Как быстрый взлом попробуйте dataList = new ArrayList<>(dataList) перед циклом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...