2016-03-14 2 views
2

Я хочу проверить объекты 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) равны и не зависят от того, откуда они взялись !?

Что-то не так с моим кодом?

ответ

0

Почему вы зацикливаете результат от shapeArray.Children<JObject>(), а затем никогда не используете его?

Признаки itemFast и itemSlow тот же JSON? Это может объяснить разницу. Если нет, тогда загрузите проект консоли с репо где-нибудь, я посмотрю на него.

+0

Это всего лишь тест. Когда я использую каждый объект JObject из массива, измеренное время увеличивается с первого до последнего. Поэтому я изменил его, чтобы узнать, увеличивается ли он по счету или по положению в массиве. И ответ кажется, что это зависит от позиции в массиве. Вот ссылка [Link] (http://stvkriessern.owncube.com/index.php/s/42lsLb5ut6qbP9g) на консольный проект. –

+0

JObject itemSlow = (JObject) shapeArray.Last(). DeepClone(); // Временная работа. Это устраняет проблему производительности. Пока не знаю, почему. –

+0

Хорошо, я обнаружил проблему с производительностью, связанную с проверкой элемента в массиве JSON со многими элементами, и это вызывает вашу проблему. Вызов DeepClone в JObject перед его проверкой решает проблему. В библиотеке будет исправлено, но он не будет выпущен около месяца. –

Смежные вопросы