非常欢迎任何有关此问题的线索。
我使用EF4并需要循环大量记录,因此性能是首要任务。
因此我将查找表放在静态内存(List(表实体))中以便更快地访问。
但是我发现如果我使用了一个连接的Linq表达式来填充我的静态List,那么调用静态数据的速度要慢于我刚刚在List中输入未经过滤的整个表。
请考虑以下示例:
private static List<MMoptions> _testJOINED;
private static List<MMoptions> _testALONE;
protected void Button1_Click(object sender, EventArgs e)
{
_testJOINED = new List<MMoptions>();
_testALONE = new List<MMoptions>();
using (var context = new LBEntities())
{
_testJOINED = (from opt in context.MMoptions
join ctr in context.MMcontrols on opt.opControlID equals ctr.ctrID
join mod in context.MMmodel on ctr.ctrModelID equals mod.mID
where mod.mActive == true
select opt).ToList();
_testALONE = context.MMoptions.ToList();
}
Stopwatch st = new Stopwatch();
st.Restart();
for (int i = 0; i < 10000; i++)
{
var opt = _testALONE.Where(f => f.opParent == "RANGE_BU" && f.opSelectValue == "RANGE4").FirstOrDefault();
}
st.Stop();
Response.Write("testALONE:" + st.ElapsedMilliseconds.ToString());
st.Restart();
for (int i = 0; i < 10000; i++)
{
var opt = _testJOINED.Where(f => f.opParent == "RANGE_BU" && f.opSelectValue == "RANGE4").FirstOrDefault();
}
st.Stop();
Response.Write("testJOINED:" + st.ElapsedMilliseconds.ToString());
}
testJoined(10000records)在1400ms执行
testAlone(17000记录)执行时间为6ms
我不明白,在som点上,加入的数据是否作为自重继承到我的列表中?
此致
标记
更新。
我注意到如果省略第二次连接(对MMmodel),性能是相同的。 EF模型显示3个表之间的正确关系。
答案 0 :(得分:0)
差异是由于只有在调用_testJOINED
函数时才会填充_testJOINED.Where
这一事实。这称为延期执行,您可以在同一标题下的MSDN上找到有关此内容的更多详细信息。
您应该分别测量两个集合的数量,并且您会看到_testJOINED
会立即填充,而_testALONE
需要一些时间。