- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们的代码中有一个通用的更新方法,它执行一个
foreach (var entity in entityList)
{
Context.GetIDbSet<T>().Attach(entity);
Context.SetState(entity, EntityState.Modified);
}
我正在通过传入实体枚举并为每个实体调用一次来对此进行测试。
我发现运行 1000 个实体的枚举大约需要 47 秒。这是预期的行为吗?还是代码片段有问题?
分析显示 Attach() 方法比 SetState() 方法慢。
我对其进行的测试是在一个具有 50 个属性的实体上进行的,如果有任何影响,则没有任何关系。
最佳答案
我可以确认这种缓慢的行为,我也找到了主要原因。我用以下模型做了一些测试......
public class MyClass
{
public int Id { get; set; }
public string P1 { get; set; }
// ... properties P2 to P49, all of type string
public string P50 { get; set; }
}
public class MyContext : DbContext
{
public DbSet<MyClass> MyClassSet { get; set; }
}
...和这个测试程序...
using (var context = new MyContext())
{
var list = new List<MyClass>();
for (int i = 0; i < 1000; i++)
{
var m = new MyClass()
{
Id = i+1,
P1 = "Some text ....................................",
// ... initialize P2 to P49, all with the same text
P50 = "Some text ...................................."
}
list.Add(m);
}
Stopwatch watch = new Stopwatch();
watch.Start();
foreach (var entity in list)
{
context.Set<MyClass>().Attach(entity);
context.Entry(entity).State = System.Data.EntityState.Modified;
}
watch.Stop();
long time = watch.ElapsedMilliseconds;
}
测试 1
就是上面的代码:
--> 时间 = 29.2 秒
测试 2
注释掉这一行...
//context.Entry(entity).State = System.Data.EntityState.Modified;
--> 时间 = 15.3 秒
测试 3
注释掉这一行...
//context.Set<MyClass>().Attach(entity);
--> 时间 = 57.3 秒
这个结果很奇怪,因为我预计调用 Attach
是不必要的,因为改变状态无论如何都会附加。
测试 4
去掉属性P6到P50(这样我们实体中只有5个字符串),原代码:
--> 时间 = 3.4 秒
所以,是的,显然属性的数量非常重要。
测试 5
在循环之前添加以下行(使用所有 50 个属性再次建模):
context.Configuration.AutoDetectChangesEnabled = false;
--> 时间 = 1.4 秒
测试 6
再次使用 AutoDetectChangesEnabled = false
但只有 5 个属性:
--> 时间 = 1.3 秒
因此,如果没有更改跟踪,属性的数量就不再那么重要了。
结论
到目前为止,大部分时间似乎都花在了更改跟踪机制拍摄附加对象属性的快照上。如果您不需要它,请禁用代码片段的更改跟踪。 (我想在你的代码中你真的不需要更改跟踪,因为通过将实体的状态设置为 Modified
你基本上将 all 属性标记为已更改。所以 all 列在更新语句中发送到数据库。)
编辑
以上测试时间为Debug模式。但 Release 模式没有太大区别(例如:测试 1 = 28.7 秒,测试 5 = 0.9 秒)。
关于c# - 是什么导致 .Attach() 在 EF4 中变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5917478/
我已经在谷歌上搜索这个问题一段时间了,但我还没有找到有效的解决方案。 问题是 SSH 登录到我的服务器突然变得很慢。我可以看到身份验证需要大约 10 秒才能继续,这是我的 ssh 详细日志: Open
我正在使用 AVPlayer 在我的项目中播放在线视频。视频播放良好。现在我想减少/增加视频的 fps。以下是我正在使用的代码: self.asset = [AVAsset assetWithURL:
在 Raspberry Pi 上运行两个使用 python gpio 引脚的程序时,一个变慢。一种是磁传感器,另一种是温湿度传感器。后者是放慢速度的。它不是每 2 秒打印一次温度,而是每 5 到 10
我从 Redis 向我的应用程序提供一个 json,然后我对其进行解码和循环。 这是我从 Redis 提供的 json 的样子: [ { "titel": "test 1",
Ejabberd 版本:19.9.0 在发送 OMEMO 消息时(使用 websockets),例如
我们有相当大的代码库(150 多个项目、400000 多行 Java 代码、一些 Groovy 和 Gradle 代码、一些 Perl 代码、一些 XML、大量 JSP 等)。我设法在 Spring
我在一个网站上工作,您可以在其中创建 svg 艺术品,这意味着您可以动态添加元素、缩放、颜色并移动它们。 问题是,当你开始在他们身上施加阴影时,一切都会开始变慢。对于这个的现场演示,this是我正在开
有没有办法分析 Vim 插件? 当我打开一个大的 .py 时,我的 MacVim 变得越来越慢。我知道我可以取消选择所有插件并逐一重新选择以检查哪个插件是罪魁祸首,但是有没有更快的方法? 我的 dot
我正在构建一个JavaFX应用程序。我知道它使用反射,并且反射可能不如我在代码中构建 UI 时那么快。 所以, 如何设计我的 Controller 以使由反射引起的开销尽可能小? 带/不带 @FXML
我对 UITableViewCell 进行了子类化显示从 1 到 70 的数字。 在每个单元格中,我都在检查中奖号码并检查他们的背景。问题是,经过几次滚动后,tableview 变得非常缓慢,甚至无法
如果我想group_by 和filter 那些在数据集中有任何NA 或factor 值的,我想在 dplyr 中使用 any 函数,但发现它对 NAs 或 factor 运行缓慢(但不是为了寻找任何数
我有一个问题。在我的解决方案中,我需要将数千个数据插入数据库。我正在使用批处理准备语句在一个请求中插入多行。在我调用插入几次之后, hibernate 变得更慢了。 我猜它会在我提交后检查数据库是否有
我从 json url 获取数据,但是当我想加载图像时,速度非常慢! class NewsTableViewController: UITableViewController { var id
我有一个相当简单的托管 Realm 对象 RealmAlertItem由一些字符串和 float 组成。我有一个函数 showAlertNotification()随后被调用(从网络外部触发)并且它依
请参阅下面的表格结构。 CREATE TABLE `oarc` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `zID` int(11) NOT N
IntelliJ 慢得像爬行。键之间没有 1-2 个延迟几乎无法打字。我已经更新了堆大小。我在我的 Macbook Pro 上运行大约 2GB RAM。自从它一直在放缓。我已经增加了堆大小,但无济于事
我的 Web 应用程序遇到了性能问题。发现瓶颈是db。应用程序在具有 4 个 CPU 和 2GB RAM 的 LAMP 服务器 (VPS) 上运行。 将新记录插入数据库(包含大约 100.000 条记
我有关于自定义 DispatchQueue 的问题。 我创建了一个队列,并将其用作captureOutput:方法的队列。这是一个代码片段: //At the file header private
我是一名移动 QA。现在我们有一个关于网络响应和 UI 渲染之间的竞争条件的问题。我们猜测如果 UI 渲染比网络响应慢,那么它就会崩溃。 我们已经尝试通过使用 Charles 的本地 map 功能来加
我在 firefox 中遇到了一些奇怪的行为,我正在构建一个单页作品集,作为一名平面设计师,编码一直很困难。我想平滑地控制导航,然后向所有元素添加缩放(最初设计为 1920x1080 全屏)。讲师扔了
我是一名优秀的程序员,十分优秀!