多线程提高效率的情况
2017-04-13 17:39
169 查看
今天遇到一个问题,一个高频声卡操作流程中加入一行printf(printf不是内核调用而是属于标准函数库)严重影响了系统的效率以致程序未能达到目的,不加printf则运行正常,那些同时操作复杂界面和播放音效的游戏都能顺畅地运行,说明真正原因并不在于增加了多少CPU的负担,而可能是两个阻塞流程串行运行对其中一个高频操作的运行造成了影响。于是尝试分了两个线程分开处理,结果效率提高了两倍(以运行总时间判断)以上。
上网查询多线程提高效率的问题得到一个说法:
“如果你的程序仅仅是做一种简单的计算,其间不涉及任何可能是使线程挂起的操作,如I/O读写,等待某种事件等等。那么从表面上看,两个线程与单个线程相比,增加了切换的开销,应该比慢才对。但问题是你还得考虑操作系统的调度策略,通常,在支持线程的操作系统中,线程才是系统调度的单位,对同样一个进程来讲,多一个线程就可以多分到CPU时间,特别使从一个增加到两个的时候举例来说,假如在你的程序启动前,系统中已经有50个线程在运行,那么当你的程序启动后,假如他只有一个线程,那么平均来讲,它将获得1/51的CPU时间,而如果他有两个线程,那么就会获得2/52的CPU时间。当然,这个例子是一种非常理想的情况,他没有考虑系统中原有其他线程的繁忙(或者空闲)程度,也没有考虑线程切换”
不过能够提高一倍以上效率,肯定不仅仅是分配更多CPU时间那么简单,可能是这种多流程串行的高频操作会给CPU的调度造成麻烦,而分线程分类处理后CPU可以优化调度。
上网查询多线程提高效率的问题得到一个说法:
“如果你的程序仅仅是做一种简单的计算,其间不涉及任何可能是使线程挂起的操作,如I/O读写,等待某种事件等等。那么从表面上看,两个线程与单个线程相比,增加了切换的开销,应该比慢才对。但问题是你还得考虑操作系统的调度策略,通常,在支持线程的操作系统中,线程才是系统调度的单位,对同样一个进程来讲,多一个线程就可以多分到CPU时间,特别使从一个增加到两个的时候举例来说,假如在你的程序启动前,系统中已经有50个线程在运行,那么当你的程序启动后,假如他只有一个线程,那么平均来讲,它将获得1/51的CPU时间,而如果他有两个线程,那么就会获得2/52的CPU时间。当然,这个例子是一种非常理想的情况,他没有考虑系统中原有其他线程的繁忙(或者空闲)程度,也没有考虑线程切换”
不过能够提高一倍以上效率,肯定不仅仅是分配更多CPU时间那么简单,可能是这种多流程串行的高频操作会给CPU的调度造成麻烦,而分线程分类处理后CPU可以优化调度。
相关文章推荐
- 多线程在任何情况下均能提高效率吗?
- 多线程模型真的能够提高效率吗?
- java多线程(七)提高锁的效率——使用读写锁
- 多线程误区:一定会提高效率
- java多线程(七)提高锁的效率——使用读写锁
- java中使用多线程不能明显提高程序效率的一些原因
- C# 多线程、控制线程数提高循环输出效率
- java多线程不单单只是提高程序的执行效率
- lucene-利用内存中索引和多线程提高索引效率
- 多线程写文件是否提高效率?
- Java利用多线程执行SQL减少执行时间提高效率
- C# 多线程、控制线程数提高循环输出效率
- C# 多线程、控制线程数提高循环输出效率
- 读书笔记:只有在事件发生的情况下执行非阻塞才能提高效率
- lucene-利用内存中索引和多线程提高索引效率
- [转载]C# 多线程、控制线程数提高循环输出效率
- 为何多线程就能提高Java程序的执行效率
- JAVA多线程,真的提高了效率吗?
- JAVA多线程,真的能提高效率吗
- 多线程不是为了提高效率,而是不必等待