Re[10]: Именованные туплы и более типизированные массивы
От: Аноним  
Дата: 09.03.11 09:19
Оценка:
Здравствуйте, VladD2, Вы писали:

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


_>>Вот, значит всё не так сложно. Завернуть TypeInfo реального типа в "strong type" TypeInfo я думаю смогу. Может сможешь подсказать, оптимальное место, где и на каком этапе выполнять разворачивание назад и подстановку реального типа, так чтобы ничего не сломать?


VD>Разворачивать надо при генерации IL-а или на стадиях T3-T4.


VD>Только не все так просто. Еще нужно синтаксис придумать, распарсить его, придумать формат описания этого типа в сборках, ну и реализовать запись и считывание его в/из сборок. Что касается сборок, то можно сделать так же как это сделано с алиасом (type-ом). Подвесить атрибут на интерфейс и потом его специальным образом интерпретировать.


Можно взять реализацию из F#, в его сборках есть такое, как то не форума писали, что добавят в нет5
Re[4]: Именованные туплы и более типизированные массивы
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.03.11 10:44
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>Вариант со своими объявлениями и массивов и типов я пробовал, но он не так удобен, несмотря даже на хищение идей из проекта Oyster'a. И получается какая-то ощутимая просадка при использовании индексаторов своего класса, по сравнению с работой с массивом напрямую. А хочется идеального решения навека, так чтобы и рыбку съесть и аквариум выпить


Очень странно, что обертка с индексатором дает сильный провал производительности. По идее там почти все должно инлайниться, так что оверхэд мог быть создан разве что неспособностью джита исключить лишние проверки выхода индексов за пределы массива.

Откровенно говоря я не вижу как сделать так чтобы можно было задавать типы для индексов массива. Все же это встроенный тип. Если ввести псевдонимы для типов индексов еще не сложно, то ввести пользовательские массивы с произвольным типом индекса уже не так тривиально.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Именованные туплы и более типизированные массивы
От: BogdanMart Украина  
Дата: 09.03.11 13:55
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Очень странно, что обертка с индексатором дает сильный провал производительности. По идее там почти все должно инлайниться, так что оверхэд мог быть создан разве что неспособностью джита исключить лишние проверки выхода индексов за пределы массива.


может быть тест проводился в отладочной версии кода под отладчиком. Если запускать релиз без отладчика, то оно ПО ИДЕИ должно инлайниться
Re[6]: Именованные туплы и более типизированные массивы
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.03.11 15:30
Оценка:
Здравствуйте, BogdanMart, Вы писали:

VD>>Очень странно, что обертка с индексатором дает сильный провал производительности. По идее там почти все должно инлайниться, так что оверхэд мог быть создан разве что неспособностью джита исключить лишние проверки выхода индексов за пределы массива.


BM>может быть тест проводился в отладочной версии кода под отладчиком. Если запускать релиз без отладчика, то оно ПО ИДЕИ должно инлайниться


Кто они? Как не инлайнь, но от оверхэда создаваемого проверками выхода индекса за пределы диапазона массива ты не избавишься. Дотнет знает только один очень примитивный паттерн — перебор элементов массива — в котором он умеет устранять эту проверку (выносить ее за пределы цикла). Если создать обертку, то ты сразу сделаешь эту оптимизацию невозможной.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Именованные туплы и более типизированные массивы
От: hi_octane Беларусь  
Дата: 09.03.11 20:10
Оценка:
А>Если не тайна, какими именно вычислениями занят?
Увы, проект и заказчик, под NDA Хоть и не слишком суровым (т.е. не оборонка какая), так что какие-то технологические вещи можно будет обсуждать, но только после релиза.
Re[6]: Именованные туплы и более типизированные массивы
От: Воронков Василий Россия  
Дата: 10.03.11 11:53
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Когда я спросил "То есть на выходе обычный не именованный кортеж" мне было сказано "На выход тоже именованные". В общем, я ничего не понимаю.


Это все равно не отменяет возможности разруливать такие вещи исключительно на этапе компиляции. Скажем, у тебя по-прежнему формируется кортеж, но со специальным атрибутом, через который задается соответствие индексов и полей. Для старых версий компилятора это будет просто кортеж и ничего более. Новая версия — определит, что это кортеж непростой, а с атрибутом, и на основе данных этого атрибута превратит при компиляции запись вида "foo.bar" в "foo[2]".

Впрочем, возникает подозрение, что это немало работы
Re[7]: Именованные туплы и более типизированные массивы
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.11 13:01
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Это все равно не отменяет возможности разруливать такие вещи исключительно на этапе компиляции. Скажем, у тебя по-прежнему формируется кортеж, но со специальным атрибутом, через который задается соответствие индексов и полей.


Атрибут нельзя повесить на объект (экземпляр типа). Мы можем повесить атрибут на метод возвращающий кортеж или на тип. Но если у нас есть тип, то не ясно зачем в нем что-то делать атрибутами.

Получается, что атрибут должен вешаться на метод. И выглядеть это должно как-то так. Предположим, что мы имеет засахареный код:
[return: RecordInfo("Id Name Birthday")]
SomeMethod(person : Record[Id : int, Name : string, Birthday : DateTime]) : Record[Id : int, Name : string, Birthday : DateTime]
{
  person
}

Тогда его рассахаренная версия будет выглядеть так:
[return: RecordInfo("Id Name Birthday")]
SomeMethod([RecordInfo("Id Name Birthday")] person : int * string * DateTime) : int * string * DateTime
{
  ...
}


А применение что-то вроде этого:
def person = SomeMethod(Record(Id=42, Name="Вася", Birthday=DateTime(1974, 4, 25)));

WriteLine($"Идентификатор: $(person.Id) Имя: $(person.Name) Дата рождения: $(person.Name)");

Это дело переписывается (рассахаривается) во что-то вроде (но с альфа-переименованием):
def (Id, Name, Birthday) = SomeMethod((42, "Вася", DateTime(1974, 4, 25)));

WriteLine($"Идентификатор: $Id Имя: $Name Дата рождения: $Name");


ВВ>Для старых версий компилятора это будет просто кортеж и ничего более. Новая версия — определит, что это кортеж непростой, а с атрибутом, и на основе данных этого атрибута превратит при компиляции запись вида "foo.bar" в "foo[2]".


Еще раз. Атрибут нельзя повесить на воздух.

ВВ>Впрочем, возникает подозрение, что это немало работы


Ага. Без хака компилятора это в Немерле 1.0 вообще вряд ли можно сделать.

И не очень много толку, если честно.

Разве что такое будет удобно при работе с линком. А так у нас уже есть анонимные типы в виде макроса.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Именованные туплы и более типизированные массивы
От: Воронков Василий Россия  
Дата: 10.03.11 13:17
Оценка:
Здравствуйте, VladD2, Вы писали:

ВВ>>Это все равно не отменяет возможности разруливать такие вещи исключительно на этапе компиляции. Скажем, у тебя по-прежнему формируется кортеж, но со специальным атрибутом, через который задается соответствие индексов и полей.

VD>Атрибут нельзя повесить на объект (экземпляр типа). Мы можем повесить атрибут на метод возвращающий кортеж или на тип. Но если у нас есть тип, то не ясно зачем в нем что-то делать атрибутами.

А для кортежей что, используется Tuple<>? Разве тип не генерится?
Re[9]: Именованные туплы и более типизированные массивы
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.11 14:09
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А для кортежей что, используется Tuple<>? Разве тип не генерится?


Что значит тип генерируется? Кортежи описываются набором дженерик-типов (т.е. Tuple<>, но Майкросовтовский из 4-го фрэймворка, а наш).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Именованные туплы и более типизированные массивы
От: BogdanMart Украина  
Дата: 10.03.11 14:39
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>>>Очень странно, что обертка с индексатором дает сильный провал производительности. По идее там почти все должно инлайниться, так что оверхэд мог быть создан разве что неспособностью джита исключить лишние проверки выхода индексов за пределы массива.


BM>>может быть тест проводился в отладочной версии кода под отладчиком. Если запускать релиз без отладчика, то оно ПО ИДЕИ должно инлайниться


VD>Кто они?


Индексаторы JITC'ом, о нем же речь шла.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.