我一直在读到使用上下文的“正确”方式如下:
using (var Db = new MyDatabase())
{
DoStuff(Db);
}
但我发现在某些情况下这种情况会非常缓慢
我有一个从不同的线程,通过Web请求被大量调用的函数,并且是只读的。
这是我的测试代码:
var S = new Stopwatch()
S.Start();
Parallel.For(
0,
15000,
I =>
{
var P = GetPostWebContent(I);
});
S.Stop();
Console.WriteLine(S.ElapsedMilliseconds);
使用“推荐”方法,15000个呼叫的执行时间为303.6秒,每个呼叫的执行时间为20.24毫秒。
现在,通过为每个线程保留一个上下文,我得到了非常不同的结果,使用以下代码:
[ThreadStatic]
private static MyDatabase _Db;
if (_Db == null) _Db = new DatabaseWebsite();
DoStuff(Db);
15000次呼叫的执行时间为52.4s,每次呼叫的执行时间为3.5ms。
这意味着此解决方案的速度提高了5.8倍!
我有点震惊:我一直在网上看到上下文创建并不是一件大事,等等;但就我而言,它产生了巨大的影响
我知道,通过这种实现,上下文的大小会不断增加,但我可以实现一个计数器并定期重新创建上下文。
有什么东西可以防止这种情况被使用吗?如上所述,所有操作都是READ ONLY,我没有在数据库中写任何内容。
答案 0 :(得分:0)
这只是一个建议。上下文不是线程安全的,因此如果性能对您很重要,那么每个线程一个是个好主意。
我倾向于围绕在同一个线程上运行的方法传递上下文,因为我发现了创建上下文时的性能问题。它为我制作了生产代码。