Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与NHibernate异步存储对象,性能测试_C#_.net_Multithreading_Performance_Nhibernate - Fatal编程技术网

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

C# 与NHibernate异步存储对象,性能测试,c#,.net,multithreading,performance,nhibernate,C#,.net,Multithreading,Performance,Nhibernate,目前的情况相当复杂,但我可以把它归结为这个问题。 我在ConcurrentQueue中有300k个对象(或者更多,这个数字只是为了统计),这些对象已经准备好存储在数据库中。Im使用多个线程在数据库中执行写入操作。当队列不为空时,每个线程执行以下操作: 如果你能排队的话 拿一个物体 开课 打开交易 持久化对象 提交事务 结束会议 转到1 经过一些测试,结果出来了 2个线程在00:00:49.4008256平均时间内分配300k对象 4个线程在00:00:29.6146939平均时间内分配300k

目前的情况相当复杂,但我可以把它归结为这个问题。 我在ConcurrentQueue中有300k个对象(或者更多,这个数字只是为了统计),这些对象已经准备好存储在数据库中。Im使用多个线程在数据库中执行写入操作。当队列不为空时,每个线程执行以下操作:

  • 如果你能排队的话
  • 拿一个物体
  • 开课
  • 打开交易
  • 持久化对象
  • 提交事务
  • 结束会议
  • 转到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] 在不增加事务中对象的数量的情况下,是否还有改进的方法。

    关于您的问题,我正在使用MSSQL 2012的NHibernate关于
    [1]为什么当我将线程数量加倍时,执行时间没有减半?
    没有必要在增加线程时提前完成工作。

    其原因可能是可用内存或其他运行应用程序所需的资源不足。这一切都是由操作系统决定的。

    您可能将线程数增加了一倍,但您只是将瓶颈转移到了SQL server实例上。你没有在一半的时间内将完成同样工作所需的资源翻一番


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

    希望这不是真正的
    goto
    !lol,没有即时消息使用while(toBePersisted.TryDequeue(out obj))简单的答案是不使用NHibernate来完成这个任务。您可以尝试无状态会话来加快速度,但我会使用适合此工作的工具。类似SQLBulkCopy的东西,如果需要,我可以深入解释,但底线是,加倍线程并不能保证它会减少您的时间,这一切都是关于可用资源的代码非常简单,并不复杂-一个conccentqueue的共享实例和为其提供服务的多个线程。关于mssql资源-关于如何做到这一点,有什么建议吗?看看服务器上的物理资源,有什么建议?内存、处理器、网络?然后,您必须放大压力下的资源,例如安装更多RAM。可能还值得看看SQL profiler,看看插入是否慢,如果慢,可能有原因,可以删除不必要的索引以加快插入。检查一下慢速插入:每个事务必须有一个对象吗?我想你知道这会有很大帮助。Bult插入,假定NHibernate会使用它们,比单一插入快得多。最好是每个事务只有一个对象。