powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Использование высокопроизводительных JSON-парсеров для http запросов
13 сообщений из 13, страница 1 из 1
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060333
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, столкнулся с невозможностью использования быстрых парсеров типа Utf8JsonReader или Utf8Json от neuecc ввиду того, что они могут вызываться только в синхронных методах, в то же время получение результата http-запроса в байтовом представлении возможно только через метод _httpClient.GetByteArrayAsync(), который не имеет синхронной версии. Использование в итераторах тоже невозможно.
Соответственно вопрос- можно ли каким- либо образом использования Utf8JsonReader или аналогов для парсинга JSON-документов, полученных через http-запросы?
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060552
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,

Никто и ничто не запрещает вызывать синхронные методы внутри асинхронных.

Запрос данных по сети - это IO-операция, поэтому она должна быть асинхронной. Поэтому у HttpClient асинхронные методы.

Парсинг json - это CPU-bound операция, поэтому она синхронная. Но вызвать-то её можно в любом методе. Опять же, можно обернуть её в Task.Run.
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060563
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060586
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прикольно если приложуха упирается в скорость парсинга..дай боже всем такие нагрузки
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060589
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvik,
единственная реализация, которая заведется это
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
        public async Task Method()
        {
            var gisMtClient = _httpClientFactory.CreateClient("client");
            var byteContent = await client.GetByteArrayAsync("url");
            var returnedList = UseUtf8JsonParser(byteContent);

            IEnumerable<string> UseUtf8JsonParser(byte[] bytes)
            {
                var list = new List<string>();

                var jsonReader = new Utf8JsonReader(bytes);

                while (jsonReader.Read())
                {
                    list.Add(string.Empty);
                }
                return list;
            }
        }



но в данном случае дополнительно получаем аллокацию в виде возвращаемого листа, что может срезать весь перфоманс от использования Utf8JsonReader, кроме того, если в методе есть Utf8JsonReader, то нельзя использовать yield return и асинхронный методы и
Код: c#
1.
ReadOnlySpan<byte> bytes = await gisMtClient.GetByteArrayAsync("url");


В общем приходится искать странные компромисные решения, которые не факт в итоге окажутся производительнее.
Такое ощущение, что Utf8JsonReader сделан исключительно для чтения в полностью синхронных потоках-типа файлов с диска, но не для асинхронных http-запросов.
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060593
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник


не подойдет, потому что Utf8JsonReader принимает в качестве источника данных только байтовый массив. С помощью стримов сделана текущая реализация, на больших объемах json и большом их количестве хотелось бы ускорить участок парсинга.
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060700
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,

если чтение производится по очень загруженному\узкому каналу связи, например с марсоходом :D, или с магнитной ленты, или с диска, но при условии, что значения в JSON файлы титанических размеров, то есть время чтения значения "ноды" будет занимать неразумное время, то это вполне имеет смысл
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060921
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,

вы ссылки открывали? на вход подаёте стрим, на выходе десериализованный объект, асинхронно.

какой ещё Utf8JsonReader?
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060936
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
ссылки открывал, на данный момент для десериализации использую вариант со стримом в качестве основного-с ним проблем нет по части выполнения функционала, однако очень много аллоцируется памяти для JsonDocument-я хотел бы исключить этот момент.

hVostt
vb_sub,
какой ещё Utf8JsonReader?

этот
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060941
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,

вы сырые данные хотите доставать или десериализовать в объекты?

аллокация памяти -- не всегда проблема, есть причина, по которой вы с боретесь с аллокацией?
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060945
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
да хочу читать сырые данные из Json-документа, считывать значения нужных нод.
Причина- хочу сделать максимально возможно качественный код по парсингу.
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40060958
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,

https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonTextReader.htm

поддерживает асинхронный интерфейс, работаете а JSON напрямую
...
Рейтинг: 0 / 0
Использование высокопроизводительных JSON-парсеров для http запросов
    #40061034
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NewtonsoftJson еще хорош.
Кому интересны бенчмарки милости прошу- результаты на любой вкус.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
	[Benchmark]
        public async Task JsonDocProcessingFromFilestream()
        {
            using (FileStream fsSource = new FileStream(@"largeResponse.json.json", FileMode.Open, FileAccess.Read))
            {
                using JsonDocument jDocument = await JsonDocument.ParseAsync(fsSource);

                var root = jDocument.RootElement;
                var uits = root.GetProperty("body").GetProperty("items").EnumerateArray();

                foreach (var item in uits)
                {
                    item.GetProperty("item").GetString();
                }
            }
        }

        [Benchmark]
        public async Task JsonDocProcessingFromStreamreader()
        {
            using (FileStream fsSource = new FileStream(@"largeResponse.json.json", FileMode.Open, FileAccess.Read))
            {
                using JsonDocument jDocument = await JsonDocument.ParseAsync(fsSource);

                var root = jDocument.RootElement;

                var uits = root.GetProperty("body").GetProperty("items").EnumerateArray();

                foreach (var item in uits)
                {
                    item.GetProperty("item").GetString();
                }
            }
        }

        [Benchmark]
        public void UtfProcessing_ReadOnlySpan()
        {
            ReadOnlySpan<byte> fileBytes = File.ReadAllBytes(@"largeResponse.json.json");

            var jsonReader = new System.Text.Json.Utf8JsonReader(fileBytes);

            string propertyName = string.Empty;

            while (jsonReader.Read())
            {
                if (jsonReader.TokenType == JsonTokenType.StartArray)
                {
                    while (jsonReader.Read() && jsonReader.TokenType != JsonTokenType.EndArray)
                    {
                        if (jsonReader.TokenType == JsonTokenType.PropertyName)
                            propertyName = jsonReader.GetString();

                        if (string.Equals(propertyName, "item") && jsonReader.TokenType == JsonTokenType.String)
                        {
                            jsonReader.GetString();
                        }
                    }
                    break;
                }
            }
        }

        [Benchmark]
        public void UtfProcessing_Bytes()
        {
            var fileBytes = File.ReadAllBytes(@"largeResponse.json.json");
            var jsonReader = new System.Text.Json.Utf8JsonReader(fileBytes);
            string propertyName = string.Empty;

            while (jsonReader.Read())
            {
                if (jsonReader.TokenType == JsonTokenType.StartArray)
                {
                    while (jsonReader.Read() && jsonReader.TokenType != JsonTokenType.EndArray)
                    {
                        if (jsonReader.TokenType == JsonTokenType.PropertyName)
                            propertyName = jsonReader.GetString();

                        if (string.Equals(propertyName, "item") && jsonReader.TokenType == JsonTokenType.String)
                        {
                            jsonReader.GetString();
                        }
                    }
                    break;
                }
            }
        }


        [Benchmark]
        /// <summary>
        /// Читаем данные с помощью NewTonSoftReader
        /// </summary>
        /// <returns></returns>
        public async Task NewTonSoftReaderAsync()
        {
            using (FileStream fsSource = new FileStream(@"largeResponse.json", FileMode.Open, FileAccess.Read))
            {
                using (StreamReader streamReader = new StreamReader(fsSource))
                {
                    using (JsonTextReader reader = new JsonTextReader(streamReader))
                    {
                        while (await reader.ReadAsync())
                        {
                            if (reader.TokenType == JsonToken.PropertyName)
                            {
                                if (reader.Value is string item && item.Equals("item"))
                                {
                                    reader.ReadAsString();
                                }
                            }
                            if (reader.TokenType == JsonToken.EndArray)
                                break;
                        }
                    }
                }
            }
        }


        [Benchmark]
        /// <summary>
        /// Читаем данные с помощью NewTonSoftReader
        /// </summary>
        /// <returns></returns>
        public async Task NewTonSoftReaderAwaitReadAsync()
        {
            using (FileStream fsSource = new FileStream(@"largeResponse.json", FileMode.Open, FileAccess.Read))
            {
                using (StreamReader streamReader = new StreamReader(fsSource))
                {
                    using (JsonTextReader reader = new JsonTextReader(streamReader))
                    {
                        while (await reader.ReadAsync())
                        {
                            if (reader.TokenType == JsonToken.PropertyName)
                            {
                                if (reader.Value is string item && item.Equals("item"))
                                {
                                    await reader.ReadAsStringAsync();
                                }
                            }
                            if (reader.TokenType == JsonToken.EndArray)
                                break;
                        }
                    }
                }
            }
        }




Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
|                            Method |     Mean |    Error |   StdDev |     Gen 0 |    Gen 1 |    Gen 2 | Allocated | Completed Work Items | Lock Contentions |
|---------------------------------- |---------:|---------:|---------:|----------:|---------:|---------:|----------:|---------------------:|-----------------:|
|   JsonDocProcessingFromFilestream | 50.71 ms | 0.193 ms | 0.181 ms |  700.0000 | 500.0000 | 500.0000 |   32.9 MB |               3.2000 |                - |
| JsonDocProcessingFromStreamreader | 50.59 ms | 0.296 ms | 0.277 ms |  700.0000 | 500.0000 | 500.0000 |   32.9 MB |               3.2000 |                - |
|        UtfProcessing_ReadOnlySpan | 23.04 ms | 0.100 ms | 0.089 ms | 1937.5000 | 968.7500 | 968.7500 |   19.2 MB |               0.0625 |                - |
|               UtfProcessing_Bytes | 23.00 ms | 0.149 ms | 0.125 ms | 1937.5000 | 968.7500 | 968.7500 |   19.2 MB |               0.0625 |                - |
|             NewTonSoftReaderAsync | 76.83 ms | 1.449 ms | 2.032 ms | 2285.7143 |        - |        - |   9.15 MB |            2638.1429 |                - |
|    NewTonSoftReaderAwaitReadAsync | 92.52 ms | 0.566 ms | 0.529 ms | 2833.3333 |        - |        - |  11.75 MB |            3958.3333 |                - |
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Использование высокопроизводительных JSON-парсеров для http запросов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]