【问题标题】:Performance loss with int and long overloadsint 和 long 重载的性能损失
【发布时间】:2018-07-23 16:17:20
【问题描述】:

问题:

当实体中的直接数据访问需要 0.4 秒时,为什么将列表从受保护的内部类传递给 API 方法,然后再传回我的 UI 需要 4 秒?是不是因为通过这些方法实际传递了列表?

背景:

我希望创建一个“API”层,它位于我使用实体框架的数据访问层和我的 UI 层之间。这个想法是限制对 CRUD 操作的访问并通过 API 强制执行所有操作,但是我注意到性能很糟糕。

当我在这里使用我的类结构时,这种情况下的 get 方法需要 4 秒 才能运行:

public class API
{
    DataAccessClass _dataAccess = new DataAccessClass();

    public List<Items> GetById(int id)
    {
        return _dataAccess.Get(id);
    }

    protected internal class DataAccessClass
    {
        protected internal List<Items> GET(int id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
        protected internal List<Items> GET(long id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
    }
}

但是,当我直接在代码中使用我的 dbcontext(我想阻止)时,它会在 .4 秒 内运行,使用上面受保护类中的相同代码:

using (var context = dbcontext)
{
     return context.GetItems();
}

编辑:

当我排除作为受保护内部部分的 API 的数据访问部分,并直接在 API 中运行 using 语句(只是删除受保护的内部部分)时,我得到了可接受的 0.4 秒。

【问题讨论】:

  • 这很难回答,除非我们能重现您所看到的。你的传球名单有多大?一般来说,虽然列表主要是通过引用传递的,所以它应该没关系。您的数据访问类是什么样的?
  • 上面列出了数据访问类...它是受保护的内部部分。除此之外,直接使用 entitycontext.object.tolist();数据集很小。平均4-6条记录。唯一不同的是我可以直接在 UI 中使用“数据访问”代码,问题就消失了。
  • 哦,好吧,没看到那门课,太奇怪了,protected internal classGetItem() 到底是什么?显然,4-6 条记录不应该花费 4 秒。但现在我无法重现你所看到的。
  • 我在“编辑”下更新了我的主帖,提供了更多详细信息。也许这有帮助。获取项等效于:EntityContext.ObjectName.ToList();由于代码在受保护的内部类之外运行良好,所以我没有详细说明,所以我认为它不相关。

标签: c# .net performance entity-framework entity


【解决方案1】:

为了解决我的性能问题,我从上面的 GET 类中删除了重载。

我在原始问题中的性能问题通过更改我的两个 get 方法(一个需要 int 和一个 long)的方法名称来解决。不知道为什么这些重载会导致问题,但通过删除重载并直接指定名称,我的性能问题得到了解决。

我的工人阶级看起来像:

public class API
{
    DataAccessClass _dataAccess = new DataAccessClass();

    public List<Items> GetById(int id)
    {
        return _dataAccess.Get(id);
    }

    protected internal class DataAccessClass
    {
        protected internal List<Items> GetByInt(int id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
        protected internal List<Items> GetByLong(long id)
        { 
            using (var context = dbcontext)
            {
                return context.GetItems();
            }
        }
    }
}

【讨论】:

  • 为什么你的方法GetByInt()GetByLong()(以及之前的重载)有一个id 参数?他们没有使用它。如果他们使用它,C# 会在许多地方应用数字类型之间的自动转换。也许您的性能问题与此有关?
  • 在生产中,我确实使用了 id,只是没有用于提供的示例。我假设此时它与此有关,因为一旦我从编译器中删除“猜测工作”,它就可以正常工作。
猜你喜欢
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2019-05-23
  • 2010-12-20
  • 1970-01-01
相关资源
最近更新 更多