StackExchange.Exceptional Get All Errors is too slow

本文关键字:is too slow Errors All Exceptional Get StackExchange | 更新日期: 2023-09-27 18:00:29

我正在尝试使用StackExchange中的ErrorStore快速加载最近的异常。C#中的异常。

有没有什么方法可以在不必加载和排序所有异常的情况下获取最近日期以来的所有异常?如何加速我的代码?

我当前的代码获得了最近的100个异常,但速度非常慢。

string[] applications = new[] {loc1, loc2};
var errors = new List<Error>();
applications.ForEach(app => ErrorStore.Default.GetAll(errors, app));
return errors.OrderByDescending(m => m.CreationDate).Take(100);

这是ErrorStore的文档。

StackExchange.Exceptional Get All Errors is too slow

您的代码可能很慢,因为您的第三行代码

applications.ForEach(app => ErrorStore.Default.GetAll(errors, app));

这是ErrorStore.GetAll

public int GetAll(List<Error> errors, string applicationName = null)
{
    if (_isInRetry)
    {
        errors.AddRange(WriteQueue);
        return errors.Count;
    }
    try { return GetAllErrors(errors, applicationName); }
    catch (Exception ex) { BeginRetry(ex); }
    return 0;
}

这里是GetAllErrors 的一个实现

protected override int GetAllErrors(List<Error> errors, string applicationName = null)
{
    using (var c = GetConnection())
    {
        errors.AddRange(c.Query<Error>(@"
Select Top (@max) * 
From Exceptions 
Where DeletionDate Is Null
And ApplicationName = @ApplicationName
Order By CreationDate Desc", new { max = _displayCount, ApplicationName = applicationName.IsNullOrEmptyReturn(ApplicationName) }));
    }
    return errors.Count;
}

GetAllErrors中的sql查询将选择所有异常,而不仅仅是前100个。假设每个应用程序总共有n个异常,并且有两个应用程序。因此,您的第三行代码必须在f(n) = 2n时间内运行。

为了加快程序的速度,您可以编写一个类似于GetAllErrors的方法,但修改sql查询以从错误数据库中只选择100个异常,因此即使有10亿个异常,代码也会在找到前100个匹配的异常后完成。

您还可以将搜索所有应用程序名称的代码移动到sql中,这样您就不需要再次按创建日期排序。