Здравствуйте, Sinclair, Вы писали:
S>Погодите. С этого места поподробнее. Что за ссылки, что за индексы? S>Забегая вперёд: какого типа будет результат операции span1 + span2 + span1, и какие значения будут иметь его поля?
span1 + span2 дадут tempSpan (неявный), в котором ссылки на 2 этих спана. Результирующий span = tempSpan + span1, в котором ссылки уже на tempSpan + span1. Индексы пока даже не нужны — это при более сложных операциях.
Здравствуйте, samius, Вы писали:
S>Кроме этого хотелось бы увидеть то, как это повлияет на операции чтения/записи, подразумевая что спан — это не один кусок памяти, а множество...
Можно сделать ReadOnlySpan для таких случаев, если смущает что запись в 1 ячейку приведет к изменению двух.
Здравствуйте, samius, Вы писали:
S>Кроме этого хотелось бы увидеть то, как это повлияет на операции чтения/записи, подразумевая что спан — это не один кусок памяти, а множество...
Это будет следующий вопрос. Как будет выглядеть цикл сканирования такого спана после джита
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Shmj, Вы писали:
S>span1 + span2 дадут tempSpan (неявный), в котором ссылки на 2 этих спана. Результирующий span = tempSpan + span1, в котором ссылки уже на tempSpan + span1. Индексы пока даже не нужны — это при более сложных операциях.
Что такое "ссылки на Span"? Боксинг ref struct запрещён.
Что значит "индексы не нужны"? Мы не можем произвольно отбрасывать и добавлять поля в struct типе.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Что такое "ссылки на Span"? Боксинг ref struct запрещён. S>Что значит "индексы не нужны"? Мы не можем произвольно отбрасывать и добавлять поля в struct типе.
Т.е. сами себе создали проблему — сделали struct, чтобы усложнить себе жизнь.
Здравствуйте, Shmj, Вы писали:
S>Т.е. сами себе создали проблему — сделали struct, чтобы усложнить себе жизнь. Нет конечно. У struct есть масса преимуществ — в частности, можно делать инлайнинг и многие другие оптимизации, которые невозможны для reference-типов.
Вы вместо того, чтобы ворчать, постарайтесь разобраться с тем, как (и зачем) устроены [ReadOnly]Span<T>. Это весьма поучительно.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
M>>Аргумент в стиле "на ассемблере тоже можно писать машин лернинг, только неудобно" S>Что мешает добавить удобства в C#? Это же языки одного уровня.
Отсутствие препятствий недосточное условие вносить измения.
И профит от того что вместо z=concat(x,y) можно будет писать z=x+y (и нельзя будет писать z=concat(x,y,predicate)) кажется сомнительным.
Здравствуйте, Shmj, Вы писали:
S>Можно сделать ReadOnlySpan для таких случаев, если смущает что запись в 1 ячейку приведет к изменению двух.
Нет. Смущает то, что вместо тривиального pointer[index]=x, что на интеле кодируется одной инструкцией mov, мы получаем
if(index < length1)
pointer1[index] = x
else
pointer2[index-length1] = x
Причём в отличие от проверок на границы, которые реализованы в настоящем Span, эту проверку выкинуть при джите будет невозможно.
Так как Span — структура, схитрить и разделить "одиночный" Span и "двойной" Span не получится.
То есть одиночный Span — это просто двойной Span, у которого pointer2 = length2 = 0.
При этом мы по-прежнему не можем склеить вместе три Span, т.к. возможности сослаться на Span нету.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Так как Span — структура, схитрить и разделить "одиночный" Span и "двойной" Span не получится. S>То есть одиночный Span — это просто двойной Span, у которого pointer2 = length2 = 0. S>При этом мы по-прежнему не можем склеить вместе три Span, т.к. возможности сослаться на Span нету.
Просто не нужно было делать структурой — делали бы классом как строку Очевидная ошибка проектирования, которая лишает многих возможностей расширения.
Здравствуйте, Sinclair, Вы писали: S>Причём в отличие от проверок на границы, которые реализованы в настоящем Span, эту проверку выкинуть при джите будет невозможно.
Здравствуйте, Shmj, Вы писали:
S>Так C# же тоже умеет в Machine Learning. В Python немного глянул как удобно с данными работать — круть.
Язык-то тут причем, питон например, если речь идет о соотв. библиотеках?
Плюс инф-ра в виде jupyter notebook'ов, когда люди разбирающие в математике, но не очень
разбирающиеся в программировании могут сравнительно легко решать свои проблемы -- обучать модели,
готовить данные и т.п. Минимум второстепенной писанины, а в C# сразу загрузят ООП и понятием класс
(метод Main надо же где-то написать). Т.е. питон когнитивно проще.
S>А так же часто не хватает при работе с бинарными данными.
Здравствуйте, Shmj, Вы писали: S>Просто не нужно было делать структурой — делали бы классом как строку Очевидная ошибка проектирования, которая лишает многих возможностей расширения.
Если бы Span делали классом, а метод this[int index] — виртуальным, то он бы работал примерно на порядок медленнее того, как он работает сейчас.
С учётом того, что он разрабатывался как раз для тех задач, где выжимают каждый так, такое решение как раз было бы ошибкой проектирования.
А вы судите с позиций невежества. Так делать не надо.
Если в ваших задачах производительность неважна, то вы можете сделать свой класс Rope<T> с нужными вам операциями. Реализация всего семейства классов заняла бы меньше времени, чем эта дискуссия.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Shmj, Вы писали:
S>Span должен уметь принимать на вход 2 Span. Не обязательно при этом копировать все в новый массив — просто хранить 2 ссылки и 4 индекса.
Здравствуйте, Shmj, Вы писали:
S>За бесплатно — просто демо-вариант. я бы порадовался, если бы существовал способ сделать ваш код существенно быстрее — хотя бы и за деньги. Но увы, не выйдет.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.