您的位置:首页 > 其它

Notes about process and thread

2014-04-04 00:56 417 查看
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。

·通常块模型数据是在多个线程间共享的,需要一个合适的锁系统替换掉数据共享

refer to /article/8657716.html

如果采用nocatch则客户端每select s_Test1.Nextval from dual一次数据库端都要执行,因此10000次操作在数据库的响应端其时间是相同的,这时候比较主要取决于客户端请求时间的频率了,基于结果分析应该是多线程的请求时间比单线程快5倍。

1 insert commit的多线程也比1 insert commit的单线程快5 - 8倍,随则10000次数的增加速度也许会更快。

但是10000 insert commit的多线程也比10000 insert commit的单线程速度竟然基本相同,可能还要慢一些,分析可能是数据库的连接多线程需要建立多个连接和断开连接吧,变化10000为20000也是这个结果,可见又是数据库缓存的问题,因为事务使用了数据的缓存机制,当数据写入数据时候只有在commit的时候才真正写入数据,如果10000次commit一次则每次的响应时间基本相同。

基本结论:数据库的commit时间才是影响效率的主要因素,因此在使用数据库时多使用catch ,transaction commit等,使用线程的性能也是很显著的。

refer to http://bbs.csdn.net/topics/390616280?page=1
线程池肯定是没必要的。

让主程序接收命令行参数:查询时间范围

就可以变成多进程模式进行试验了。

然后依次启动多个主程序,给以不同的时间范围就可以了。Process.Start()即可,此方法启动进程后立刻返回,不等待进程结束

A good example for multiple process:

http://www.codeproject.com/Articles/36934/Multi-Process-Architecture-with-C

线程是并行的,但是如果你不同的线程用的是一个数据库操作对象,可以说就没有起作用。

用多线程操作数据库查询时,建议引用脏读脏写。

能用异步的地方,不建议用线程。

用Parallel.Foreach()遍历数据并执行操作

小结1:sqlbulkcopy 本身已经支持事务处理,也就是说本身支持多线程处理,如果额外用线程包装sqlbulkcopy,只会跟原来产生的线程进行资源争夺(I/O,CPU,SQL connection etc.)所以性能是不会有任何的提升,对于线程之间上下文的转换还会增加了性能的损耗,反而表现更差。所以,建议着重于调整每批插入的数据大小。如果没法调至最优,可以增加一到两个线程进行资源抢夺(把剩余的资源也彻底利用),但绝不能多。

另外的一个方法是增加进程数进行处理,因为线程是独立占用所有分配的资源,不会影响别的进程,所以总体插入的性能会得到较好的提高。我最大试过可以达到 400,000 rows/sec 的速度。

总结: 线程并非着重于提高整体的性能,而是着重于提高多任务的响应质量(用户体验)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: