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

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

Страниц: 1 ... 4 5 [6] 7 8   Вниз
  Печать  
Автор Тема: Частный случай механизма сигнал-слот  (Прочитано 75642 раз)
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.056 секунд. Запросов: 19.