早期约束的(dis)优势是什么?

11 plugins dynamics-crm-2011

我正在研究CRM中早期和晚期绑定的优缺点.我对这个问题有了一个好主意,但有一点我不清楚.

  1. 有人说早期招架是最快的,其他的则是最快的.有什么显着差异吗?

  2. 如何处理自定义实体的早期绑定?

  3. 如何使用自定义字段处理默认实体的早期绑定?

有很多链接,但我抓到鼠标最有用的是那些.还有其他指针吗?

亲临
Pro早期

Dar*_*ryl 28

  1. 有人说早期的竞标是最快的,而其他的则是最晚的.有什么显着差异吗?

    一个.由于Early bound只是后期绑定实体类的包装器,并且包含其中的所有功能,因此它不能具有比后期绑定更快的运行时.但是,这种差异非常小,我与Eric Lippert在什么是最快的问题上有所区别.然而,速度的一个不可忽视的差异是发展的速度.早期绑定对于开发来说要快得多,而且更容易发生错误.

  2. 如何处理自定义实体的早期绑定?

    一个.该CrmSrvcUtil生成早期绑定类的自定义实体,酷似默认的(我创建了这个工具,使生成的类更简单. 更新:它后来移到了GitHub的 更新2现在是在XrmToolBox插件商店,搜索for "Early Bound Generator").每次对CRM实体进行更改时,都需要更新实体类型定义(仅当您要使用新属性或实体,或者您已删除当前使用的属性或实体时.您可以使用只要您没有设置实际不存在的任何属性的值,这与已经过时的早期绑定实体类是过时的,这与后期绑定的确切要求相同)

  3. 如何使用自定义字段处理默认实体的早期绑定?

    一个.见问题2的答案.

使用早期绑定实体时,其中一个小gottcha是需要启用早期绑定代理类型IOrganizationService.这很容易OrganizationServiceProxy,但可能需要一些插件,特别是自定义工作流程活动.

编辑1 - 我的测试

下面是我的代码,针对非常不活跃的本地开发环境进行测试.随意为自己测试

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;

}
Run Code Online (Sandbox Code Playgroud)

我的两个测试结果(请注意,运行两个测试在统计上并不具有统计学意义,无法得出任何类型的统计结论,但我认为它们对它的重要性并不是因为在某些开发收益方面存在大幅度的性能下降)针对本地开发环境,几乎没有其他活动来破坏测试.

Number Creates  |   Early (MS)  |   Late (MS)   |   % diff (from ticks)
10              |   1242        |   1106        |   12.3%
100             |   8035        |   7960        |   .1% 
Run Code Online (Sandbox Code Playgroud)

现在让我们插入数字并查看差异.12%似乎很多,但12%的是什么?实际差异为.136秒.假设你Contacts每分钟创造10个...... .136 x 60分钟/小时x 24小时/天= 195.84秒/天或每天约3秒.假设您花了3个开发人员小时试图找出哪个更快.为了使程序能够节省那么多时间,需要60天的24/7 10个联系/分钟处理,以便更快的代码"回报"它的3小时决策.

所以规则是,总是选择比首先更快的方法更易读/可维护的方法.如果性能不够快,那么看看其他可能性.但是,在100个中有98次,它确实不会以最终用户可检测到的方式影响性能.

过早的优化是所有邪恶的根源 - 唐纳德·克努斯


Jam*_*ood 16

  1. 可能不是.如果您想确切知道,我建议您运行一些测试并分析结果.

然而,这些MSDN文章建议更快地绑定它.

使用Microsoft Dynamics CRM进行开发的最佳实践

使用早期绑定类型

当代码必须处理编写代码时未知的实体和属性时,请使用Entity类.此外,如果您的自定义代码使用数千个实体记录,则使用Entity类会比早期绑定的实体类型产生稍好的性能.但是,这种灵活性有一个缺点,因为您无法在编译时验证实体和属性名称.如果您的实体已在代码时定义并且可以接受轻微的性能下降,则应使用可以使用CrmSvcUtil工具生成的早期绑定类型.有关更多信息,请参阅使用代码中的早期绑定实体类.

为Microsoft Dynamics CRM选择托管代码的开发样式

实体编程(早期绑定与后期绑定与开发人员扩展)

早期绑定...序列化成本随着实体在网络传输过程中转换为后期绑定类型而增加.

2&3.您不必对自定义字段或实体采取任何特殊操作.Svcutil将为两者生成类.

在代码中使用早期绑定实体类

代码生成工具创建的类包括所有实体的属性和关系.通过在代码中使用类,您可以访问这些属性并且类型安全.为组织中的所有实体创建具有属性和关系的类.系统和自定义实体的生成类型之间没有区别.

作为旁注,我不会太依赖它,它们都是可接受的实现方法,在大多数情况下,我怀疑性能影响是否足以让人担心.我个人更喜欢后期绑定,但这主要是因为我不喜欢生成类.


编辑.

我通过在CRM中创建一个200和5000的帐户来对此进行了一些快速分析.它确认了Microsoft提供的信息,在两次运行中,后期绑定速度提高了大约8.5秒.在非常短的时间内,后期绑定明显更快--90%.然而,早期绑定可以快速提高速度,到创建5000条记录时,后期绑定速度仅提高2%.

短期内

短期数据

长跑

长期数据

详细信息请点击此处.