Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, Serginio1, Вы писали: S>> members чем является? P>В C# нет такого типа. S>> Не всегда. Еще раз пример массива. P>Не еще раз, а хотя бы один пример. S>> Ты можешь не десериализовать его полностью или через тот же IEnumerable считывая по одному элементу. P>Массив просто нельзя десериализовать. Это не последовательность символов. Массив можно только сериализовать. И только затем полученное (это уже не массив) десериализовать.
Ладно все понятно. Для информации напомню, что сейчас модно использовать Protocol Buffers
По сути являющейся базой данных. Объект может быть размазан по нескольким таблицам. Ты можешь получать объект из базы данных полность, или с отложенной загрузкой.
Опять же ты не считываешь все записи, а используя индекс считываешь нужный объект или можешь получать объекты порциями.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали: S> Зависит от размера. Если размер небольшой по пофиг массив или лист. А вот если размер большой, а хранить тебе массив не нужно то S>IEnumerable самое то.
IEnumerable это интерфейс коллекции. Нет коллекции — нет IEnumerable. Т.е. коллекция все равно хранится. Только доступ к ней происходит медленнее. Мне критично быстродействие. Т.е. все же или List или массив, если перед этим не создается List и затем ToArray(). И был попутный вопрос про кортеж: что быстрее в доступе и создании: кортеж или массив? С одно стороны массив, т.к. не надо создавать структуру, а с другой стороны ссылочный тип нагружает сборщик мусора. В общем-то вопрос универсален: для возврата из метода нескольких однотипных чисел, что производительнее: массив или кортеж? Вопрос не касается удобства пользования, а только производительности.
Здравствуйте, Passerby, Вы писали:
S>> Зависит от размера. Если размер небольшой по пофиг массив или лист. А вот если размер большой, а хранить тебе массив не нужно то S>>IEnumerable самое то. P>IEnumerable это интерфейс коллекции. Нет коллекции — нет IEnumerable. Т.е. коллекция все равно хранится.
IEnumerable<int> GetNumbers()
{
for (int i = 0; i < 10; i++)
{
yield return i;
}
}
Если содержимое строки десериализуется в список, то не выгоднее ли по времени делать десериализацию в массив (не проверял, может, можно и в кортеж)? Или, наоборот, т.к., возможно, будет сначала сериализация в список, а потом ToArray()? Или все-таки сначала идет подсчет количества элементов и создается массив с равным Length и затем массив заполняется? Примерно такой же вопрос по выбору класса, или структуры, кортежа, или массива, если есть несколько чисел: https://json2csharp.com/ предлагает создавать класс. Если создавать массив или структуру, то не будут ли они созданы после создания класса? Вероятно, разные обработчики Json работают по разному, но все-таки кто как десериализует?
конечно выгодней массив. т.к. список удваивает кажется емкость при исчерпании.
как парсится список тут сложно сказать, в xml помню было четкое разделение Dom (полностью грузит и потом парсит) и потоковые, очень быстрые отдающие элементы по мере парсинга потока.
посмотрите исходики парсера на гите.
Здравствуйте, Serginio1, Вы писали: S>Лучше десериализовывать в IEnumerable c использованием yield
А чем лучше? Быстрее происходит десериализация? И в дальнейшем, разве обход IEnumerable быстрее обхода массива?
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, Serginio1, Вы писали: S>>Лучше десериализовывать в IEnumerable c использованием yield P>А чем лучше? Быстрее происходит десериализация? И в дальнейшем, разве обход IEnumerable быстрее обхода массива?
Зависит от размера. Если размер небольшой по пофиг массив или лист. А вот если размер большой, а хранить тебе массив не нужно то
IEnumerable самое то.
Енумератор предпочтительнее ибо ты сам можешь организовать где и как хранить. Хоть в БД.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, Serginio1, Вы писали: S>> Зависит от размера. Если размер небольшой по пофиг массив или лист. А вот если размер большой, а хранить тебе массив не нужно то S>>IEnumerable самое то. P>IEnumerable это интерфейс коллекции. Нет коллекции — нет IEnumerable. Т.е. коллекция все равно хранится. Только доступ к ней происходит медленнее. Мне критично быстродействие. Т.е. все же или List или массив, если перед этим не создается List и затем ToArray(). И был попутный вопрос про кортеж: что быстрее в доступе и создании: кортеж или массив? С одно стороны массив, т.к. не надо создавать структуру, а с другой стороны ссылочный тип нагружает сборщик мусора. В общем-то вопрос универсален: для возврата из метода нескольких однотипных чисел, что производительнее: массив или кортеж? Вопрос не касается удобства пользования, а только производительности.
Нет IEnumerable это System.Collections.Generic.IEnumerator<out T> GetEnumerator () и главное в нем MoveNext() и Current
Десериализуя список по частям ты как раз и реализуешь MoveNext() и Current, которые по времени будут значительно меньше чем затраты на десериализацию.
Ну System.ValueTuple это структура понятно, что она выгоднее
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали: S> Нет IEnumerable это System.Collections.Generic.IEnumerator<out T> GetEnumerator () и главное в нем MoveNext() и Current
А что нет? IEnumerable это интерфейс. А System.Collections.Generic.IEnumerator<out T> GetEnumerator () это реализация интерфейса. S>Десериализуя список
Десериализуется не список, а строка. Список это и есть коллекция, которая создается из строки при ее десериализации. Строка все равно должна десериализоваться в какую-нибудь коллекция, а потом уже к этой коллекции можно применять IEnumerable. К строке же IEnumerable не применить. S>Ну System.ValueTuple это структура понятно, что она выгоднее
Это если сначала не создается список, а из него делается кортеж. А не сразу кортеж.
Здравствуйте, Passerby, Вы писали:
P>Если содержимое строки десериализуется в список
Все таки уточните о чем речь? у вас простой список через запятую в виде строки и вы его парсите или что?
А вообще, проще всего оценить скорость работы алгоритма при помощи банального теста.
прогоните его на 10, 100 , 1000... и постройте кривую t(n) и посмотрите какой вариант лучше. по памяти можно тоже не на бумажке а тестом оценить, ну замерять конечно чуть сложнее, возможно есть либы.
нет смысла гадать.
Здравствуйте, varenikAA, Вы писали: AA>Все таки уточните о чем речь? у вас простой список через запятую в виде строки и вы его парсите или что?
Десериализация, о которой идет речь, это и есть парсинг строки.
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, Serginio1, Вы писали: S>> Нет IEnumerable это System.Collections.Generic.IEnumerator<out T> GetEnumerator () и главное в нем MoveNext() и Current P>А что нет? IEnumerable это интерфейс. А System.Collections.Generic.IEnumerator<out T> GetEnumerator () это реализация интерфейса. S>>Десериализуя список P>Десериализуется не список, а строка. Список это и есть коллекция, которая создается из строки при ее десериализации. Строка все равно должна десериализоваться в какую-нибудь коллекция, а потом уже к этой коллекции можно применять IEnumerable. К строке же IEnumerable не применить. S>>Ну System.ValueTuple это структура понятно, что она выгоднее P>Это если сначала не создается список, а из него делается кортеж. А не сразу кортеж.
Именно десериализуя список и десериализвав строку при вызове MoveNext и записывая в Current текущее значение у тебя в итоге никакого списка нет.
Нонял прошу прощения. Ты говоришь об объекте как списке полей?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали: S> Именно десериализуя список
Что такое десериализация списка? S>Нонял прошу прощения. Ты говоришь об объекте как списке полей?
Я говорю о десериализации. Десериализации строки. Бывают другие десериализации?
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, Serginio1, Вы писали: S>> Именно десериализуя список P>Что такое десериализация списка?
в xml и json есть списки и массивы и они специально оформляются.
Считывать и десериализовывать можно по одному элементу
S>>Нонял прошу прощения. Ты говоришь об объекте как списке полей? P>Я говорю о десериализации. Десериализации строки. Бывают другие десериализации?
Да бывают разные объекты. Содержащие миллионы записей итд.
Можно десериализовывать сразу, либо отложенно, часть хранить в памяти а часть на диске зная только позицию
Вариантов куча, в зависимости от алгоритма получения данных
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> в xml и json есть списки и массивы и они специально оформляются.
Приведи пример json не со строкой, а со списком. Или имеешь в виду объект JObject? Это самый медленный вариант, когда строка десериализуется в JObject, а потом в нем еще раз производится поиск нужных строк.
P>>Я говорю о десериализации. Десериализации строки. Бывают другие десериализации? S> Да бывают разные объекты. Содержащие миллионы записей итд. S> Можно десериализовывать сразу, либо отложенно, часть хранить в памяти а часть на диске зная только позицию S>Вариантов куча, в зависимости от алгоритма получения данных
Ничего не понял. С сервера приходят данные в виде строки, которая десериализуется. Как может сервер передать данные в виде объекта?
Сериализация это преобразование объекта в последовательность символов. Десериализация — это преобразование последовательности символов в объект. Но что такое десериализация объекта??
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, Serginio1, Вы писали:
S>> в xml и json есть списки и массивы и они специально оформляются. P>Приведи пример json не со строкой, а со списком. Или имеешь в виду объект JObject? Это самый медленный вариант, когда строка десериализуется в JObject, а потом в нем еще раз производится поиск нужных строк. https://developer.mozilla.org/ru/docs/Learn/JavaScript/Objects/JSON
members 'nj vfccbd
P>>>Я говорю о десериализации. Десериализации строки. Бывают другие десериализации? S>> Да бывают разные объекты. Содержащие миллионы записей итд. S>> Можно десериализовывать сразу, либо отложенно, часть хранить в памяти а часть на диске зная только позицию S>>Вариантов куча, в зависимости от алгоритма получения данных P>Ничего не понял. С сервера приходят данные в виде строки, которая десериализуется. Как может сервер передать данные в виде объекта? P>Сериализация это преобразование объекта в последовательность символов. Десериализация — это преобразование последовательности символов в объект. Но что такое десериализация объекта??
Необязательно это база данных. Это например обмен с другой базой в виде xml или json которые могут достигать десятки гигабайт
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали: P>>Приведи пример json не со строкой, а со списком. Или имеешь в виду объект JObject? Это самый медленный вариант, когда строка десериализуется в JObject, а потом в нем еще раз производится поиск нужных строк. S> https://developer.mozilla.org/ru/docs/Learn/JavaScript/Objects/JSON S>members 'nj vfccbd
По ссылке: "JSON — текстовый формат данных, следующий за синтаксисом объекта JavaScript, который был популяризирован Дугласом Крокфордом"
Приведи пример json не со строкой, а со списком.
P>>Сериализация это преобразование объекта в последовательность символов. Десериализация — это преобразование последовательности символов в объект. Но что такое десериализация объекта?? S>Необязательно это база данных. Это например обмен с другой базой в виде xml или json которые могут достигать десятки гигабайт
По ссылке "Преобразование строки в родной объект называется десериализацией (преобразование из последовательной формы в параллельную), в то время как преобразовании родного объекта в строку, таким образом ,чтобы он мог быть передан через сеть, называется сериализацией(преобразование в последовательную форму)."
Что такое десериализация объекта?
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, Serginio1, Вы писали: P>>>Приведи пример json не со строкой, а со списком. Или имеешь в виду объект JObject? Это самый медленный вариант, когда строка десериализуется в JObject, а потом в нем еще раз производится поиск нужных строк. S>> https://developer.mozilla.org/ru/docs/Learn/JavaScript/Objects/JSON S>>members 'nj vfccbd P>По ссылке: P>"JSON — текстовый формат данных, следующий за синтаксисом объекта JavaScript, который был популяризирован Дугласом Крокфордом" P>Приведи пример json не со строкой, а со списком.
members чем является?
P>>>Сериализация это преобразование объекта в последовательность символов. Десериализация — это преобразование последовательности символов в объект. Но что такое десериализация объекта?? S>>Необязательно это база данных. Это например обмен с другой базой в виде xml или json которые могут достигать десятки гигабайт P>По ссылке "Преобразование строки в родной объект называется десериализацией (преобразование из последовательной формы в параллельную), в то время как преобразовании родного объекта в строку, таким образом ,чтобы он мог быть передан через сеть, называется сериализацией(преобразование в последовательную форму)." P>Что такое десериализация объекта?
Не всегда. Еще раз пример массива. Ты можешь не десериализовать его полностью или через тот же IEnumerable считывая по одному элементу.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали: S> members чем является?
В C# нет такого типа. S> Не всегда. Еще раз пример массива.
Не еще раз, а хотя бы один пример. S> Ты можешь не десериализовать его полностью или через тот же IEnumerable считывая по одному элементу.
Массив просто нельзя десериализовать. Это не последовательность символов. Массив можно только сериализовать. И только затем полученное (это уже не массив) десериализовать.
Здравствуйте, Passerby, Вы писали:
P>По ссылке "Преобразование строки в родной объект называется десериализацией (преобразование из последовательной формы в параллельную), в то время как преобразовании родного объекта в строку, таким образом ,чтобы он мог быть передан через сеть, называется сериализацией(преобразование в последовательную форму)." P>Что такое десериализация объекта?
Преобразование строки в родной объект называется десериализацией объекта из строки, а обратное действие ― сериализация объекта в строку.
Сериализуют что-то во что-то ― объект в xml/json/...
Десериализуют что-то из чего-то — объект из xml/json/...
Объект ― всегда прямое дополнение к глаголу, а хранилище — косвенное.
Здравствуйте, Passerby, Вы писали:
A>>Коллекции нет, а IEnumerable есть. P>Коллекция есть. Интерфейс коллекции.
Интерфейс — это абстракция. Коллекции нет.
using System;
using System.Collections.Generic;
using System.Threading;
foreach (var value in Generate())
{
Console.WriteLine(value);
}
IEnumerable<int> Generate()
{
while (true)
{
Thread.Sleep(1000);
yield return DateTime.Now.Second;
}
}
Здравствуйте, alexzzzz, Вы писали: A>Перебирается конечно, но просто в цикле, без создания промежуточных коллекций. В этом и смысл.
Если без промежуточной коллекции, то для каждой итерации по-новому разбирается строка (предыдущий разбор нигде в промежуточной коллекции не сохранен).
Здравствуйте, Passerby, Вы писали: A>>Перебирается конечно, но просто в цикле, без создания промежуточных коллекций. В этом и смысл. P>Если без промежуточной коллекции, то для каждой итерации по-новому разбирается строка (предыдущий разбор нигде в промежуточной коллекции не сохранен).
Нет. В этом примере, чтобы напечатать на экране очередное значение, для каждой итерации перезапуск часов с нуля не происходит
Скрытый текст
using System;
using System.Collections.Generic;
using System.Threading;
foreach (var value in Generate())
{
Console.WriteLine(value);
}
IEnumerable<int> Generate()
{
while (true)
{
Thread.Sleep(1000);
yield return DateTime.Now.Second;
}
}
Тут тоже
Скрытый текст
using System;
using System.Collections.Generic;
foreach (var value in Parse(",,,1 20, 300; 4004++"))
{
Console.WriteLine(value);
}
IEnumerable<int> Parse(string input)
{
var index = 0;
while (true)
{
while (index < input.Length && char.IsDigit(input[index]) == false)
{
index++;
}
if (index >= input.Length)
{
yield break;
}
var count = 1;
while (index + count < input.Length && char.IsDigit(input[index + count]))
{
count++;
}
yield return int.Parse(input[index..(index + count)]);
index += count + 1;
}
}
Здравствуйте, alexzzzz, Вы писали:
В этих примерах вывод в консоль, так же сработает и для другого однократного получения результата. А если результат нужен, чтобы его программа несколько раз запрашивала, то десериализация строки в только либо в коллекцию и IEnumerable будет лишним, либо каждый раз вызывать парсить строку через IEnumerable, что еще хуже. Т.е. только два варианта, когда IEnumerable имеет смысл применять при десериализации: 1. Результат нужен только один раз в одном месте программы, 2. Строка очень большая и List не помещается в память или очень много памяти занимает.
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, alexzzzz, Вы писали: P>В этих примерах вывод в консоль, так же сработает и для другого однократного получения результата. А если результат нужен, чтобы его программа несколько раз запрашивала, то десериализация строки в только либо в коллекцию и IEnumerable будет лишним, либо каждый раз вызывать парсить строку через IEnumerable, что еще хуже. Т.е. только два варианта, когда IEnumerable имеет смысл применять при десериализации: 1. Результат нужен только один раз в одном месте программы, 2. Строка очень большая и List не помещается в память или очень много памяти занимает.
Общие затраты будут практически те же. Ну на MoveNext и Current миллиард вызовов в секунду. Дольше уходит на парсинг строк.
Можешь закачать куда угодно если заранее известно количество то конечно массив
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали: S> Общие затраты будут практически те же. Ну на MoveNext и Current миллиард вызовов в секунду. Дольше уходит на парсинг строк.
Так если не сделать сразу коллекцию, то каждый раз когда программе нужны будут данные с IEnumerable будет запускаться новый парсинг (если десериализатор не делает предварительно коллекцию и не кеширует ее). И даже если данные нужны только один раз, какой смысл в IEnumarable, если можно сразу в коллекцию? Только если строка длиннющая или может статься, что не все данные нужны, а только несколько первых, тогда IEnumarable. S>Можешь закачать куда угодно если заранее известно количество то конечно массив
Как информация о количестве может повлиять на скорость десериализации? Вместо List объявляется массив, в который десериализуется строка. После десериализации можно посмотреть Length. Скорость зависит от того как реализована десериализация в массив: сразу подсчитывается количество элементов и объявляется массив или сначала десериализуется в список, а потом ToArray(). Хотя и в случае десериализации сразу в массив не факт, что это будет быстрее, т.к. подсчет элементов это лишняя операция, а в случае списка просто добавляется следующий элемент, пока не кончится строка.
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, Serginio1, Вы писали: S>> Общие затраты будут практически те же. Ну на MoveNext и Current миллиард вызовов в секунду. Дольше уходит на парсинг строк. P>Так если не сделать сразу коллекцию, то каждый раз когда программе нужны будут данные с IEnumerable будет запускаться новый парсинг (если десериализатор не делает предварительно коллекцию и не кеширует ее). И даже если данные нужны только один раз, какой смысл в IEnumarable, если можно сразу в коллекцию? Только если строка длиннющая или может статься, что не все данные нужны, а только несколько первых, тогда IEnumarable. S>>Можешь закачать куда угодно если заранее известно количество то конечно массив P>Как информация о количестве может повлиять на скорость десериализации? Вместо List объявляется массив, в который десериализуется строка. После десериализации можно посмотреть Length. Скорость зависит от того как реализована десериализация в массив: сразу подсчитывается количество элементов и объявляется массив или сначала десериализуется в список, а потом ToArray(). Хотя и в случае десериализации сразу в массив не факт, что это будет быстрее, т.к. подсчет элементов это лишняя операция, а в случае списка просто добавляется следующий элемент, пока не кончится строка.
Ну всегда можешь сделать ToList или ToArray. Но если тебе нужен отбор по записям то память экономится. IEnumerable универсален.
и солнце б утром не вставало, когда бы не было меня