`

并发计算测试

阅读更多

数据:大List<Long>,1000W级别

需求:求和,对每个数据处理后求和

思路:

1.直接循环累加,地球人都知道,呵呵。

2.分割为多个断,启用多个线程并发计算,然后汇总。

 

代码:

 

package org.acooly.note;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import org.apache.commons.lang.math.RandomUtils;

public class ConcurrentCalculate {

	
	static final int COUNT = 10000000;
	List<Long> data = new ArrayList<Long>(COUNT);
	
	private int threadNum = 5;
	private long total = 0;
	
	public static void main(String[] args) throws Exception{
		ConcurrentCalculate cc = new ConcurrentCalculate();
		cc.generalTestData();
		cc.concurrent();
		cc.direct();
		System.exit(0);
	}
	
	
	/**
	 * 直接计算
	 */
	public void direct(){
		total = 0;
		long start = System.currentTimeMillis();
		for(long l : data){
			add(algorithm_math(l));
		}
		System.out.println("directSum - total:" + total + "; time:" + (System.currentTimeMillis()-start) + "ms");
	}
	
	
	/**
	 * 并发计算
	 * @throws Exception
	 */
	public void concurrent() throws Exception{
		long start = System.currentTimeMillis();
		CountDownLatch countDownLatch = new CountDownLatch(threadNum);
		Executor executor = Executors.newFixedThreadPool(threadNum);
		for (int i = 0; i < threadNum; i++) {
			int subCount = COUNT/5;
			List<Long> subData = new ArrayList<Long>(subCount);
			for (int j = 0; j < subCount; j++) {
				subData.add(data.get(i*subCount+j));
			}
			executor.execute(new CalculateSum(subData,countDownLatch));
		}
		countDownLatch.await();

		//do sum
		System.out.println("concurrentSum(threadNum:"+threadNum+") - total:" + total + "; time:" + (System.currentTimeMillis()-start) + "ms");
		
		countDownLatch = null;
		executor = null;
		//System.exit(0);
	}
	
	/**
	 * 同步汇总线程计算结果
	 * @param subtotal
	 */
	public synchronized void add(long subtotal){
		total += subtotal;
	}
	
	
	/**
	 * 随机数初始化数据
	 */
	public void generalTestData(){
		for (int i = 0; i < COUNT; i++) {
			data.add((long)RandomUtils.nextInt(100));
		}
	}
	
	/**
	 * 算法模拟业务逻辑。默认算法:无计算
	 * @param l
	 * @return
	 */
	public long algorithm_default(long l){
		return l;
	}
	
	/**
	 * 算法模拟业务逻辑。默认算法:简单数学计算。
	 * @param l
	 * @return
	 */
	public long algorithm_math(long l){
		return ((l / 10) + 2 + 1 * l / 100 - 3) % 2;
	}	

	
	
	/**
	 * 计算任务
	 * @author zhangpu
	 *
	 */
	class CalculateSum implements Runnable{

		private List<Long> subData = null;
		private CountDownLatch countDownLatch = null;
		private CalculateSum(List<Long> subData,CountDownLatch countDownLatch) {
			super();
			this.subData = subData;
			this.countDownLatch = countDownLatch;
		}
		
		public void run() {
			int subtotal = 0;
			for (long l : subData) {
				subtotal += algorithm_math(l);
			}
			//System.out.println("subtotal: " + subtotal);
			add(subtotal);
			this.countDownLatch.countDown();
			
		}
		
	}
	
	
}

 

不处理数据,直接求和测试输出(algorithm_default):

 

concurrentSum(threadNum:5) - total:494991761; time:582ms
directSum - total:494991761; time:482ms
 

 

 

数据处理后求和测试输出(algorithm_math):

concurrentSum(threadNum:5) - total:3001475; time:830ms
directSum - total:3001475; time:961ms

 

测试结论:

1.不对数据进行处理,直接求和比并发快。

2.如果对数据进行处理后在求和,随数据处理消耗的增大,并发求和比直接快。

 

分享到:
评论

相关推荐

    [学习笔记]JMeter压力测试及并发量计算-1

    ### JMeter压力测试及并发量计算关键知识点 #### 一、JMeter的安装与配置(Linux环境) **1. 下载JMeter** - 访问官方下载页面:`http://jmeter.apache.org/download_jmeter.cgi` - 选择适合版本进行下载。 **2....

    性能之并发用户数的计算.doc

    性能之并发用户数的计算是指在性能测试中,计算并发用户数的方法和公式。并发用户数是指在某一时刻同时向服务器发送请求的用户数,它与在线用户数和注册用户数不同,在线用户数是指同时在线的用户数,而注册用户数是...

    测试并发小工具

    在IT行业中,尤其是在软件开发领域,测试并发性能是至关重要的环节。并发编程允许程序同时执行多个任务,从而提高系统效率和资源利用率。C#作为.NET框架的主要编程语言,提供了丰富的工具和特性来支持并发编程。下面...

    覆盖率&amp;并发性测试工具

    在现代计算系统中,多任务并行处理是常态,因此,软件必须能够正确处理并发操作。并发性测试主要检查以下几个方面:数据竞争(多个线程同时访问同一资源导致的不一致性)、死锁(两个或更多线程相互等待对方释放资源...

    并发用户数、吞吐量、思考时间的计算公式

    在软件性能测试中,了解并发用户数、吞吐量、思考时间的计算公式是非常重要的。本篇文章将从三个方面进行探讨,分别是软件性能的关注点、软件性能的几个主要术语和性能测试指标计算公式。 一、软件性能的关注点 在...

    软件性能测试并发数量计算公式(整理)

    软件性能测试计算公式(整理)术语及缩写词测试时间:一轮测试从开始到结束所使用的时间并发线程数:测试时同时访问被测系统的线程数。注意,由于测试过程中,每个线程都是以尽可能快的速度发请求,与实际用户的使用有...

    系统并发压力性能测试报告.docx

    根据给定文件的信息,我们可以推断出这是一份关于系统并发压力性能测试的报告。虽然描述部分为空,但我们可以基于标题、标签以及“部分内容”这一提示来构建相关的知识点。 ### 系统并发压力性能测试报告知识点 ##...

    Java 并发编程示例测试

    8. **并发模式**:测试可能涉及到生产者消费者模型(`BlockingQueue`)、读者写者模式(`ReadWriteLock`)、单例模式(双检锁/静态内部类等实现)等并发编程的经典模式。 9. **并发异常处理**:线程间的异常处理是...

    H323话务产生器,H323并发测试工具

    《H323话务产生器与并发测试工具深度解析》 在当今的VoIP(Voice over Internet Protocol)通信领域,H323标准扮演着至关重要的角色。H323话务产生器,作为一款专门针对H323协议进行并发测试的工具,为网络通信系统...

    量子计算中的并发编程.pptx

    这些理论旨在探索如何利用量子力学原理提高并发计算的效率和性能,为未来的量子计算应用奠定坚实的理论基础。 #### 架构设计 量子并发编程模型的架构需要充分考虑量子计算的特殊性质,包括但不限于量子纠缠和量子态...

    HDFS并发性能测试文.pdf

    综上所述,HDFS并不适合需要高并发读写操作的实时应用,其性能更适用于大数据分析和离线计算。而FastDFS作为国产开源软件,其出色的并发性能和高效的数据处理,使其成为处理大量小文件和高并发场景的理想选择。但在...

    基于多核处理器并发计算软件构架设计与实现.pdf

    【标题】:基于多核处理器并发计算软件构架设计与实现 【摘要】:随着信息技术的发展,多核处理器成为高性能计算的关键技术。本文探讨了一种针对异构多核处理器的并发计算软件架构,旨在提高处理器的实时并发处理能力...

    Java 模拟线程并发

    Future接口代表异步计算的结果,可以用来检查任务是否完成,获取结果或取消任务。 ```java ExecutorService executor = Executors.newFixedThreadPool(5); Future&lt;Integer&gt; future = executor.submit(() -&gt; ...

    包括并发的基础理论知识、不同并发模型的选择与适用环境、编写并发程序的基本步骤,并发算法的正确性证明与性能评价,以及在编写并发程序时遵循的一些指导原则等

    5. 测试与调试:使用并发测试工具,如线程剖析器,确保在各种并发场景下的正确性。 综上所述,理解和掌握并发编程对于开发高性能、高可用的系统至关重要。无论是理论知识的积累,还是实践经验的积累,都是成为一名...

    怎样确定一个实际系统的并发用户数

    在项目的性能测试过程中,确定一个实际系统的并发用户数是非常重要的步骤。并发用户数是指在同一时间段内访问系统的用户数量,影响着系统的性能和稳定性。本文将详细介绍如何确定一个实际系统的并发用户数。 什么是...

    http并发访问 java源码

    2. **Future和Callable接口**:在并发环境中,我们通常使用`Future`接口来代表异步计算的结果,并使用`Callable`接口来定义计算任务。`Future`提供了检查任务是否完成、获取结果和取消任务的方法。 3. **HttpClient...

Global site tag (gtag.js) - Google Analytics