OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 17 Июль, 2019 03:21

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Четверг, 04 Март, 2010 11:20 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Алексей Елин писал(а):
т.е. ваш 1 гиг ок, а мои 2 - нет?
RTFM

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

Алексей Елин писал(а):
Ха-ха. Написали какой то фигни (это я про создателей дельфи), даже не думая "Зачем это в ЖИЗНИ может пригодится." Вы хоть сами себя читаете?
И Вас - тоже.
И о многом, в Вашем отношении, начинаю догадываться...

Алексей Елин писал(а):
Представляете, я знаю ТОЧНО как это в дельфи работает. И да, я смотрел, много раз :) Дак вот - они КОПИРУЮТ если нет свободных страниц сразу после текущего блока памяти. А в реальной программе их (свободных страниц в конце блока) обычно нет
Проверьте, делая добавки к 100М-тексту (бог с ним, с гигом, если Ваша лично винда его не выделяет)
Убивать таких знатоков, блин.
Смотрим в System.pas: _LStrCat -> _LStrSetLength -> _ReallocMem
Специально отмечу, что "смотреть много раз", и понимать написанное - не всегда одно и то же.

Алексей Елин писал(а):
И просто ремепинг в средах со сборкой мусора (.Net, Java, CP) делать нельзя. Почему? Да потому что указатель после ремапинга будет другой. Дальше объяснять?
Обязательно
Начните с того, что именно Вы лично понимаете под реэпингом. Если уж (оказывается!!!) при данной операции указатель меняется.
И откройте попутно глаза: меняется ли указатель при выполнении SetLength из Mt... И как они докатились до такого "кошмара"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Четверг, 04 Март, 2010 11:47 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
AVC писал(а):
"Ремэпинг" я первоначально даже не рассматривал (наш проц -- без MMU и прочих чудес техники).
Хм...
Причем здесь за рыбу деньги - не пойму никак. Это не чудо, это база... Вот только не вспомню никак: в 386-м, или в 486-м появившаяся... давно было

Но ДА, такая постановка возможна. Например, у меня любимый камень - Atmega-8
Там всего 1К на борту - какая нафиг страничная память.
Ну, скажем, стоит сегодня у меня он в самом LPT-разъеме, и занимается приемом пакетных данных с компа, и отправляет по I2C (у них это называется TWI-интерфейс) в мою маленькую системку.
Т.е., это буфер FIFO. И его емкость мне не маловажна, чтобы пижонить с удвоениями. И быстродействие - тоже, чтобы пижонить с копированиями.
А ведь у меня сеть-то "многомастерная". Т.е., нормальная жизнь (кончил передавать один пакет - начинай передавать другой), может быть порушена необходимостью уже принимать пакеты от железа.
И куды девать данные этих пакетов ???
Строить динамическую память (с реаллокацией методом копирования) ???
Ага, щаз :lol:
Ну придумал я чего-то там... пишу в свободное место FIFO (закольцованный массив), в обратном порядке, от того "хвоста" где данные уже использованы (переданы в сеть)

Мораль - выпрыгни из трусов, но обойдись без копирования :D Рефракторинг задачи способен на многое

btw: Я вообще к mov-ам отношусь как к командом-паразитам :) Данные туды-сюды, туды-сюды... Так всю жизнь их таскать можно, и все без видимого результата.
И ведь таскают...
Наблюдение: эффективная программа отличается от тупой, прежде всего - процентным составом ентих mov-ов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Четверг, 04 Март, 2010 11:58 

Зарегистрирован: Суббота, 28 Январь, 2006 00:10
Сообщения: 52
Откуда: г. Киров
Galkov писал(а):
RTFM
И вам того же.
Galkov писал(а):
Сам смысл динамического изменения размера - заключается в возможности освобождении ресурса
???
По моему не в этом совсем, а в невозможности выделить неизвестное их (ресурсов) количество заранее...
Galkov писал(а):
Ниоткуда оно не всплылО. Оно всегда было в исходной постановке. Независимо от того, понимает это кто-то, или нет.
Это та самая "простая вещь", которую, как оказывается - хрен объяснишь
Просто оно реализуется аналогично, понимает это кто-то, или нет.
Galkov писал(а):
Смотрим в System.pas: _LStrCat -> _LStrSetLength -> _ReallocMem. Специально отмечу, что "смотреть много раз", и понимать написанное - не всегда одно и то же.
А вы дальше, в ReallocMem смотрели?
(Специально отмечу, что "смотреть много раз", и понимать написанное - не всегда одно и то же. :) )
Galkov писал(а):
Начните с того, что именно Вы лично понимаете под реэпингом.
Мепинг - отображение логических адресов на физические. Ремепинг - изменение этого отображения. Ремепинг применяется как для изменения логического адреса без изменения физического (например MemoryMappedFiles), так и для изменения физического без изменения логического (например swap-файл).
Galkov писал(а):
И откройте попутно глаза: меняется ли указатель при выполнении SetLength из Mt... И как они докатились до такого "кошмара"
Открываю вам глаза - меняется! Точнее может менятся. И кстати, по секрету, он (SetLength из Mt) ТОЖЕ копирует массив. А как они "докатились до такого "кошмара"" спросите у авторов. Я это кошмаром не считаю.

PS: В коде мне кажется лушче использовать не "ручное" создание копии массива и его копирование, а использование именно SetLength из Mt по двум причинам:
1. Он написан более оптимально в связи с использованием оптимизированной SYSTEM.MOVE.
2. Он може быть в будущем переписан под другую платформу еще более оптимально, например с тем же ремапингом, если это возможно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Четверг, 04 Март, 2010 12:24 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
И понеслась...

Замечу, что начавшийся спор товарищей Galkov и Алексей Елин удалился от исходной темы "аналог new ArrayList() (.NET)".

Если эта "дискуссия" вам действительно необходима --- определитесь с темой (ЛС) и выделим...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Четверг, 04 Март, 2010 14:30 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Евгений Темиргалеев писал(а):
Если эта "дискуссия" вам действительно необходима --- определитесь с темой (ЛС) и выделим...

Мне показалось, что тема достаточно интересна (наверное, потому что здесь у меня пробел в знаниях :oops: ).
Так что, IMHO, выделить ее стоит.
А вот ссориться, конечно, не надо. Расхождение во мнениях -- не причина.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Четверг, 04 Март, 2010 15:03 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Galkov писал(а):
А ведь у меня сеть-то "многомастерная". Т.е., нормальная жизнь (кончил передавать один пакет - начинай передавать другой), может быть порушена необходимостью уже принимать пакеты от железа.
И куды девать данные этих пакетов ???
Строить динамическую память (с реаллокацией методом копирования) ???

А нужна ли там вообще реаллокация, если даже отказаться от дополнительной памяти в буфере FIFO?
Ведь, вероятно, длина пакета ограничена.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Четверг, 04 Март, 2010 16:02 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
AVC писал(а):
А нужна ли там вообще реаллокация, если даже отказаться от дополнительной памяти в буфере FIFO?
Ведь, вероятно, длина пакета ограничена
Как бы не очень понял вопроса....
О чем я говорил: мне заранее неизвестно ни количество возможных пакетов, ни их длина. Ну поперли себе. Аппаратная возможность "заморозить" физическую линию - есть (I2C все-таки). Но пусть это будет (если у меня голова на плечах есть) только когда действительно ВСЯ память кончится...
Тем более, что и ограничений на длину у меня и нет, в общем-то. Скажем, "траектория движения" (это координатный стол) - очень длинная может быть.
Есть тупой (в смысле - шаблонный) способ: ничего знать не хочу, все и без меня придумано - получили хэдер пакета, реаллоцируем память (хотя не факт, что из него можно длину пакета получить).

Но в моей конкретной задаче это можно сделать более адекватно, без резервирования неизвестно чего и сколько...
И вот единственное, чего я хотел всем этим сказать - почти всегда чего-то можно придумать. Побудительный мотив - да ну его нафиг все эти релокации (особенно, если они сопровождаются "копированием" :) ), когда у тебя 1К на борту.
Конечно, это персональная заморочка.
Какой результат: у меня система собрана на 50-ти рублевых камнях, а буржуины для этого adsp (точно не помню, порядка 100$) используют.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Способы "копирования" массивов
СообщениеДобавлено: Четверг, 04 Март, 2010 16:55 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Алексей Елин писал(а):
И вам того же.
Так я возьму и посмотрю, упертый Вы наш :wink:
Джефри РИХТЕР "Создание эффективных WIN32-приложений", ЧАСТЬ III УПРАВЛЕНИЕ ПАМЯТЬЮ, ГЛАВА 13
Подраздел: "Как адресное пространство разбивается на разделы", 4-я строка, 2-й столбец в сводной таблице
Для кода и данных пользовательского режима: 0x00010000-0x7FFEFFFF

Утверждение: в этот диапазон 1 гиг влазит, а два - нет.
А Вы какими наскальными надписями руководствовались :?:


Алексей Елин писал(а):
А вы дальше, в ReallocMem смотрели?
Да.
А Вы попробовали добавлять "хвостики" к 100М-строке :?:
Впрочем, удобнее делать SetLength для динамических массивов.
Заодно сравнить с одноименной операцией в Mt - там-то сто пудовое копирование.


Алексей Елин писал(а):
Открываю вам глаза - меняется!
Ай молодец!
Теперь следующий шаг: как это стыкуется с Вашим же утверждением
Алексей Елин писал(а):
И просто ремепинг в средах со сборкой мусора (.Net, Java, CP) делать нельзя. Почему? Да потому что указатель после ремапинга будет другой. Дальше объяснять?
Продолжайте объяснения. Дальше


Алексей Елин писал(а):
А как они "докатились до такого "кошмара"" спросите у авторов
Зачем, я знаю ответ.
И именно зная его, и поднял вопрос порочности копирования.
По большому счету, это диспут о правильности идеи "изоляционизма"


Алексей Елин писал(а):
2. Он может быть в будущем переписан под другую платформу еще более оптимально, например с тем же ремапингом, если это возможно
Более оптимально это использование HeapReAlloc - только оси под силу т.н. ремэпинг. Вместе, раздельно, супер-пупер-хитромудро - десятый разговор. Хотя и не простой, парой простеньких идеек на ограничится.
Собственно, ровно это я и говорил.
И к чему все предыдущие заморочки - перестал понимать, в связи с этим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Четверг, 04 Март, 2010 21:17 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9127
Откуда: Россия, Орёл
Galkov писал(а):
Алексей Елин писал(а):
Откуда всплылО уменьшение? За какие уши притянуто? Речь шла о добавлении элемента
Блин, а нафига Вам лишь добавление элемента ???
Если у Вас только добавление, которое делается один раз - делайте статический массив максимального размера, и не парьте людям мозги, тем, что неким удвоением какое-то "все" решается.
Сам смысл динамического изменения размера - заключается в возможности освобождении ресурса, для использования его же в другом месте.


Кстати, есть любопытное наблюдение, что при некотором стиле построения некоторых алгоритмов, близком к функциональному, структуры данных меняются в сторону наполнения, затем используются, а затем освобождаются сразу целиком. Удаление нужно реже гораздо, чем разные вставки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Четверг, 04 Март, 2010 21:37 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8169
Откуда: Троицк, Москва
Илья Ермаков писал(а):
есть любопытное наблюдение, что при некотором стиле построения некоторых алгоритмов, близком к функциональному, структуры данных меняются в сторону наполнения, затем используются, а затем освобождаются сразу целиком. Удаление нужно реже гораздо, чем разные вставки.
Мой опыт это не подтверждает. В моей предметной области, конечно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Четверг, 04 Март, 2010 23:27 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Galkov писал(а):
И вот единственное, чего я хотел всем этим сказать - почти всегда чего-то можно придумать.

Согласен.
Хотел только добавить, что порой может найтись и 2-е, и 3-е решение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Пятница, 05 Март, 2010 00:28 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Valery Solovey писал(а):
Удобнее, чтобы контроллер памяти работал не со значениями адресов, а с переменными. Например, получить значение переменной prog1.var1 или записать значение в переменную prog4.var2[14]. Естественно, prog4.var2 должна иметь тип массив.

У меня есть смутное воспоминание, что архитектура с ассоциативной памятью рассматривалась в старой книге Г.Майерса "Архитектура современных ЭВМ".
Сходу трудно оценить возможные плюсы и минусы такого подхода. :roll:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Способы "копирования" массивов
СообщениеДобавлено: Пятница, 05 Март, 2010 01:24 

Зарегистрирован: Суббота, 28 Январь, 2006 00:10
Сообщения: 52
Откуда: г. Киров
Думал, думал и наконец осознал: идея дискриптор+смещение (см. мой пост выше) - полная чушь. Это не более чем эквивалент бОльшей адресации.
Даже 64 бит достаточно чтобы НАВСЕГДА забыть о нехватке памяти при увеличении... просто надо выделять каждый новый пойнтер по границе в максимальный размер непрерывного блока:

Например макс размер блока 4Г... и все!
Это будет эквивалентно 4Г(32бит) смещение + 4Г(32бит) дескриптор. (32+32=64)

Или макс блок 1Тб - 40 бит (смещение и макс. непрерывная область в 1Террабайт) +24 бит дескриптор (16 миллионов). (40+24=64).

Но возможнжо и другое соотношение.

А если адресация 128 бит... :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: аналог new ArrayList() (.NET)
СообщениеДобавлено: Пятница, 05 Март, 2010 09:21 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1198
Алексей Елин писал(а):
А вы дальше, в ReallocMem смотрели?


Да, если смотреть дальше, упираемся в RtlReAllocateHeap, которая сводится к
RtlAllocateHeap, memmove, RtlFreeHeap.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Способы "копирования" массивов
СообщениеДобавлено: Воскресенье, 07 Март, 2010 20:46 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Таким образом, управление памятью для размещения массива требует менеджера памяти - некой умной послойки для эффективного использования памяти.

А как обстоят дела с менеджером памяти в ББ?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB