C# 嵌套使用语句会影响性能
有人知道如何从一个数据库表中检索值并将其与另一个数据库表进行比较吗?如果上述代码是正确的,那么它会导致性能问题吗?您似乎不知道。实际上,它只是一个try-finally块,在finally中调用C# 嵌套使用语句会影响性能,c#,performance,linq,ado.net,using,C#,Performance,Linq,Ado.net,Using,有人知道如何从一个数据库表中检索值并将其与另一个数据库表进行比较吗?如果上述代码是正确的,那么它会导致性能问题吗?您似乎不知道。实际上,它只是一个try-finally块,在finally中调用Dispose。因此,您的代码被转换为以下内容: using (var db1 = new DataBase1Entities()) { using (var db2 = new DataBase2Entities()) {
Dispose
。因此,您的代码被转换为以下内容:
using (var db1 = new DataBase1Entities())
{
using (var db2 = new DataBase2Entities())
{
var list = (from obj in db2.Table1
where !db1.Table2.Any(i => i.Table2Col == obj.Table1Col)
select obj).ToList();
}
}
因此,对性能可能有影响或没有影响的不是使用,而是处置。但是,您根本不应该为此烦恼,因为您必须调用Dispose
。不这样做是一个非常糟糕的主意——特别是如果因为任何性能问题而这样做的话Dispose
将释放任何非托管资源,例如文件处理程序。如果你不调用它,那么根本就没有办法释放那些可能会产生内存泄漏的资源。你似乎不知道。实际上,它只是一个try-finally块,在finally中调用Dispose
。因此,您的代码被转换为以下内容:
using (var db1 = new DataBase1Entities())
{
using (var db2 = new DataBase2Entities())
{
var list = (from obj in db2.Table1
where !db1.Table2.Any(i => i.Table2Col == obj.Table1Col)
select obj).ToList();
}
}
因此,对性能可能有影响或没有影响的不是使用,而是处置。但是,您根本不应该为此烦恼,因为您必须调用Dispose
。不这样做是一个非常糟糕的主意——特别是如果因为任何性能问题而这样做的话Dispose
将释放任何非托管资源,例如文件处理程序。如果您不调用它,那么根本无法释放那些可能会产生内存泄漏的资源。如果您愿意,您当然可以删除嵌套。类似于(未经测试):
HashSet-bob;
使用(var db1=newdatabase1entities())
{
bob=newhashset(db1.Table2.Select(z=>z.Table2Col);
}
使用(var db2=newdatabase2entities())
{
var list=(来自db2.Table1中的obj)
其中!bob.Contains(对象表1Col)
选择obj).ToList();
}
您需要对它进行分析,以检查它是否更快。如果有速度方面的好处,很大程度上可能是由于使用了哈希集而不是使用删除嵌套。如果愿意,您当然可以删除嵌套。例如(未测试):
HashSet-bob;
使用(var db1=newdatabase1entities())
{
bob=newhashset(db1.Table2.Select(z=>z.Table2Col);
}
使用(var db2=newdatabase2entities())
{
var list=(来自db2.Table1中的obj)
其中!bob.Contains(对象表1Col)
选择obj).ToList();
}
您需要对其进行分析,以检查它是否更快。如果有速度方面的好处,很大程度上可能是由于使用了哈希集
,而不是删除了嵌套的using。嵌套的using
是使用多个IDisposable
的常见模式。它不是using
而是资源分配/freeing影响性能;另一个消耗资源的过程是中的代码,使用-“代码从db1检索数据并将其与db2进行比较”“影响性能”相对于什么?显然,执行代码需要时间。这里的问题是什么?“影响性能”相对于基于上下文的什么
,可能与不使用嵌套使用相比。即,在第一个之外使用第二个使用
。什么类型是db1
?或者:这是哪种ORM?对于其他:。嵌套使用
是使用多个IDisposable
的常见模式。它不是使用
,而是资源影响性能的分配/释放;另一个消耗资源的过程是中的代码,使用-“代码从db1检索数据并将其与db2进行比较”“影响性能”相对于什么?显然,拥有代码需要时间来执行。这里的问题是什么?“影响性能”与基于上下文的内容相关,可能与不使用嵌套使用相比。即,在第一个之外使用第二个的。什么类型的db1
?或者:这是哪种ORM?对于其余的:。我不知道,但是我+1。两者都不知道,但是因为我也+1。如果您检查null
de应该是DataBase1Entities db1=null;尝试{db1=newdatabase1entities();…}最后{if(db1!=null)db1.Dispose()};
。局部变量(db1
,db2
)不是用null
初始化的,这就是为什么if(db1!=null)
在当前的应用程序中不存在code@DmitryBychenko你是对的。正确地纠正了。我没有投反对票,但我也不认为由于原因不明的反对票,人们应该投反对票。试着理解反对票。比如:这可能是一个很好的解释,但它不能回答问题如果你检查null
代码应该是DataBase1Entities db1=null;试试{db1=newdatabase1entities();…}最后{if(db1!=null)db1.Dispose()};
局部变量(db1
,db2
)未使用null
初始化,这就是为什么if(db1!=null)
在当前的应用程序中不存在code@DmitryBychenko你是对的。正确地纠正了。我没有投反对票,但我也不认为因为原因不明的反对票,人们应该投赞成票。试着理解反对票。比如:这可能是一个很好的解释,但它不能回答问题。
HashSet<YourType> bob;
using (var db1 = new DataBase1Entities())
{
bob = new HashSet<YourType>(db1.Table2.Select(z => z.Table2Col);
}
using (var db2 = new DataBase2Entities())
{
var list = (from obj in db2.Table1
where !bob.Contains(obj.Table1Col)
select obj).ToList();
}