gpt4 book ai didi

c# - 为什么 Validator.TryValidateObject 的速度呈指数级下降

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:15 25 4
gpt4 key购买 nike

我查询远程服务一次接收一批 100 件产品,并继续这样做,直到没有更多的批处理剩余。我将这 100 个产品重新映射到我自己的产品对象,我希望一次验证一个产品对象并将其保存到数据库中。如果有人不验证我记录错误并继续其余的。处理完前 100 个后,我去获取下一批 100 个。总共大约有 5000 个。

在分析我的网站后,我看到的问题是 Validator.TryValidateObject 的运行时间似乎呈指数级增长。第一批 1000 个用了 10 分钟,第二个 1000 个用了 20 分钟,第三个 1000 个用了 30 分钟。所以好像每次都要多花 10 分钟。

Product 类有一个伙伴类 ProductValidation,带有用于验证的适当数据注释。我调用 product.IsValid()。

    public class Product{
public bool IsValid()
{
return this.IsValid<Product, ProductValidation>();
}
}

使用以下代码:

    public static bool IsValid<T, U>(this T obj)
{
if (typeof(T) != typeof(U))
{
TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(T), typeof(U)), typeof(T));
}

var validationContext = new ValidationContext(obj, null, null);
var validationResults = new List<ValidationResult>();
//The line below slows everything down. If commented out all is fine
Validator.TryValidateObject(obj, validationContext, validationResults, true);

if (validationResults.Count > 0)
return false;
else
return true;
}

为什么上述情况会呈指数级下降?这就像验证器每次都在重新验证所有对象。

最佳答案

您描述的是二次运行时间,其中每单位工作的成本随完成的工作量线性增加。

我能看到的最可能的解释是 AddProviderTransparent扩展具有线性搜索时间的列表,因为它使用线性搜索,或者因为存在散列冲突和通过存储桶的线性搜索。

如果您为每个工作单元添加一个新提供者,并为每个单元处理整个提供者列表,那么您将获得二次运行时间。

不是在每次调用时都扩展提供者列表,而是仅当所需的提供者不在列表中时才这样做。你可以使用 HashSet<Pair<Type, Type>>记住什么T, U您已经添加的对。

关于c# - 为什么 Validator.TryValidateObject 的速度呈指数级下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26090528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com