与NHibernate异步存储对象,性能测试

本文关键字:性能测试 对象 存储 NHibernate 异步 | 更新日期: 2023-09-27 18:31:22

目前的情况非常复杂,但我可以归结为这一点。我在一个并发队列中有 300k 个对象(或更多,这个数字仅用于统计<> ,这些对象已准备好存储在数据库中。我使用多个线程在数据库中进行写入。当队列不为空时,每个线程执行以下操作:

  1. 如果可以取消排队
  2. 取一个对象
  3. 打开会话
  4. 打开交易
  5. 保留对象
  6. 提交事务
  7. 关闭会话
  8. 转到 1。

经过一些测试,有结果

  • 2 个线程处理 300k 个对象,平均时间为 00:00:49.4008256
  • 4 个线程处理 300k 个对象,平均时间为 00:00:29.6146939
  • 10 个线程处理 300k 个对象,00:00:24.0903779 平均时间
  • 20 个线程处理 300k 个对象,平均时间为 00:00:19.7451293
  • 40 个线程在 00:00:18.2760453 平均时间内处理 300k 个对象

这是我的问题:
[1] 为什么当我将线程数加倍时,执行时间没有减半?
[2] 无论如何,是否可以在不增加事务中的对象数量的情况下改进这一点。

我正在使用 NHibernate 和 MSSQL 2012

与NHibernate异步存储对象,性能测试

您可能会将

线程数增加一倍,但您只是将瓶颈转移到 SQL Server 实例。您没有将需要在一半的时间内完成相同工作的资源翻倍。

如果可能的话,我想看看线程的代码,想不出任何建议。

关于你的问题
[1] 为什么当我将线程数增加一倍时,执行时间没有减半?
当您增加线程时,您不必提前完成工作。
其原因可能是可用内存或其他资源较少用于运行应用程序。操作系统将决定这一切。