0

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

  1. 如果可以出队
  2. 拿一个物体
  3. 打开会话
  4. 开启交易
  5. 持久化对象
  6. 提交事务
  7. 关闭会话
  8. 转到 1。

经过一些测试有结果

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

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

我正在使用NHibernate 和 MSSQL 2012

4

2 回答 2

1

您可能将线程数加倍,但您只是将瓶颈转移到 SQL 服务器实例。您还没有在一半的时间内将完成相同工作所需的资源翻倍。

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

于 2013-09-13T12:16:04.040 回答
1

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

于 2013-09-13T12:11:21.883 回答