`
icefox_wjx
  • 浏览: 18703 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程程序在多核处理器下的表现测试

    博客分类:
  • java
阅读更多

    一直以来都很相信,多线程程序在多核情况下比单线程程序有更优化的系统压力表现。

    一直以来也都没有具体的数据支持,这个优化的表现到底有多好的情况。

    今天,写了一个短小的程序,分别在xeon E5310 和core2 T5270上跑了一下,看到的结果很出乎我的预料。

   

    我的测试方法是这样的,首先,启动若干个线程,各线程执行若干时间的简单程序,在线程执行结束以后,等待若干时间后,使用单线程执行这个简单程序,在windows系统下,打开任务管理器的性能标签,根据执行期内的性能占用情况分析线程与多核处理器下的性能分解的关系。这个测试分别用10线程和100线程进行了测试。测试结果的截图是这样的:

 

core2 测试

core2 测试

 

xeon 10 线程测试

xeon 10 线程测试

 

 

xeon 100 线程测试

xeon 100 线程测试

 

 

    在上图中,第一张图片是core2的测试,core2的测试中,10线程和100线程的cpu占用情况是一致的,无论单线程和多线程,双核都被占用了80%以上的cpu。两个cpu核心最左边的一个小高峰是打开任务管理器时造成的,中间的高峰是多线程测试的结果,两个cpu核心右边的高峰时单线程测试的结果。

 

    第二张图片是xeon下10线程测试的结果,各cpu核心最左边的高峰是多线程测试的结果,两个cpu核心右边的高峰时单线程测试的结果。cpu核心表现中多线程测试占用了3个cpu核心,单线程测试中主要占用了2个cpu核心(中间间隔时间较短,且中间有其他线程性能干扰,第二个核心表现几乎连在一起了),最后一个处理器略有反应,单不明显。

 

    第三张图片是xeon下100线程的测试结果,处理器的表现于10线程下的表现基本一致(不同在原来多占用2、3核心,现在占用3、4核心)

 

    所以,我认为初步预计,多线程程序设计对intel的cpu下有帮助,但考虑到多线程本身压力大于单线程,排除cpu由于系统运算压力自主分配的因素外,java的多线程设计对程序压力分解的帮助不如想象中的明显,这可能与cpu的线程压力分配策略有关。

 

    另外,这个测试仅在windows下对intel的两种cpu进行了测试,其他情况不好预计,希望有机会能给补充进来。

 

 

 

最后,附上我的测试代码:

package com.icefox.test.mulcore;

import java.util.Date;

/**
 * 为测试多线程在多核,多cpu下的表现
 * 准备多线程程序长时间运行,然后查看系统性能,看看是否占用多个cpu平均分配
 * jdk为1.5
 * 
 * 结论:
 *     在双核intel core2 5270 1.4G处理器上测试,
 *     使用10线程和100线程测试,结果一致
 *     无论单线程还是多线程,反应类似,预计为没有为多线程做处理
 *     (结果截图在MulCoreTest_core_thread100.JPG)
 *     
 *     在四核双路intel xeon E5310 处理器上使用10线程和100线程测试,
 *     多线程占用3核心运算,单线程占用2核心运算
 *     预计为多线程对分处理器有帮助,但cpu分配不完全依赖线程,
 *     即使单线程,cpu仍可依照一定算法进行分配
 *     (结果截图在MulCoreTest_xeon_thread10.JPG   
 *       MulCoreTest_xeon_thread100.JPG)
 *       
 * 总结:
 *     初步预计,多线程程序设计对intel的cpu下有帮助,
 *     但排除cpu由于线程压力自主分配的因素外,
 *     java的多线程设计对程序压力分解的帮助不如想象中的明显,
 *     这可能与cpu的线程压力分配策略有关。
 * @author wjx
 *
 */
public class MulCoreTest {

	private int continueSecond;	// 线程持续时间,默认20秒
	
	public MulCoreTest(){
		continueSecond=20;
		
	}
	
	public MulCoreTest(int continueSecond){
		this.continueSecond = continueSecond;
	}
	
	public int getContinueSecond(){
		return this.continueSecond;
	}
	
	/**
	 * 线程测试方法,先执行指定时间的多线程,
	 * 再执行指定时间的单线程,
	 * 查看资源管理器,证明线程与cpu核心的关系
	 * @throws InterruptedException
	 */
	public void testThread() throws InterruptedException{
		
		/**
		 * 多线程执行
		 */
		System.out.println("Mul Thread run");
		for(int i=0;i<100;i++){
			new CustThread().start();
		}
		/**
		 * 休息30秒
		 */
		Thread.sleep((this.continueSecond+30)*1000);
		/**
		 * 单线程执行
		 */
		System.out.println("Single Thread run");
		testSingleThread();
	}
	
	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		MulCoreTest mul = new MulCoreTest();
		mul.testThread();
	}
	
	/**
	 * 单线程测试
	 *
	 */
	public void testSingleThread(){
		Date startTime = new Date();
		while(true){
			System.out.println("Single Thread");
			Date nowTime = new Date();
			if((nowTime.getTime()-startTime.getTime())/1000>continueSecond){
				break;
			}
		}
	}

}

	

 

 

 

 

package com.icefox.test.mulcore;

import java.util.Date;

/**
 * 一个定制的线程
 * @author wjx
 *
 */
public class CustThread extends Thread {

	private int continueSecond;		// 线程持续时间,单位:秒
	
	public CustThread(){
		continueSecond=20;
	}
	
	public CustThread(int continueSecond){
		this.continueSecond = continueSecond;
	}
	public void run(){
		Date startTime = new Date();
		while(true){
			System.out.println("Mul Thread Run:"+this.getId());
			Date nowTime = new Date();
			if((nowTime.getTime()-startTime.getTime())/1000>continueSecond){
				break;
			}
		}
	}
}

 

  • 大小: 45.4 KB
  • 大小: 77 KB
  • 大小: 74.1 KB
分享到:
评论
12 楼 凤舞凰扬 2009-08-24  
   同楼主一样,我发现一件令我非常纳闷和崩溃的事。有个多线程程序(大概25个任务线程,20个工作线程,5个管理线程执行在两分钟内提交并2000个任务)在不同的机器上有非常大的差别。
   我的机器,P43.0E支持超线程,做这样的事情,CPU没有高过5%,而另外一台机器Core4600双核,CPU始终50%。两种的系统和运行环境一样(都是HP机器,XP系统,JDK1.6)。按道理讲,酷睿的的表现应该比P4好,但实际差别让人诧异!
   有哪位熟悉硬件一点的,可以解释解释
11 楼 ray_linn 2009-08-24  
理论上,开的线程数=CPU数。

多了,就是增加Switch时间。
10 楼 570145440 2009-08-24  
mikewang 写道
多核也好 , 超线程也好, 那些都是cpu 内部的事(简单的说), 只能说宏观上来看,多核,多线程的cpu 百万指令/秒, 要比单核, 非超线程的cpu 要快。 尽管它内部都很复杂, 但这些和操作系统,应用软件都没有任何关系。只是一个提升cpu 运算能力的一种方式而已。


嗯嗯 靠边了。但是,操作系统要对CPU进行调度来安排作业的处理,怎么能说CPU的内部处理与操作系统和软件没有任何关系呢?而线程的概念也是处在软件级上的,其性能好坏应直接与CPU内部结构有关联.......有关的知识点在《计算机体系结构》上都有详细讲解的吧。其他外部影响就不多解释了,问题多多...

9 楼 mikewang 2009-08-24  
多核也好 , 超线程也好, 那些都是cpu 内部的事(简单的说), 只能说宏观上来看,多核,多线程的cpu 百万指令/秒, 要比单核, 非超线程的cpu 要快。 尽管它内部都很复杂, 但这些和操作系统,应用软件都没有任何关系。只是一个提升cpu 运算能力的一种方式而已。
8 楼 570145440 2009-08-23  
提醒一点,在没有进行多核编程时,多核CPU的效率并没有被真正挖掘出来。而且编译器的性能也会影响测试结果的。更何况不同级别的CPU可能采用了不同的架构设计,这对测试结果的影响也是巨大的。
7 楼 570145440 2009-08-23  
LZ把多线程放到多核下运行测的到底是什么性能??

多核编程与多线程编程能混为一谈么?
6 楼 Joo 2009-04-27  
希望得到更准确一点的参数的话可以开一个J-Console看看。在同一个JVM上运行多线程应用,不知道是否会共享多个硬件计算单元,每个线程进行的计算不复杂,而且我觉得100个线程的规模是不是太小了些,无论从计算的深度还是广度上都不足以产生明显差距,楼主尝试再多加压力看看
5 楼 yipsilon 2009-04-27  
隐约记得在BIOS里有设置关于多核CPU使用方法的设置,例如多个CPU是平均分配相同程序的运算,还是可以多线程运算。如果设置了前者,就会出现楼主的那个情况,线程的使用是无效的,只有设置了后者,才能充分发挥线程的好处。

不知道楼主的BIOS里是否有这样的设置。
4 楼 icefox_wjx 2009-04-27  
dennis_zane 写道

搞不明白这个测试想说明什么问题,你的任务也不是计算密集型的。


    只是想去发现多线程程序在多核系统下,或者在多个cpu系统下的表现是什么样子的?是能够将运算平均分配在多个cpu呢,还是独占一个呢?我想,这种基本的研究,也许对细节的了解会有一些帮助吧。对了,错了,还请大家提意见。
3 楼 dennis_zane 2009-04-27  
搞不明白这个测试想说明什么问题,你的任务也不是计算密集型的。
2 楼 icefox_wjx 2009-04-27  
魔力猫咪 写道

Java 虚拟机参数呢?是否参数设定不合理造成分配有障碍呢? 还有Java虚拟机的版本好像也没看到,只看到是1.5的,修订号没看到。还有,使用的是哪家的虚拟机?


还是说的不清楚了,补充一下:
java version "1.5.0_08"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_08-b03)
Java HotSpot(TM) Client VM (build 1.5.0_08-b03, mixed mode, sharing)

虚拟机参数都是默认的,没有做任何设置,jdk是使用的sun的。
1 楼 魔力猫咪 2009-04-27  
Java 虚拟机参数呢?是否参数设定不合理造成分配有障碍呢?
还有Java虚拟机的版本好像也没看到,只看到是1.5的,修订号没看到。还有,使用的是哪家的虚拟机?

相关推荐

    多核处理器更新补丁 v1.0 Final

    4. 兼容性改进:补丁可能包含对新软件、硬件或操作系统版本的兼容性调整,使得AMD多核处理器能在更广泛的环境下正常工作。 5. 功耗管理:更新的补丁可能包含优化的功耗管理策略,帮助处理器在保持高性能的同时降低...

    nios多核处理器程序

    1. **多核处理器概念**:多核处理器是指在单个芯片上集成两个或更多独立的处理核心,它们可以同时执行不同的任务或协同工作,以提高系统性能和并发性。在Nios系统中,我们可以创建多个软核实例,每个核心都可以运行...

    多核处理器\OpenMPcode16多核处理器\OpenMPcode16

    压缩包中的文件"OpenMP16"可能是一个包含多个示例程序、测试用例或者文档的目录,这些资源将详细解释如何在16核处理器环境下使用OpenMP进行并行编程。可能包括以下内容: 1. **并行区域(Parallel Regions)**:...

    通过LabVIEW图形化开发平台有效优化多核处理器环境下的信号处理性能.pdf

    总的来说,LabVIEW作为一个强大的图形化开发工具,有效地支持了多核处理器环境下的信号处理优化,降低了并行编程的难度,提升了软件在多核处理器上的性能表现,为测试测量行业的工程师提供了高效的解决方案。

    一种多核处理器时钟精确并行仿真技术.pdf

    通过在1、5、9、17条宿主机线程上仿真32条目标程序,PCASim展示了良好的可扩展性和功能性,验证了新同步方法的有效性,为多核处理器的性能分析和优化提供了有力工具。这一研究对于理解和优化多核处理器系统的性能,...

    面向片上多核处理器的推测多线程机制下的独立栈模型.pdf

    【独立栈模型】在面向片...【结论】独立栈模型在片上多核处理器的推测多线程环境中,通过消除共享栈的加锁问题,提高了程序的并行执行效率。然而,选择合适的栈模型应根据具体程序的特性和需求,以达到最佳的并行性能。

    如何优化多核处理器环境下的信号处理性能.pdf

    在多核处理器环境下优化信号处理性能是现代计算技术中的一个重要课题,尤其是在数据处理、实时分析和高性能计算领域。随着摩尔定律的发展,单核处理器的频率提升遭遇了物理限制,多核处理器成为提升性能的主要途径。...

    多核处理器并行计算模型研究.pdf

    多核处理器是由两个或更多的独立处理核心集成在同一芯片上,每个核心都可以执行指令,进行数据运算。这样的设计允许处理器同时处理多个任务,从而实现并行计算。这种并行性可以是任务级并行(不同核心处理不同的任务...

    JPEG的多核处理器实现

    随着嵌入式系统技术的发展,将JPEG解码功能实现在多核处理器平台上成为了可能。本篇文档将详细介绍在多核处理器平台上实现JPEG解码的过程和技术细节。 #### 二、项目背景与目标 本文档描述了在多核处理器平台上...

    多核多线程-并发编程简述.pdf

    操作系统平台的选择对多线程程序的实现和性能表现有着重要的影响。 Boss/worker模式是一种常见的并发设计模式,它通过将任务分解为更小的单元,然后由多个线程(worker)去处理,而主线程或者协调线程(Boss)则...

    多核处理器的功耗估算模型.pdf

    这一模型的独特之处在于,它能够在支持同步多线程(SMT)的平台上直接移植和应用。 为了验证模型的有效性,研究人员使用了PARSEC和SPLASH2两个基准测试程序集。实验结果显示,估算误差分别仅为3.01%和1.99%,显著...

    用于多核处理器的LTspice Ⅳ.pdf

    总结来说,LTspice Ⅳ是一款专为多核处理器优化的电路仿真软件,它提供了高效能的多线程求解器和稀疏矩阵求解器,显著提升了仿真速度,同时具备丰富的元件库和直观的图形用户界面,使得电路设计和分析工作更为便捷和...

    多线程编程课件PPT

    开发者可以利用多线程技术编写程序,让它们在多核处理器上并行执行,从而充分利用硬件资源,实现更快的计算速度和更低的能源消耗。这种技术已经成为现代软件开发的重要组成部分,对于优化系统性能和提升用户体验有着...

    乱序超标量多核处理器的验证方法.pdf

    多核处理器架构进一步提升了性能,通过将多个处理核心集成在同一芯片上,可以同时执行多个线程。然而,这也引入了缓存一致性的问题。在多核处理器中,每个核心都有自己的L1缓存,并且共享L2缓存。为了保证数据的一致...

    基于Caffe的嵌入式多核处理器深度学习框架并行实现.pdf

    通过将Caffe框架及其第三方库移植到嵌入式多核处理器并利用同构多核多线程以及异构GPU并行计算技术,有效地解决了移动平台计算能力不足的问题,并在多种深度学习模型上验证了其性能。这对于推动深度学习技术在移动端...

    多核架构下的数据处理算法优化策略综述.pdf

    本文综述了多核处理器上数据处理算法相关的优化策略,从多个方面进行了探讨,包括提高程序的局部性、减少缓存访问冲突、增强多线程并行性、利用单指令多数据(SIMD)并行性以及优化带宽使用。此外,本文还总结和评论...

    多线程测试程序

    此外,理解这两个函数的工作原理和使用场景,有助于开发出高效且可维护的多线程程序。在设计多线程应用时,开发者需要考虑如何合理分配任务,避免阻塞和饥饿,以及如何优雅地处理线程的创建、销毁和异常情况。通过...

Global site tag (gtag.js) - Google Analytics