65.9K
CodeProject 正在变化。 阅读更多。
Home

测量 COM+ 性能

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.53/5 (7投票s)

2016 年 5 月 28 日

CPOL

9分钟阅读

viewsIcon

12778

downloadIcon

142

测量 COM+ 性能。

引言

COM+ 在不同 Microsoft Windows 版本上的性能表现不同。例如,Windows Server 2012 上的 COM+ 性能比 Windows Server 2003 上的差。此工具有助于测量 COM+ 性能。

背景

在许多应用程序中,业务逻辑和数据访问层运行在 COM+ 组件中。因此,这些组件的性能至关重要,因为它们会显著影响应用程序的整体性能。COM+ 和 .NET 在大多数 Windows 版本上都可用,因此迁移 COM+ 应用程序无需更改代码。理想情况下,性能在不同 Windows 版本之间也应该保持一致,但事实并非如此。

此工具会生成多个线程,每个线程通过调用一个非事务性 COM+ 组件从数据库读取一条记录,然后通过调用一个事务性 COM+ 组件将该记录写回数据库。性能设置是通过执行此过程一定次数(例如 1000 次)所需的时间来衡量的。此工具还提供了不使用 COM+ 的测试,以及读写文件的测试。

Using the Code

项目 ComPlusPerf

提供了 Visual Studio 2010 项目 ComPlusPerf.vbproj,其中包含以下项:

  • ComPlusPerf.snk:包含用于签名程序集的强名称。注册到 COM+ 的程序集必须进行强签名。
  • Form1:用于配置和运行测试的用户界面
  • ModSettings:用于读取和写入用户设置的模块
  • SQLDataAccessComPlusR:用于读写数据库的非事务性 COM+ 组件
  • SQLDataAccessComPlusU:用于写数据库的事务性 COM+ 组件
  • SQLDataAccessNormal:用于读写数据库的类,非 COM+

编译和注册

  • 在 Visual Studio 2010 中打开 ComPlusPerf.vbproj。较新版本的 Visual Studio 也应该可以正常工作。
  • 生成项目。这将创建一个目标平台为 AnyCPU 的程序集,这意味着它既可以在 32 位机器上注册,也可以在 64 位机器上注册。
  • 对于 32 位机器,双击 RegisterComPlusPerf.bat 即可在 COM+ 中注册该程序集。
  • 对于 64 位机器,请在 RegisterComPlusPerf.bat 的第一行将 "Framework" 更改为 "Framework64"。
  • 开始/运行 comexp.msc 中执行,应会显示 COM+ 资源管理器,您可以在其中查看 ComPlusPerf 组件是否已安装。
  • 根据安全设置,您可能需要设置 COM+ 组件的标识(右键单击 ComPlusPerf 组件,选择“属性/选项卡标识”)。错误消息:“COM+ 无法与 Microsoft 分布式事务协调器通信”表明必须设置正确的标识。

窗体描述

双击 bin/ComPlusPerf.exe。将出现以下窗体:

Form1

  • 窗体顶部的 列表框 包含可运行的不同测试。每次迭代都会执行选中的测试。提供的测试如下:
    • DbNormalAdd:使用普通组件(非 COM+)向数据库的 Table1 添加一条记录。Table1 有 94 个字段。第 56 个字段是 varchar(max) 类型,包含 4000 个字符。
    • DbNormalUpdate:从属性网格的 "表名" 字段中指定的表中读取一条记录,将属性网格的 "列名" 字段中指定的列更新为当前日期和时间,然后使用普通组件(非 COM+)将记录写回数据库。
    • DbComplusAdd:与 DbNormalAdd 类似,但使用 COM+ 组件。
    • DbComplusUpdate:与 DbNormalUpdate 类似,但使用 COM+ 组件。
    • SleepComplus:调用一个 COM+ 组件,该组件的睡眠时间由属性网格的 "毫秒" 字段定义。
    • ReadFile:读取属性网格的 "路径" 字段中指定的文件。
    • WriteFile:写入属性网格的 "路径" 字段中指定的文件。文件大小由属性网格的 "大小" 字段指定。
  • 窗体中间的 属性网格 定义了上述测试使用的参数。
    • 数据库
      • 列名:要更新的列名,必须是日期列。
      • 连接字符串:用于访问数据库的连接字符串。用户必须拥有删除和创建表以及选择、插入和更新记录的权限。
      • 起始记录号:表必须有一个名为 "Id" 的列。测试将从该值定义的记录开始向上操作,例如,如果值为 1,则测试从第一条记录开始;如果值为 100,则测试从第 100 条记录开始。
      • 表名:要运行测试的表。该表至少应包含两列:"Id" 列(类型为 int,主键)和字段 "列名" 中定义的列(日期类型)。
    • Execute
      • 块大小:每个线程处理一定数量的数据块,然后处理下一个块。块中的记录数由此参数指定。
      • 迭代次数:要执行的总迭代次数。
      • 线程数:并行运行的线程数。开始时,每个线程都会获得一个工作块。一旦线程完成一个块的工作,它就会开始处理下一个块。测试在所有块都处理完毕(即所有迭代都完成)时结束。
    • 文件
      • 路径:读取或写入的文件路径
      • 大小:要写入的文件大小
    • COM+ 睡眠
      • 毫秒:COM+ 组件中睡眠的毫秒数。
    • 上下文菜单:右键单击属性网格会弹出一个上下文菜单,其中包含以下项:
      • Table1 创建:在指定连接字符串的数据库中创建 Table1Table1_Audit 表和一个用于 Table1 的触发器。此表有 94 列,类似于实际情况。
      • 获取行数:计算并显示属性网格中定义的表中的行数。
      • 重置设置:将所有值重置为原始设置。
    • 开始按钮位于窗体底部。测试开始后,其文本和功能将变为停止按钮。
    • 进度条显示已完成迭代的百分比。
    • 进度条旁边的标签显示测试至今已花费的总时间(小时、分钟和秒)。

测试

此程序已在 Windows 7、Windows Server 2003 和 Windows Server 2012 上进行测试。要运行该程序,请按照以下步骤操作:

  1. 运行 ComplusPerf.exe
  2. 在属性网格中,更改连接字符串以指向 SQL 服务器上的测试数据库。
  3. 属性网格 上右键单击,然后从上下文菜单中选择 "Table1 创建"。这将创建名为 Table1 的表。
  4. 在列表框中,勾选 DbNormalAdd,然后单击“开始”按钮。这将向 Table1 添加由属性网格的 "迭代次数" 字段定义的记录数。
  5. 属性网格 上右键单击,然后选择 "获取记录数"。这将显示属性网格的 "表名" 字段中定义的表中的记录数,默认情况下为 Table1
  6. 在属性网格中,取消勾选 DbNormalAdd,勾选 DbComplusUpdate,然后单击“开始”按钮。这将更新属性网格的 "表名" 字段中定义的表中的记录数,数量为属性网格的 "迭代次数" 字段定义的数量。右下角的标签指示了测试的运行时间。
  7. 您也可以尝试其他测试,并更改执行参数,看看在不同线程数下的测试性能如何。
  8. 如果您更改表名,您也会体验到不同的性能。列数少的小表性能会好很多。

结果

在一台装有 4 个 Intel(R) Xeon(R) CPU E5-4660 v2 @ 2.20 GHz 处理器和 32GB 内存的机器上运行了多项测试。一台机器安装了 Windows Server 2003,另一台安装了 Windows Server 2012。在两台机器上,程序集都使用 32 位 regsvcs 注册。运行了一些测试,并使用 64 位 regsvcs 注册了程序集。32 位和 64 位版本之间的性能差异不大。

DbComplusUpdate

此测试使用 COM+ 向数据库读写 5000 条记录,分别使用 10 个和 100 个线程。在 Windows Server 2012 上,还额外运行了应用程序池分别为 2、4 和 10 的测试。应用程序池决定了每个 COM+ 应用程序创建多少个 dllhost 进程。结果表明,Windows Server 2012 比 2003 慢,但应用程序池为 2 和 4 时,性能显著提高。列“秒”表示测试的运行时间,列“差异”表示 Windows Server 2012 与 Windows Server 2003 的性能差异百分比。

编号 测试 seconds diff
1 Win 2003,5000 次迭代,10 个线程 41  
2 Win 2012,5000 次迭代,10 个线程 54 31,71%
3 Win 2003,5000 次迭代,100 个线程 38  
4 Win 2012,5000 次迭代,100 个线程 47 23,68%
5 Win 2012,5000 次迭代,100 个线程,应用程序池 2 43 13,16%
6 Win 2012,5000 次迭代,100 个线程,应用程序池 4 41 7,89%
7 Win 2012,5000 次迭代,100 个线程,应用程序池 10 42 10,53%

DbNormalUpdate

此测试与上一个测试相同,但未使用 COM+。在这种情况下,Windows Server 仍然略慢,但慢得不多。这表明主要是 COM+ 在 Windows Server 2012 上变慢了。

编号 测试 seconds diff
1 Win 2003,5000 次迭代,10 个线程 27  
2 Win 2012,5000 次迭代,10 个线程 31 14,81%
3 Win 2003,5000 次迭代,100 个线程 21  
4 Win 2012,5000 次迭代,100 个线程 22 4,76%

SleepComplus

在此测试中,调用 COM+ 组件中的一个函数,该函数会睡眠 10 毫秒。同样,Windows Server 2012 较慢,并且随着线程数(即 COM+ 中激活的对象数)的增加而显著变慢。这表明 COM+ 在 Windows Server 2012 上的扩展性不如 Windows Server 2003。

编号 测试 seconds diff
1 Win 2003,10000 次迭代,10 个线程 15  
2 Win 2012,10000 次迭代,10 个线程 17 13,33%
3 Win 2003,10000 次迭代,100 个线程 12  
4 Win 2012,10000 次迭代,100 个线程 16 33,33%

历史

  1. 使用 COM+ 和不使用 COM+ 在数据库中读取和更新一条记录的测试,以及读取和写入文件的测试
© . All rights reserved.