使用JSchema进行模式验证的时序问题

时间:2016-03-14 16:13:27

标签: c# json.net jsonschema

我想使用模式验证JArray中的json对象。我的测试数组包含> 100000个对象。在时序分析期间,我发现与Array中的第一个对象相比,验证最后一个对象需要花费很多倍(> 500x)。

这是我测试代码的一部分:

$("#shipwreck").on('click', function() {
    var billing_org = $('#billing_org').val();
    var control_test = "Control Test";

    if ($('#shipwreck').prop('checked')) {
        $("#shipping_org").val(billing_org);
        $("#control_test").val(control_test);
    } else {
        $("#shipping_org").val("Not Checked");
        $("#control_test").val("Not Checked");
    }
});

我得到了这个输出:

      ...
      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);
    ...

对于我的测试,第一个和最后一个对象是相等的!

在我发现的另一个测试中,模式验证时间与数组中的位置持续增加...

有谁能解释我这种奇怪的行为。说实话,我是C ++开发人员,也是C#的新人。在我看来,两个JObject的(itemFast,itemSlow)是相同的,并且它们来自哪里!?

我的代码有问题吗?

1 个答案:

答案 0 :(得分:0)

为什么要从shapeArray.Children<JObject>()循环结果然后从不使用它?

itemFast和itemSlow是否是相同的JSON?这可能解释了差异。如果没有,那么上传一个带有repo的控制台项目,我会看看它。