![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| SCAR |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 17.8.2006 Репутация: нет Всего: нет |
Доброго времени суток!
Добавил в программу следующую рекурсивную функцию:
Но данная функция работает очень медленно (около 100 итераций в секунду), а с увеличением количества итераций скорость работы замедляется еще раз в 10... Функция Clone() описана ниже:
Подскажите пожалуйста, как ускорить данную процедуру? Я в C# не настолько спец |
||||
|
|||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
Для начала попробуй определить, какая часть рекурсивной функции выполняется дольше всего.
Плюс выключи логирование и проверь разницу во времени. --------------------
|
|||
|
||||
| IBS |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 214 Регистрация: 29.7.2008 Где: Белоруссия Репутация: 1 Всего: 6 |
я бы рекомендовал почитать про развертку рекурсии с помощью стека.
Кстати, таким образом реализовать отложенный возврат элементов (нравится он мне Это сообщение отредактировал(а) IBS - 25.6.2013, 21:48 |
|||
|
||||
| SCAR |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 17.8.2006 Репутация: нет Всего: нет |
Большое спасибо! Очень интересная идея про стек. А не подскажите, где почитать можно? В С++ с такими проблемами не сталкивался, а тут...
|
|||
|
||||
| IBS |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 214 Регистрация: 29.7.2008 Где: Белоруссия Репутация: 1 Всего: 6 |
Тут ребята развели прикольный холивар на эту тему:
http://otvety.google.ru/otvety/thread?tid=4ef8214f3d124669 А вообще смысл в том, что нужно выделить основные параметры, которые тебе необходимы на каждой "стековой итерации" и писать их в стек, если писать на данной итерации ничего не надо, то начинаем вытягивать и обрабатывать. |
|||
|
||||
| SCAR |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 17.8.2006 Репутация: нет Всего: нет |
Интересная информация, спасибо! Жаль, что большого прироста производительности данный подход не дает, но все же полезен для оптимизации.
|
|||
|
||||
| SCAR |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 17.8.2006 Репутация: нет Всего: нет |
Как оказалось, слабое место - функция Copy(), особенно это место:
Подскажите пожалуйста, есть ли какие-то более шустрые альтернативы для MemberwiseClone()? Или, может быть, стоит попробовать создать конструктор копирования для класса? |
|||
|
||||
| SCAR |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 17.8.2006 Репутация: нет Всего: нет |
Нашел интересную информацию по данной теме:
http://stackoverflow.com/questions/966451/...copy-in-c-sharp http://whizzodev.blogspot.com/2008/03/obje...ng-il-in-c.html Реализовал IL клонирование, как указано в примере. Но только вот, клона эта штука не создает, а создает объект который ссылается на ту же ячейку памяти, ну со всеми выходящими. Меняешь один объект, меняется и второй... Возможно имеет смысл сделать ILCloner рекурсивным, для глубокого копирования? Это сообщение отредактировал(а) SCAR - 14.7.2013, 23:08 |
|||
|
||||
| SCAR |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 17.8.2006 Репутация: нет Всего: нет |
Всем привет,
Я опять с тем же вопросом. Ускорил данную функцию, как только мог, вот наиболее быстрый вариант:
В качестве функции клонирования перепробовал все варианты, которые нашел в интернете, к примеру: Deep IL Cloning, Reflection cloning, MemberwiseClone, BinnaryFormatter (с использованием MemoryStream и Serialize). Кстати, последний способ - наиболее медленный. Но проблема так и не исчезла, первые 25000 моделей формируются очень быстро (меньше секунды), но дальше - хуже. С каждой новой итерацией скорость работы существенно замедляется и когда кол-во моделей достигает отметки в пол миллиона, то скорость формирования моделей становится около 50 шт./сек. Размер объектов SignModel всегда примерно один и тот же, т.е. это не может происходить из-за увеличения размера клонируемых данных. Подскажите пожалуйста, на что стоит обратить внимание? |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
на профайлер.
нельзя заниматься оптимизацией без профилирования - велик шанс, что не только кучу времени потрачено будет на вылизывание некритичного куска, но и код ощутимо испортится после ненужной оптимизации. скачай любой профайлер - хоть ant, хоть jetbrains, хоть любой другой, они все имеют беплатный период. не разберёшься в отчётах - выкладывай сюда. пс. я подозреваю, что дело вовсе не в клонировании, а вообще в подходе к решению задачи, но, опять-таки, без профилирования никаких выводов делать нельзя. |
|||
|
||||
| SCAR |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 17.8.2006 Репутация: нет Всего: нет |
Большое спасибо за совет!
Профайлер указал на процедуру SegX.Instance.addSignModel(initialMdl); Она выглядит следующим образом:
Затык на ArrayList.IndexOf, подскажите пожалуйста, какие есть альтернативы? Чем можно заменить использование IndexOf? Я читал про BinarySearch, но он требует сортировки списка, а я не думаю, что сортировка будет быстрее. Лог профайлера: http://s1.ipicture.ru/uploads/20130723/CchKD6Ap.bmp Это сообщение отредактировал(а) SCAR - 23.7.2013, 21:02 |
|||
|
||||
| SCAR |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 17.8.2006 Репутация: нет Всего: нет |
Заменил ArrayList на Dictionary<long, SignModel>, стало работать очень быстро, но случилась другая проблема
Когда создается 5999472 модели, то Dictionary выплевывает System.OutOfMemoryException )) Как можно добавить ему памяти, чтоб можно было разместить больше объектов? Это сообщение отредактировал(а) SCAR - 23.7.2013, 21:30 |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
5999472 объектов в памяти - безумно много
надо смотреть в сторону базы данных, мне кажется, это неизбежно |
|||
|
||||
| SCAR |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 17.8.2006 Репутация: нет Всего: нет |
Согласен, что много, но надо больше. А даст ли база такой перформанс? И не могли бы вы посоветовать, в сторону чего смотреть?
Была глупая идея, сделать несколько контейнеров и обертку, которая бы переключалась между ними Кстати, может стоит посмотреть в сторону HeshSet? Говорят он может хранить почти 90 млн. записей. Но не уверен, что мне хватит И почему я не начал писать это приложение на C++?! Это сообщение отредактировал(а) SCAR - 23.7.2013, 22:08 |
|||
|
||||
| SCAR |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 17.8.2006 Репутация: нет Всего: нет |
Взвесил все "за" и "против", решил пока не смотреть на базу, а сделать фильтрацию моделей "на лету". Перед добавлением в словарь буду проверять на соответствие определенным критериям и если по ним модель не подходит, то добавлять ее не буду. Хотя планировал сделать данную фильтрацию после добавления всех моделей. Надеюсь в этом случае все поместится
А не подскажите, есть ли в C# какой-нить аналог std::remove_copy_if (С++) для generic контейнеров? |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |