powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Реализация Кэша
25 сообщений из 31, страница 1 из 2
Реализация Кэша
    #33825066
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здраствуйте,

подскажите наиболее эффективный способ реализации кэша объектов
в приложении.
У каждого объекта имеется ObjId и TypeId.
Кеш должен максимально быстро вставлять туда объекты и
извлекать объекты по ObjId и TypeId.

Спасибо.
С Уважением.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825083
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb... и извлекать объекты по ObjId и TypeId....

"Правильный вопрос"...
как то кучеряво...точнее - нафига Вам ОО язык тогда, если Вы не поддерживаете типизацию в коде, а работаете с некой абстрактной ID ?

Объектная модель подразумевает оперирование объектами, а не безликими цифрами...А Если так - то у Вас только одна плоскость хранения - ObjectId данного определённого типа объекта. Но если приглядеться более внимательно - то и искать по ID объекта, не всегда реальная задача... Точнее эта задача появляется при условии анализа взаимодействия между объектами и только. В других случаях - Вы по определению ЗНАЕТЕ и ObjectID так же...


с уважением
(круглый)
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825157
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> В других случаях - Вы по определению ЗНАЕТЕ и ObjectID так же...

Это объектики представляющие собой хранимые объекты в базе.
Поэтому мне и надо с ними взаимодействовать через Кэш клиента.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825182
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb...Это объектики представляющие собой хранимые объекты в базе.
Поэтому мне и надо с ними взаимодействовать через Кэш клиента....

давайте стэп бай стэп...
немного из разряда - как сделал бы я...(это не то, что сейчас сходу - а скорее адаптируя жизненные схемы к вашему вопросу)...

имеем тип...
по типу определяем класс объектов...
обращаемся к коллекции ДАННОГО типа объектов с просьбой - верника мне объект с этим ID...
коллекция шукает в памяти - нет...делает запрос к базе, подымает, делает референс на объект, увеличивает ссылку...возвращает референс...для пользователя - это объект (сам референс маскируем и выдаём за чистого арийца, тьху объект).
получили объект, далее работаем с ним по коду...
------
ссылки сдохли - объект (в зависимости от политики) мона грохнуть..

с уважением
(круглый)
ЗЫ
Возможно я опять Вас не понял :)
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825234
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Возможно я опять Вас не понял :)

Почему же. Весьма даже поняли.

>обращаемся к коллекции ДАННОГО типа объектов с просьбой - верника мне
объект с этим >ID

В данный момент я реализую так.
VCL TStringList
каждый стринг в листе содержит стринг вида TypeId + "." + "ObjId"
и к стрингу прикрепляется этот мой TAppObject

Работает пока сносно, но я думаю что не оптимально.
Думаю что нада какой то контейнер STL взять, для быстрого поиска указателя
на объект по
паре TypeId ObjId.

Может что подскажете.



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825252
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb

Думаю что нада какой то контейнер STL взять, для быстрого поиска указателя
на объект по
паре TypeId ObjId.

Может что подскажете.

ну, если в лоб и если предположить, что эти ID целые числа, то хотя бы:
Код: plaintext
1.
map< pair<int, int>, TObject*>
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825262
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb..каждый стринг в листе содержит стринг вида TypeId + "." + "ObjId"...

сравните то, что написал я выше и Вашу реализацию (пока опустите способ хранения)... различие заключается в том, что Вы ищите во ВСЁМ множестве, а то что озвучил я - только во множестве ДАННОГО типа - а это заведомо МЕНЬШЕ. это раз...

два...способ хранения для идентификации... если уж использовать кэш - то нужно попытаться уменьшить размерность поля сравнения при поиске и попытаться задействовать стандартные, соптимизированные алгоритмы... выше предпалагалось, что в том типизированном объекте (что нашли Вы по идентификатору его класса) содержится коллекция сгенерённых ОБЪЕКТОВ от ДАННОГО класса. Если так - то достаточно сделать поиск в данном массиве данных - как из вариантов, std::map. Единица сравнение ID (как int). Компактность хранения и скорость сравнения (за одну (грубо говоря) машинную команду). Если же взять строку, то они сравниваються по байтно. Скорость сравнения зависит от кол-ва байт. В Вашем случае будет нечто (если Win32 и размерность int) 10 байт + 10 байт = 20 байтные строки. Если они в добавок валяються не упорядоченно в памяти - то анализ идёт методом тупого перебора. Что является ышо более не оптимальней (в данном подходе более оптимальнее их хранить упорядоченно по возрастанию или убыванию - тогда сравнение займёт столько "подходов к снаряду", сколько содержиться степеней двойки в данном кол-ве строк).


с уважением
(круглый)
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825282
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь нам осталось выяснить, что будет оптимальнее

map< pair<int, int>, TObject*>илиmap< pair<int>, map< pair<int>,
TObject*>>ну я имел ввиду мап в каждом элементе которого находится мап
указывающий на TObject.возможно даже вектора подойдут?С Уважением.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825289
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodbТеперь нам осталось выяснить, что будет оптимальнее

map< pair<int, int>, TObject*>илиmap< pair<int>, map< pair<int>,
TObject*>>ну я имел ввиду мап в каждом элементе которого находится мап
указывающий на TObject.возможно даже вектора подойдут?С Уважением.

Вы не внимательно читаете...зачем Вам пара идентификаторов, когда мона обойтись одним ? Чтоб было ? Если Вы и так уже знаете ТИП объекта ? :) Не, предлагаю туда же запихнуть цвет, высоту, ширину ваших объектов... про запас так сказать...

или по другому...
у вас есть столы, стулья, шкафы... Вы берёте некий идентификатор ТИПА (класса объекта) и определяете - ага, это стул... А потом говорите - не, не буду только (экземпляры этого класса - ОБЪЕКТЫ) стулья смотреть, буду ВСЁ просматривать - вдруг среди столов найду МОЙ стул...наверное круто, но ЗАЧЕМ ?

с уважением
(круглый)
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825320
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дак я заведомо еще не знаю сколько в программе будет типов и их
идентификаторы.

С Уважением.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825466
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый redskin,

>ну, если в лоб и если предположить, что эти ID целые числа, то хотя бы:
>map< pair<int, int>, TObject*>

Я переделал кэш объектов на map и провел тесты.
Незнаю хорошие или плохие эти результаты....
Использование STL по сравнению с VCL не дало явного выигрыша по
производительности.
Я признаться был даже удивлен и немного расстроен.

проводился тест на полный рефреш содержимого кэша, т.е. когда берем и для
каждого объекта кэша, обновляем его содержимое из базы.
Размер кэша - 10000 объектов.
STL реализация - 54-55секунд
VCL реализация - 55-56секунд

VCL по скорости отстает на долю секунды. На малых количествах объектов
100-500 разница вообще практически не заметна.
Т.е. скорость работы TStringList->IndexOf( IntToStr(TypeId) + "." +
IntToStr("ObjId"))
и find stl::map на практике не различаются по быстродействию.


С Уважением.



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825502
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, я полностью согласнн с круглым. Нет нужды использовать пару. Но там и было сказанно, если сразу в лоб.

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

Теперь о ваших тестах. Если вы последовательно обновляли данные в объектах, перебирая эти объекты в соответствующих контейнерах (TList и map)
то Вы и не должны были получит какую либо существенную разницу. Разница должна быть заметна тогда, когда Вы ищите объекты в контейнере. Тоесть 10000 раз найти объект с id=356890. Но и здесь есть свои нюансы. На сколько я помню, TList это массив указатклей. Все миассивы имеют индексный доступ типа

MyObj* obj = (MyObj*)List ;

Так вот, индексный доступ - самый быстрый из всех видов доступа. Проблема только в том, что у вас может не хватить памяти на такой массив. Но, если вы можетн себе позволить такую роскошь, то никакая map или hashtable вас не обгонит.
...
Рейтинг: 0 / 0
Реализация Кэша
    #33825608
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNz,

>Теперь о ваших тестах. Если вы последовательно обновляли данные в объектах,
перебирая >эти объекты в соответствующих контейнерах (TList и map)

TStringList и map

>то Вы и не должны были получит какую либо существенную разницу. Разница
должна быть >заметна тогда, когда Вы ищите объекты в контейнере. Тоесть
10000 раз найти объект с >id=356890. Но и здесь есть свои нюансы. На сколько
я помню, TList это массив указатклей. >Все миассивы имеют индексный доступ
типа

Именно так и было.Контейнер заполнен 10000 экземплярами и делается операция
поиска для получения каждого элемента контейнера.

Еще раз повторю: тест производился над

TStringList->IndexOf( IntToStr(TypeId) + "." +IntToStr("ObjId"))
и
stl::map.find(pair<int, int>, TObject*)



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Реализация Кэша
    #33828433
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodbДак я заведомо еще не знаю сколько в программе будет типов и их
идентификаторы.

вот...теперь всё стало на свои места...
простите, но ЛЮБОЙ объект несёт "свою" типизацию. Если у Вас типизации нет - то увы и ах говорить об объектном подходе - мягко говоря не в ту степь... Давайте про типы поговорим !? Эээээээ у Вас чем отличается объект А от объекта Б ? Идентификационным номером ? кхм..а какого лешего идёт попытка использовать терминологию ОО тогда ? у Вас батенька ОДИН тип и зовётся он int... тогда данное решение - Вы уже приводили, двухмерный масив и вперёд... Поиск в данном случае должен занимать на 10000 экземплярах одного типа "всего" 16 сравнений...

Пример...
Берём кошку, собаку, стол, стул...пропускаем по очереди через мясорубку... И по кол-ву опилок бум говорить 34102 - это кошка... 3541 - это стул... 6788 - это стол... ну собака была маленькая и её кучка 356 без имянных частиц... :) Вот так приблизительно выглядит Ваш подход в программировании, если его спроецировать (реинжинеринг) на ОО методологию....

если строго следовать Вашему вопросу (в русле ООП) - то решение уже было озвучено мною выше.

рекомендую почитать Гради Буча...всё таки классика...
Как подсказку, могу вякнуть следующее... Нахфига вообще ООА ? Что он даёт ? Разбиение (группировку) на некие логические классы ? Увы и ах - это ОЧЕНЬ маленькая толика того, что даёт сей подход. Люди которые не вникли в суть происходящего - обычно рассуждают именно об этом... ОО подход гораздо бОльшее в себе содержит...Например уменьшение переделок кода со временем. Это не на поверхности - но это так... В задачи данной методологии входят такие вещи как нахождение тех сущностей, которые будут СЛАБО изменяться с течением времени. За счёт чего ? спросите Вы... А вспомните как строиться данная методология ? Правильно, от ЗАДАЧИ ! Вот это фундаментальный кирпичик ! Что это значит ? Это значит, что если пользователь (заметьте НЕ программист, НЕ аналитик - а ПОЛЬЗОВАТЕЛЬ!!!) рассуждает в своей постановки об машинах и колёсах - значит это претенденты на сущности под описание....и т.д.. пересказывать не буду... лучше почитайте повнимательней...к сожалению - это одна из самых распространённых ошибок в данной плоскости вопроса...


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Реализация Кэша
    #33828778
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Колобок,

чтобы не пороть чуш в конференции рекомендую тебе почитать Буча и
Страуструпа.

Ну пока.



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Реализация Кэша
    #33830403
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb.....чтобы не пороть чуш в конференции.....

очень аргументировано... :)
пожелаю удачи лично Вам и особенно Вашим пользователям...

с уважением
(круглый)
ЗЫ
Эх молодёжь...молодёжь... эту бы энергию, да в мирное русло !!!
...
Рейтинг: 0 / 0
Реализация Кэша
    #33830405
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb.....чтобы не пороть чуш в конференции.....

очень аргументировано... :)
пожелаю удачи лично Вам и особенно Вашим пользователям...

с уважением
(круглый)
ЗЫ
Эх молодёжь...молодёжь... эту бы энергию, да в мирное русло !!!
...
Рейтинг: 0 / 0
Реализация Кэша
    #33835945
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Эх молодёжь...молодёжь... эту бы энергию, да в мирное русло !!!

А вы на каком курсе учитесь?


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Реализация Кэша
    #33836117
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodbА вы на каком курсе учитесь?

на курсе молодого дедушки :)

с уважением
(круглый)
ЗЫ
Помню как лет тридцать назад прикалывали диодики к манжетам одежды. Нечто оригинальное получалось. С тех пор и сохранилась привычка - в спешке привинчивать оторвавшиеся пуговицы подручными резисторами и диодами :) Правда после критики первой жены - постарался перевоспитаться....гы..
...
Рейтинг: 0 / 0
Реализация Кэша
    #33836678
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Ну это еще куда нешло.
По крайней мере чувство юмора у вас осталось.

А по пуговицам кулаками не били?
Ощущение не из прятных знаетели.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Реализация Кэша
    #33836712
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0Помню как лет тридцать назад прикалывали диодики к манжетам одежды. Нечто оригинальное получалось. С тех пор и сохранилась привычка - в спешке привинчивать оторвавшиеся пуговицы подручными резисторами и диодами
Как вариант можно попробовать пары колодка+микруха, получается удобно, но не износоустойчиво (придётся часто такие запонки менять).
А вообще в нашу эпоху тотальной миниатюризации пора бы уже давно на SMT-монтаж пуговиц переходить!
;)
...
Рейтинг: 0 / 0
Реализация Кэша
    #33836772
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb...По крайней мере чувство юмора у вас осталось....

бох с ними...
возвращаясь к пьяным ёжикам...то бишь многострадальному ООА и иже...Вы не обижайтесь на совет по поводу книги... Это не с позиции пальцевеерности, а больше рекомендация...мне показалось, что Вы немного ошибаетесь говоря о контексте применения данной методологии. И исходя уже из собственных наблюдений и опыта организации могучих кучек от программирования - постарался очертить логическую опшипку в данных вещах.кхм... опять начинаю наверное надоедать...ну да лано...сорьки..заткнулси...


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Реализация Кэша
    #33836871
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0,

вам просто хотелось сказать что типы данных, должны быть описаны в програме
на этапе программирования и жестко закомпилированы в программу?


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Реализация Кэша
    #33838794
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb... что типы данных, должны быть описаны в програме
на этапе программирования и жестко закомпилированы в программу?...

простите, я про язык С++ вообще то :) . если в С++ не применять типизацию - то нахрена вообще Вы пользуете данный инструментарий ? Ради стрнкопи ? Замечательно подойдёт фортран, си, ассемблер тогда..Если Вы говорите не про абстрактные типы, а "чиссо" из предметной области. и эти типы динамические (по условию задачи) - то нужно закладывать ту типизацию, с которыми оперирует заказчик...

Пример...
Заказчик хочет оперировать зайцами... Но на момент их генерации их типы будут меняться одно-двух-трёх-четырёх-пяти ногих... серых-белых. с квадратной головой и круглой и т.д.. Многое или почти всё, что я тут обозвал - проситься на свойства, но может быть и сущностью...
Пример..
Треуголную голову мы можем отделить от зайца и впендюрить волку. Круглая имеет пимпочку, которая открывается и в необходимый внутренний слот вставляется новый кусочек памяти... Приведённые сущности уже не свойства, а самостоятельные объекты, с которыми (заметьте) ОПЕРИРУЕТ ЗАКАЗЧИК !!!

я постарался изложить тот мостик, который зачастую необходим от ООА к ООП...И попытался обозначить типичную ошибку подмены сущностей из бизнес логики, на наши программерские домыслы... Как следствие - появится на свет монстрик, у которого в процессе роста возникнут подпорочки и в финальной стадии всё начнёт падать с оглушительным грохотом синего экранчика (ну это крайность)...

с уважением
(круглый)
...
Рейтинг: 0 / 0
Реализация Кэша
    #33839106
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Колобок,

>Пример...
>Заказчик хочет оперировать зайцами... Но на момент их генерации их типы
будут меняться одно->двух-трёх-четырёх-пяти ногих... серых-белых. с
квадратной головой и круглой и т.д.. Многое или >почти всё, что я тут
обозвал - проситься на свойства, но может быть и сущностью...

Скажите пожалуста, когда в базе данных в таблице ЗАЯЦ вы добавляете новое
поле
это как называется? Реинкарнация Типа?

Как на ваш взгляд, эта операция что то вполне номальное или из ряда вон
выходящее?


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Реализация Кэша
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]