Russian Qt Forum
Ноябрь 27, 2024, 20:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 4 5 [6] 7 8   Вниз
  Печать  
Автор Тема: Частный случай механизма сигнал-слот  (Прочитано 73862 раз)
whitecemetery
Гость
« Ответ #75 : Март 26, 2012, 17:25 »

Прошу прощения за оффтоп, но я просто в шоке.
Разбирался, почему вставка в мой List работает в 10 раз медленней, чем в std::list.
Выяснил, что все касается оператора new.
То есть, даже если в функции PushBack не делается ничего, кроме выделения памяти под простейший элемент:
void PushBack()
{
    int * p = new int;
}

Все, уже в 10 раз медленней std::list.
« Последнее редактирование: Март 26, 2012, 17:27 от whitecemetery » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #76 : Март 26, 2012, 20:39 »

Для list и ассоциативных контейнеров custom allocator эффективен (в отличие от линейных - вектор, дека). Идея проста: распределяются блоки одинаковой длины, ну значит распределить сразу N блоков. А если удаляем - не спешить мочить, а связать удаленные в список и при следующем выделении использовать повторно. Там все отлично получается, а на каждый чих звать malloc/free - ну так конечно в пролете
Записан
whitecemetery
Гость
« Ответ #77 : Март 27, 2012, 07:00 »

Цитировать
Для list и ассоциативных контейнеров custom allocator эффективен
Да, я уже понял, что без placement new и выделения большего количества памяти, чем нужно, никуда для быстрого добавления.
Я подумываю о листе, похожем на Qt-шный - когда память выделяется цельным блоком - просто вектором - под несколько элементов, а потом они содержат индексы относительно начала массива на элементы до них и после в листе. Тогда добавление эффективно, сортировка тоже эффективна, потому что производится с вектором, а не листом. : )
Единственно, при удалении элементов память висит, пока весь лист не будет удален. Хотя и с placement new будет также.
Записан
twp
Гость
« Ответ #78 : Март 27, 2012, 09:34 »

еще одна деталь: не целесообразно выделять память для объекта, если его размер <= sizeof(void*). Т.е. внутри хранить указатели на void. Насколько я знаю именно так реализованы контейнеры в Qt.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #79 : Март 27, 2012, 10:06 »

Я подумываю о листе, похожем на Qt-шный - когда память выделяется цельным блоком - просто вектором - под несколько элементов, а потом они содержат индексы относительно начала массива на элементы до них и после в листе. Тогда добавление эффективно, сортировка тоже эффективна, потому что производится с вектором, а не листом. : )
Чую - что-то упущено (уж слишком хорошо получается). Давайте детали/псевдокод, перетрем
Записан
whitecemetery
Гость
« Ответ #80 : Март 28, 2012, 07:28 »

Упущено то, что контейнер отжирает память. Если из него удаляются элементы - он становится прореженным, но не уменьшается в размере. Если после этого в него снова добавляются элементы, он становится еще больше, чем был.
И так, пока его полностью не удалят.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #81 : Март 28, 2012, 10:29 »

Все равно список и не планируется доступ [] по индексу - так почему бы не использовать "дырки" повторно?
Также представим что память распределяется не одним, а цепочкой блоков. И в этом случае сортировка не должна быть проблемой - сначала раскидываем "по блокам", затем сортируем каждый блок (почти так делает quicksort).
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #82 : Март 28, 2012, 12:03 »

Ура, товарищи!

Вышла новая версия libssc-5.0

Изменилась структура проекта.
Претерпела изменения (разумеется, в лучшую сторону) архитектура libssc, став более гибкой для последующих расширений. Появилась полная независимость от типа контэйнера (при условии, что он поддерживает stl интерфейс итераторов и алгоритмов)

Повышена производительность.
Заменены все конструкции вида for(...) на std::for_each.

Выкинуты свойства priority - которые нафиг на самом деле не нужны..

Короче, эта версия стала более продвинутой, более гибкой, более быстрой)

Исходники приатачены.
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
whitecemetery
Гость
« Ответ #83 : Март 28, 2012, 14:55 »

Как хорошо-то, когда поддержка от разработчика в реальном времени. ; )
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #84 : Март 28, 2012, 15:00 »

Как хорошо-то, когда поддержка от разработчика в реальном времени. ; )
Не знаю, пойдёт ли она у вас.. Там сейчас активно используются stl алгоритмы:
std::find_if
std::for_each
std::remove_if
вместо самопальных циклов for()
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #85 : Март 28, 2012, 16:06 »

Нашёл тут один баг, в методе slot_count() приватного класс signal_p
Раньше, по не внимательности было
Код
C++ (Qt)
std::remove_if(m_list.begin(), m_list.end(), not_valid);
return m_list.size();
 

что давало не правильное число валидных соединений.
А надо бы так:
Код
C++ (Qt)
iterator it = std::remove_if(m_list.begin(), m_list.end(), not_valid);
m_list.erase(it, m_list.end());
return m_list.size();
 

Вобщем ради эффективности исправлено на
Код
C++ (Qt)
m_list.remove_if(not_valid);
return m_list.size();
 

Ещё пара мелочей, эстетического характера)

версия: 5.0.5
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #86 : Март 28, 2012, 19:13 »

Это не попытка "развязать полемику", просто мое личное мнение - отношение к std algorithm должно быть разумным, как к водке
Цитировать
Папаша, зачем Вы так? Ну приняли литру... Ну две. Но зачем же так нажираться?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #87 : Март 28, 2012, 19:51 »

Это не попытка "развязать полемику", просто мое личное мнение - отношение к std algorithm должно быть разумным, как к водке
Цитировать
Папаша, зачем Вы так? Ну приняли литру... Ну две. Но зачем же так нажираться?

Клуб анонимных stl зависимых программистов..
-Здрасвуйте, меня зовут Макс и я зависим от stl алгоритмов, контэйнеров.. Всё началось несколько лет назад, когда друзья дали мне попробовать почитать два томика Брюса Эккеля "Фмлософия C++". Я не заметил как втянулся в это( Вначале я употреблял stl очень редко, по праздникам и по особым случаям, чтоб просто не выглядеть лузером в глазах друзей (они то давно употребляют и даже вещи по крепче, boost например)..
Потом всё больше и больше начал употреблять stl и даже мешал его с различными патернами..

Недавно поймал себя на мысли, что уже разучился изобретать велосипеды.. Меня это очень пугает..
Но самое страшное это то, что мне уже мало stl.. stl уже не вставляет как прежде... руки тянутся к boost..
Не знаю, как с этим жить(

Эх, велосипеды, велосипеды, где ж те времена...
      
добавлено, чуть спустя:

Да, забыл смайлик поставить
 Подмигивающий
« Последнее редактирование: Март 28, 2012, 20:01 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #88 : Март 29, 2012, 01:06 »

Зарелизил версию libssc-5.0.8

Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #89 : Март 29, 2012, 11:05 »

Появилась возможность соединять сигналы со слотами(др. сигналами), у которых число параметров может быть меньше (но не больше!), чем у сигнала.
пример:
Код
C++ (Qt)
using namespace std;
 
struct A
{
   ssc::signal<const double&, const double&> sig2;
   ssc::signal<float> sig1;
   ssc::signal<void> sig0;
 
   void run() const {
       sig2(1.0, 2.0);
       sig1(3.0f);
       sig0();
   }
};
 
struct B : public ssc::trackable
{
   void slot2(float x, float y) const {
       cout << "float x = " << x << " float y = " << y << endl;
   }
   void slot1(int x) const {
       cout << "int x = " << x << endl;
   }
 
   void slot0() { cout << "slot0" << endl;}
};
 
int main()
{
   A a;
   B *b = new B();
 
   a.sig2.connect(b, &B::slot2);
   a.sig2.connect(b, &B::slot1);
   a.sig2.connect(b, &B::slot0);
 
   a.sig1.connect(b, &B::slot1);
   a.sig1.connect(b, &B::slot0);
 
   a.sig0.connect(b, &B::slot0);
 
   a.run();
 
   delete b;
 
   return 0;
}
 

Версия libssc-5.1.0
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: 1 ... 4 5 [6] 7 8   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.301 секунд. Запросов: 23.