Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление итераторов, Лнейное время для удаления итераторов? 
V
    Опции темы
d06osipov
Дата 18.4.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



У меня создаётся массив итераторов списка на 50000 элементов, примерно так:
Код

list<T>::iterator* records_tab=new list<T>::iterator[sz];

Дальше, в цикле, заполняется список и массив из файла (вместе со списком заполняются map`ы, деревья и ещё много чего) --- всё это занимает примерно 5 секунд. 

Затем массив удаляется (сам список из 50000 элементов, на который ведут итераторы по прежнему существует):
Код

delete[] records_tab;

Я запускал это на Visual Studio и выполнялось это неимоверно долго --- я так и не дождался завершения. Посмотрев код Microsoft, я увидел странный цикл для разрыва связей, вызывающийся и деструктора итератора.

Я заменил удаление на:
Код

for(i=0;szz>0;szz--)
{ records_tab[i++]=list<T>::iterator();
}
  delete[] records_tab;

И после этого медленно стал работать цикл. За 20 секунд сбросилось всего 300 итераторов.

Вопрос: неужели, STL действительно требует линейного времени на удаление итераторов и зачем? Как избежать в моём случае? Как дело обстоит с другими компиляторами, или может, можно даже в VS задать какой-нибудь #define, чтобы избежать этой ненужной траты? 
PM MAIL   Вверх
Lazin
Дата 18.4.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



что за элементы в списке, покажи код

Цитата(d06osipov @  18.4.2008,  13:49 Найти цитируемый пост)
Вопрос: неужели, STL действительно требует линейного времени на удаление итераторов и зачем?

вообще delete[] вызывает деструктор каждого объекта
PM MAIL Skype GTalk   Вверх
d06osipov
Дата 18.4.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Lazin @ 18.4.2008,  13:57)
Цитата(d06osipov @  18.4.2008,  13:49 Найти цитируемый пост)
Вопрос: 

вообще delete[] вызывает деструктор каждого объекта

Что за элементы неважно, удаляются всё равно только итераторы. Я понимаю, что delete вызывает деструктор (думаю, иначе он работал бы моментально, new[50000] во всяком случае работает моментально). И видимо деструктор итератора требует линейного времени по размеру списка.

Но если код всё же нужен приведу, правда не уверен, что кто-то будет разбираться:

Код

  myname=save_loader<string>::load(in);
  columns.load(in);
  column* cls=columns.get_cols();
  size_t  clc=columns.get_colc();
  
  index_count=columns.count_index();
  index_by_order=NULL;
  
  size_t sz=save_loader<size_t>::load(in),szz=sz;
  
  record_it* records_tab=new record_it[sz];
  size_t i=0;
  
  for(;sz>0;sz--)
  { records.push_back(record(in,cls,clc,index_count));
    records_tab[i++]=--records.end();
  }
  save_loader<size_t>::load(in);
  size_t cc=0;
  for(size_t c=0;c<clc;c++)
  { if(cls[c].is_index)
    { save_loader<size_t>::load(in);
      index_by_col[c].load(in,index_saver(*cls[c].type,records_tab,cc++));
    }
  }
  for(i=0;szz>0;szz--)
  { records_tab[i++]=record_it(); //Реальная трата времени вот тут!
  }
  delete[] records_tab;
  norimalize();

record_it это list<record>::iterator. 
PM MAIL   Вверх
Lazin
Дата 18.4.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(d06osipov @  18.4.2008,  14:21 Найти цитируемый пост)
  for(i=0;szz>0;szz--)
  { records_tab[i++]=record_it(); //Реальная трата времени вот тут!
  }

а это зачем делать?  smile 
если обнулять итератор, то не этим - record_it(); 
а вот этим значением records.end();

а вообще можно просто удалить - 
Код

delete[] records_tab;


Добавлено @ 14:33
еще один баг нашел,
Код

  for(i=0;szz>0;szz--)
  { records_tab[i++]=record_it(); //Реальная трата времени вот тут!
  }
- будет работать вечно, потому-что в начале цикла sz = 0, так как перед этим отработал цикл
Код

  for(;sz>0;sz--)
  { records.push_back(record(in,cls,clc,index_count));
    records_tab[i++]=--records.end();
  }
 а sz - беззнаковое значение, то есть в первой итерации цикла, в котором ты удаляешь произойдет переполнение и ты получишь очень большое число  smile 
[update]
пардон не заметил что переменные разные.. sz и szz..  smile 


Это сообщение отредактировал(а) Lazin - 18.4.2008, 14:48
PM MAIL Skype GTalk   Вверх
d06osipov
Дата 18.4.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Lazin @ 18.4.2008,  14:29)
Цитата(d06osipov @  18.4.2008,  14:21 Найти цитируемый пост)
  for(i=0;szz>0;szz--)
  { records_tab[i++]=record_it(); //Реальная трата времени вот тут!
  }

а это зачем делать?  smile 
если обнулять итератор, то не этим - record_it(); 
а вот этим значением records.end();

а вообще можно просто удалить - 
Код

delete[] records_tab;

Согласен, это одно и то же. Я сделал так, чтобы 
1) понять, из-за чего реально тратиться время (вдруг, delete[] тратит его на возвращение блоков памяти?) и 
2) чтобы можно было реально проследить, сколько итераторов обработано. 
В любом случае, эти два варианта работают одинаково медленно, но так я узанал, что время тратится именно на то, чтобы отвязать итератор от списка.
PM MAIL   Вверх
Lazin
Дата 18.4.2008, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



вообще так 
Код

for(i=0;szz>0;szz--)
циклы лучше не писать, читаемость хуже плюс такие побочные эффекты  smile

Добавлено через 3 минуты и 16 секунд
итератор нельзя отвязать от списка, даже когда итератор не указывает на элемент списка, он содержит list.end() списка которому он принадлежит
в некоторых версиях stl можно запросто получить assert  сравнивая(присваивая ....) итераторы(не значения а именно сами итераторы) из разных списков(векторов, деков)
PM MAIL Skype GTalk   Вверх
d06osipov
Дата 18.4.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Lazin @ 18.4.2008,  14:35)
вообще так 
Код

for(i=0;szz>0;szz--)
циклы лучше не писать, читаемость хуже плюс такие побочные эффекты  smile

итератор нельзя отвязать от списка, даже когда итератор не указывает на элемент списка, он содержит list.end() списка которому он принадлежит
в некоторых версиях stl можно запросто получить assert  сравнивая(присваивая ....) итераторы(не значения а именно сами итераторы) из разных списков(векторов, деков)

Побочные эффекты не от цикла. Как я писал, они остаются, если поручить это операции delete;

Итератор я отвязываю так: records_tab[i++]=list<T>::iterator();, неужели, так можно получить assert (конструктор по-умолчанию же у него есть, зачем такую диагностику)?
Это долгая операция. Требует, видимо порядка n действий, где n размер списка. В этом и проблема. Если этого не делать явно, то то же происходит при вызове delete.


PM MAIL   Вверх
d06osipov
Дата 30.4.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Я сделал #define HAS_ITERATOR_DEBUGGING 0 и это стало работать быстро!

Выходит, STL от MIcrosoft не настолько идиотская, насколько могло показаться. 
PM MAIL   Вверх
Rififi
Дата 30.4.2008, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



d06osipov, 
щас ты будешь смеяться: авторство STL, поставляемой с компилятором, не принадлежит MS
PM MAIL   Вверх
d06osipov
Дата 30.4.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Rififi @  30.4.2008,  19:59 Найти цитируемый пост)
щас ты будешь смеяться: авторство STL, поставляемой с компилятором, не принадлежит MS 

Кто же ещё мог так наизвращаться? Впрочем, про Microsoft известно, что это скорее контора "купи-продай", так что ничего удивительного нету.

PM MAIL   Вверх
vinter
Дата 30.4.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(d06osipov @  30.4.2008,  21:02 Найти цитируемый пост)
Кто же ещё мог так наизвращаться? Впрочем, про Microsoft известно, что это скорее контора "купи-продай", так что ничего удивительного нету.

меня просто добивает тупость людей...
причем тут Майкрософт, STL не имеет никакого отношения к MS!!! Он его не покупает, не продает и ничего с ним не делает


--------------------
Мой блог
PM MAIL WWW   Вверх
Lazin
Дата 30.4.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(vinter @  30.4.2008,  21:05 Найти цитируемый пост)
меня просто добивает тупость людей...
причем тут Майкрософт, STL не имеет никакого отношения к MS!!! Он его не покупает, не продает и ничего с ним не делает

да, они только лицензируют одну из реализаций стандартной библиотеки и продают в составе VS своим клиентам  smile 
PM MAIL Skype GTalk   Вверх
vinter
Дата 30.4.2008, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(Lazin @  30.4.2008,  22:13 Найти цитируемый пост)
да, они только лицензируют одну из реализаций стандартной библиотеки и продают в составе VS своим клиентам

эта часть VS поставляется бесплатно ;)


--------------------
Мой блог
PM MAIL WWW   Вверх
d06osipov
Дата 1.5.2008, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(vinter @  30.4.2008,  21:05 Найти цитируемый пост)
причем тут Майкрософт, STL не имеет никакого отношения к MS!!! Он его не покупает, не продает и ничего с ним не делает 

STL имеет такое отношение к MS, что одна из его реализаций входит в состав Visual Studio (а по вашим словам ещё и в бесплатный набор Visual C++ Toolkit), а документация по данной реализации входит в состав MSDN.

А то, что Microsoft эту реализацию не покупает, это не факт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0959 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.