Информация об изменениях

Сообщение Re[37]: Java vs C# vs C++ от 09.10.2015 21:06

Изменено 09.10.2015 21:10 Evgeny.Panasyuk

Здравствуйте, ·, Вы писали:

dot>>>ну например List<MyObj>

EP>>1. На GC всё равно будет висеть граф множества объектов, пусть и меньшего размера.
dot>Ничего, и не такое жевал.

Так в off-heap тогда смысла мало

EP>>2. Теперь на этих ссылках будут висеть финализаторы, так? Для того чтобы знать когда очищать off-heap. То есть теперь ко всему прочему ещё и освобождение будет линейным.

dot>Можно и финализаторы, а можно и явно реализовать delete, как в плюсах. Какое освобождение сделаешь, такое и будет.

В итоге получаем и линейный обход живых, и линейных обход мёртвых, да ещё и второй аллокатор/деаллокатор (кстати какой?)
Круто — чё

EP>>3. Лишние индерекции внутри List никуда не делись.

dot>List будет с большим числом элементов, иначе смысла извращаться нет. А на фоне этого большого числа данных один индирект не будет заметен в микроскоп.

Это один индерект на каждый элемент, а не просто один индерект. Разница может быть на порядки

EP>>>>И кто и как создаст эти newMyObj?

dot>>>Программист напишет. Притом можно описывать, скажем, интерфейсы, а их имплементации генерить при запуске.
EP>>"в общем-то и вся разница по факту." — да?
EP>>Придётся расписывать/генерировать не только пользовательские классы, но и воплощения всех контейнеров/алгоритмов в которых они участвую — иначе тормоза.
EP>>Покажи какую-нибудь библиотеку/утилиту которая берёт всё это на себя.
dot>Берёт что? Код-то тривиальный.

Берёт описание структур и генерирует все необходимые комбинации класс-контейнер/алгоритм.

dot>Вместо

dot>
dot>class BusinessData
dot>{
dot>  private int a;
dot>  private int b;
dot>  int getA() {return a}
dot>  int getB() {return b}
dot>}
dot>


Тут вообще достаточно:
struct BusinessData
{
    int a, b;
};

Зачем get/set?

dot>пишем


Та самая ручная нарезка на структуры:

dot>
dot>class BusinessData
dot>{
dot>  private Buffer buf;//замаплен например сразу на приходящий из сети блок байт или offheap хранилище или ещё чего.
dot>  private int pos;
dot>  int getA() {return buf.getInt(pos)}
dot>  int getB() {return buf.getInt(pos+4)}
dot>}
dot>


Так это же не спасает от тех же лишних индерекций которые есть в List<BusinessData>
Re[37]: Java vs C# vs C++
Здравствуйте, ·, Вы писали:

dot>>>ну например List<MyObj>

EP>>1. На GC всё равно будет висеть граф множества объектов, пусть и меньшего размера.
dot>Ничего, и не такое жевал.

Так в off-heap тогда смысла мало

EP>>2. Теперь на этих ссылках будут висеть финализаторы, так? Для того чтобы знать когда очищать off-heap. То есть теперь ко всему прочему ещё и освобождение будет линейным.

dot>Можно и финализаторы, а можно и явно реализовать delete, как в плюсах. Какое освобождение сделаешь, такое и будет.

В итоге получаем и линейный обход живых, и линейных обход мёртвых, да ещё и второй аллокатор/деаллокатор (кстати какой?), и в довесок ещё расстрел памяти.
Круто — чё

EP>>3. Лишние индерекции внутри List никуда не делись.

dot>List будет с большим числом элементов, иначе смысла извращаться нет. А на фоне этого большого числа данных один индирект не будет заметен в микроскоп.

Это один индерект на каждый элемент, а не просто один индерект. Разница может быть на порядки

EP>>>>И кто и как создаст эти newMyObj?

dot>>>Программист напишет. Притом можно описывать, скажем, интерфейсы, а их имплементации генерить при запуске.
EP>>"в общем-то и вся разница по факту." — да?
EP>>Придётся расписывать/генерировать не только пользовательские классы, но и воплощения всех контейнеров/алгоритмов в которых они участвую — иначе тормоза.
EP>>Покажи какую-нибудь библиотеку/утилиту которая берёт всё это на себя.
dot>Берёт что? Код-то тривиальный.

Берёт описание структур и генерирует все необходимые комбинации класс-контейнер/алгоритм.

dot>Вместо

dot>
dot>class BusinessData
dot>{
dot>  private int a;
dot>  private int b;
dot>  int getA() {return a}
dot>  int getB() {return b}
dot>}
dot>


Тут вообще достаточно:
struct BusinessData
{
    int a, b;
};

Зачем get/set?

dot>пишем


Та самая ручная нарезка на структуры:

dot>
dot>class BusinessData
dot>{
dot>  private Buffer buf;//замаплен например сразу на приходящий из сети блок байт или offheap хранилище или ещё чего.
dot>  private int pos;
dot>  int getA() {return buf.getInt(pos)}
dot>  int getB() {return buf.getInt(pos+4)}
dot>}
dot>


Так это же не спасает от тех же лишних индерекций которые есть в List<BusinessData>