Я хочу проверить объекты json в JArray с помощью схемы. Мой тестовый массив содержит> 100000 объектов. Во время анализа времени я выяснил, что для проверки последнего объекта по сравнению с первым объектом в массиве требуется много раз (> 500x).Проблема с синхронизацией при проверке схемы с помощью JSchema
Вот часть моего тестового кода:
...
string schemaShapeObjectStr = @"{ 'type':'object',
'$schema': 'http://json-schema.org/draft-03/schema',
'required':false,
'properties':{
'MyShapeObject': {
'type':'object', 'id': 'MyShapeObject', 'required':true,
'properties':{
'id': {'type':'string', 'id': 'id', 'maxLength': 6,'required':true},
'XY': {'type': 'array','minItems': 2,'maxItems': 2,'uniqueItems': false,'required':true,
'items': {'type': 'number','multipleOf': 0.001,'minimum': -10000,'maximum': 10000},
'additionalItems': false
}
}, 'additionalProperties':false
}
}
}";
...
JSchema schemaMoveOverTo = JSchema.Parse(schemaMoveOverToStr);
JArray shapeArray = (JArray)shapes["shape"];
Int32 counter = 0;
JObject itemFast = (JObject)shapeArray.First();
JObject itemSlow = (JObject)shapeArray.Last();
sw1.Reset();
sw1.Start();
foreach (JObject item in shapeArray.Children<JObject>())
{
if (item.Properties().First().Name == "MyShapeObject")
{
counter++;
stopwatch2.Reset();
stopwatch2.Start();
valid = itemFast.IsValid(schemaShapeObject, out messages);
stopwatch2.Stop();
calcTimeFast += stopwatch2.Elapsed;
stopwatch2.Reset();
stopwatch2.Start();
valid = itemSlow.IsValid(schemaShapeObject, out messages);
stopwatch2.Stop();
calcTimeSlow += stopwatch2.Elapsed;
}
}
sw1.Stop();
meassureString = string.Format("loopThru Time = {0}, ShapeObject = {1}", sw1.Elapsed, counter);
OutPutWindow.AppendText(meassureString + Environment.NewLine);
meassureString = string.Format("Fast Time = {0}, Fast Mean = {1}, Slow Time = {2}, Slow Mean = {3}", calcTimeFast.TotalMilliseconds, (calcTimeFast.TotalMilliseconds/counter), calcTimeSlow.TotalMilliseconds, (calcTimeSlow.TotalMilliseconds/counter));
OutPutWindow.AppendText(meassureString + Environment.NewLine);
...
я получил этот выход:
loopThru Time = 00:06:36.1059322, ShapeObject = 89857
Fast Time = 628.6673, Fast Mean = 0.0069963085, Slow Time = 394959.2331, Slow Mean = 4.3954197569
Для моего теста первый и последний объект равны!
В другом тесте я выяснил, что схема проверки времени возрастает непрерывно позиции в массиве ...
Может кто-нибудь объяснить мне это странное поведение. Честно говоря, я разработчик C++ и новый в C#. На мой взгляд, два объекта JObject (itemFast, itemSlow) равны и не зависят от того, откуда они взялись !?
Что-то не так с моим кодом?
Это всего лишь тест. Когда я использую каждый объект JObject из массива, измеренное время увеличивается с первого до последнего. Поэтому я изменил его, чтобы узнать, увеличивается ли он по счету или по положению в массиве. И ответ кажется, что это зависит от позиции в массиве. Вот ссылка [Link] (http://stvkriessern.owncube.com/index.php/s/42lsLb5ut6qbP9g) на консольный проект. –
JObject itemSlow = (JObject) shapeArray.Last(). DeepClone(); // Временная работа. Это устраняет проблему производительности. Пока не знаю, почему. –
Хорошо, я обнаружил проблему с производительностью, связанную с проверкой элемента в массиве JSON со многими элементами, и это вызывает вашу проблему. Вызов DeepClone в JObject перед его проверкой решает проблему. В библиотеке будет исправлено, но он не будет выпущен около месяца. –