我正在研究CRM中早期和晚期绑定的优缺点。我对这个问题有了一个好主意,但有些观点我不清楚。
答案 0 :(得分:28)
有人说早期的招架是最快的,而其他的则是最晚的。有什么重大差异吗?
一个。由于Early bound只是后期绑定实体类的包装器,并且包含其中的所有功能,因此它不能具有比后期绑定更快的运行时。但是,这种差异非常小,我与Eric Lippert in the What's Fastest type of questions不同。然而,速度的一个不可忽视的差异是发展的速度。早期限制对于开发来说要快得多,而且更容易发生错误恕我直言。
如何处理自定义实体的早期绑定?
一个。自定义实体的CrmSrvcUtil generates the early bound classes,与默认实体完全相同(我创建了this tool,以便更轻松地生成类。更新:它已移至{{3} } 更新2 现在位于XrmToolBox插件存储区中,搜索"Early Bound Generator"
)。每次对CRM实体进行更改时,都需要更新实体类型定义(仅当您要使用新属性或实体,或者您已删除当前使用的属性或实体时。您可以使用只要您没有设置实际不存在的任何属性的值,这与过时绑定的确切要求相同,那么早期绑定的实体类已经过时了。
如何使用自定义字段处理默认实体的早期绑定?
一个。请参阅问题2的答案。
使用早期绑定实体时,其中一个小gottcha是需要在IOrganizationService
中启用早期绑定代理类型。对于OrganizationServiceProxy
来说这很容易,但是可能需要更多步骤才能完成插件,尤其是自定义工作流活动。
以下是我的代码,针对非常不活跃的本地开发环境进行测试。随意为自己测试
using (var service = TestBase.GetOrganizationServiceProxy())
{
var earlyWatch = new Stopwatch();
var lateWatch = new Stopwatch();
for (int i = 0; i < 100; i++)
{
earlyWatch.Start();
var e = new Contact() { FirstName = "Early", LastName = "BoundTest"
e.Id = service.Create(e);
earlyWatch.Stop();
lateWatch.Start();
var l = new Entity();
l.LogicalName = "contact";
l["firstname"] = "Late";
l["lastname"] = "BoundTest";
l.Id = service.Create(l);
lateWatch.Stop();
service.Delete(e);
service.Delete(l);
}
var earlyTime = earlyWatch.ElapsedMilliseconds;
var lateTime = lateWatch.ElapsedMilliseconds;
var percent = earlyWatch.ElapsedTicks / (double)lateWatch.ElapsedTicks;
}
我的两个测试结果(请注意,运行两个测试在统计上并不具有统计学意义,无法得出任何统计结论,但我认为它们对它的影响不大,并不是因为一些性能下降而无法证明某些开发收益的合理性)在本地开发环境中运行,几乎没有其他活动来破坏测试。
Number Creates | Early (MS) | Late (MS) | % diff (from ticks)
10 | 1242 | 1106 | 12.3%
100 | 8035 | 7960 | .1%
现在让我们插入数字并查看差异。 12%似乎很多,但12%的是什么?实际差异为.136秒。假设您每分钟创建10 Contacts
... .136 x 60分钟/小时x 24小时/天= 195.84秒/天或每天约3秒。假设您花了3个开发人员小时试图找出哪个更快。为了使程序能够节省那么多时间,需要60天的24/7 10个联系/分钟处理,以便更快的代码“回报”它的3小时决策。
所以规则是,总是选择比首先更快的方法更易读/可维护的方法。如果性能不够快,那么看看其他可能性。但是,在100分中有98次,它确实不会以最终用户可检测到的方式影响性能。
过早优化是所有邪恶的根源 - DonaldKnuth
答案 1 :(得分:16)
然而,这些MSDN文章建议将其更快地绑定。
Best Practices for Developing with Microsoft Dynamics CRM
使用早期绑定类型
当代码必须处理实体时,请使用Entity类 编写代码时未知的属性。的在 此外,如果您的自定义代码使用数千个实体记录, 使用Entity类会导致性能稍好一些 早期实体类型。然而,这种灵活性有一个 缺点是因为您无法验证实体和属性名称 编译时间。 如果您的实体已在代码时定义 轻微的性能下降是可以接受的,您应该使用可以使用CrmSvcUtil生成的早期绑定类型 工具。有关更多信息,请参阅使用早期绑定实体类 代码。
Choose your Development Style for Managed Code for Microsoft Dynamics CRM
实体编程(早期绑定与后期绑定与开发人员 扩展)
早期限制......序列化成本随着实体的增加而增加 在通过网络传输时转换为后期绑定类型。
2&amp; 3.您不必对自定义字段或实体执行任何特殊操作。 Svcutil将为两者生成类。
Use the Early Bound Entity Classes in Code
代码生成工具创建的类包括所有 实体的属性和关系。通过使用你的课程 代码,您可以访问这些属性并且类型安全。一堂课 为您的所有实体创建属性和关系 组织。 生成的类型之间没有区别 系统和自定义实体。
作为旁注,我不会太依赖它,它们都是可接受的实施方法,在大多数情况下,我怀疑性能影响是否足以让人担心。我个人更喜欢后期绑定,但这主要是因为我不喜欢生成类。
修改强>
我通过在CRM中创建一个200和200的帐户,对此进行了一些快速分析。 5000.它确认了微软提供的信息,在两次运行中,后期绑定速度提高了约8.5秒。在非常短的时间内,后期绑定明显更快--90%。然而,早期绑定可以快速提高速度,到创建5000条记录时,后期绑定速度仅提高2%。