我想使用模式验证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)是相同的,并且它们来自哪里!?
我的代码有问题吗?
答案 0 :(得分:0)
为什么要从shapeArray.Children<JObject>()
循环结果然后从不使用它?
itemFast和itemSlow是否是相同的JSON?这可能解释了差异。如果没有,那么上传一个带有repo的控制台项目,我会看看它。