System.text.json Generation Generation Calling Gettypeinfo чрезмерно, медленнее, чем Newtonsoft.json в Unity 6C#

Место общения программистов C#
Ответить
Anonymous
 System.text.json Generation Generation Calling Gettypeinfo чрезмерно, медленнее, чем Newtonsoft.json в Unity 6

Сообщение Anonymous »

Я перехожу из newtonsoft.json в System.text.json (STJ) в своем проекте Unity из -за его сообщенных преимуществ: более легкий след и лучшая производительность с помощью генерации источника, что должно дополнять компиляцию AOT IL2CPP. Тем не менее, я испытываю неожиданные проблемы с производительностью. Профилирование показывает, что класс Jsoneserializer тратит чрезмерное время, звоня Gettypeinfo для каждой собственности в моей схеме, созданной источником. Хотя фактическая десериализация быстрая (несколько миллисекунд) и использует одну треть распределения кучи по сравнению с Newtonsoft, общая производительность ухудшается: ~ 300 мс с STJ против ~ 200 мс с Newtonsoft.json.
мое понимание: источник должен исключить отражение в сценарии. Тот факт, что GetTypeInfo все еще называется сильно, что что-то не работает, как и ожидалось, как и ожидалось, с настройкой моей генерации источника. Это ожидаемое поведение, или это указывает на то, что мое поколение источника не настроена правильно? Какие шаги я должен предпринять для достижения обещанных пособий по производительности? Имейте в виду, что я должным образом инициализации класса источника и не переопределяю Jsonserializeroptions config

Код: Выделить всё

using System.Text.Json.Serialization;

[JsonSourceGenerationOptions(IncludeFields = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
[JsonSerializable(typeof(MainConcreteClass))]
[JsonSerializable(typeof(ConcreteClass2))]
[JsonSerializable(typeof(ConcreteClass3))]
internal partial class AppJsonContext : JsonSerializerContext { }

public class DataFetcher {

public void Fetch() {
HTTPRequest request = new HTTPRequest(
new Uri("https://localhost:5000/my_api"),
HeaderMethod("POST"), (req, res) => {
// Takes about 300ms
System.Text.Json.JsonSerializer.Deserialize(
response.Data, AppJsonContext.Default.MainConcreteClass);
});
}
}
Прикреплено изображение моего профилирования, вы можете заметить тяжелое призвание Gettypeinfo . Список можно продолжать и на


Подробнее здесь: https://stackoverflow.com/questions/797 ... lower-than
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»