为什么我的线程数越多计算时间反而慢了呢
2015-01-16 10:35
288 查看
首先我们应该知道,操作系统是如何使用线程的。每个进程中可以启动若干个线程,这些线程跟操作系统请求计算资源,操作系统也许没我们想的那么智能,它不一定按照我们想要的方式去讲线程与计算核心对应起来。
比如,有时候,我们的线程内部的计算需要在磁盘读取数据,这样就会使得当前线程等待,操作系统就可能智能的把它挂起了,它的计算资源又被其它线程使用了,等到数据准备完毕之后,操作系统又将挂起的线程以及他的资源(寄存器数据,缓存数据)一同放到一个计算核心(计算资源)上(实际上操作系统可能不会吧所有缓存数据都拉出到内存,但是如果在第一个线程等待时,插入的线程的使用了大量缓存,你的原有缓存数据就极有可能被冲掉了,就需要重新缓存),当然这个时候你被唤醒的线程可能不会再原有的核心上了,总之这种线程切换的过程会使得你的线程计算时间变慢了。
又比如,你的线程数量过多。这个情况下,如果线程的负载是雷同的,那么你的线程很可能被频繁切换,这样也会把时间变慢。不过不是说线程数比核心数少就好,这个要有个度。你的线程负载均衡的话,如果线程切换时间能很好的弥补掉线程挂起等待的时间,各个线程交错执行,完全占用计算资源,你的计算速度才会快。
以上只是一时兴起,暂作之讨论,不正确的地方,烦请批评指正,欢迎跟帖讨论。
比如,有时候,我们的线程内部的计算需要在磁盘读取数据,这样就会使得当前线程等待,操作系统就可能智能的把它挂起了,它的计算资源又被其它线程使用了,等到数据准备完毕之后,操作系统又将挂起的线程以及他的资源(寄存器数据,缓存数据)一同放到一个计算核心(计算资源)上(实际上操作系统可能不会吧所有缓存数据都拉出到内存,但是如果在第一个线程等待时,插入的线程的使用了大量缓存,你的原有缓存数据就极有可能被冲掉了,就需要重新缓存),当然这个时候你被唤醒的线程可能不会再原有的核心上了,总之这种线程切换的过程会使得你的线程计算时间变慢了。
又比如,你的线程数量过多。这个情况下,如果线程的负载是雷同的,那么你的线程很可能被频繁切换,这样也会把时间变慢。不过不是说线程数比核心数少就好,这个要有个度。你的线程负载均衡的话,如果线程切换时间能很好的弥补掉线程挂起等待的时间,各个线程交错执行,完全占用计算资源,你的计算速度才会快。
以上只是一时兴起,暂作之讨论,不正确的地方,烦请批评指正,欢迎跟帖讨论。
相关文章推荐
- 为什么我的线程数越多计算时间反而慢了呢
- java为什么计算时间从1970年1月1日开始
- 为什么编程语言以及数据库要从1970年1月1日开始计算时间
- Java为什么计算时间从1970年1月1日开始
- java为什么计算时间从1970年1月1日开始
- 为什么编程语言以及数据库要从1970年1月1日开始计算时间【转】
- java为什么计算时间从1970年1月1日开始
- 为什么编程语言以及数据库要从1970年1月1日开始计算时间
- java为什么计算时间从1970年1月1日开始
- 为什么现在信息发达了,受骗的人反而越来越多?
- 为什么开机时间(秒)要从1970年1月1日0时开始计算
- 为什么睡得越多,反而越累?
- Loadrunner做性能测试:为什么100个用户的响应时间反而比50个用户的响应时间更短?
- 为什么计算机很多语言里的时间都是从1970年1月1日午夜开始计算?
- [转载]为什么科学计算一定要用fortran
- Java的时间处理(续<计算Java时间>)
- 计算俩个时间之间隔多少月
- 计算文件下载时间
- 拍马屁的为什么越来越多
- 关于时间的加减计算