数据:大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压力测试及并发量计算关键知识点 #### 一、JMeter的安装与配置(Linux环境) **1. 下载JMeter** - 访问官方下载页面:`http://jmeter.apache.org/download_jmeter.cgi` - 选择适合版本进行下载。 **2....
在IT行业中,尤其是在软件开发领域,测试并发性能是至关重要的环节。并发编程允许程序同时执行多个任务,从而提高系统效率和资源利用率。C#作为.NET框架的主要编程语言,提供了丰富的工具和特性来支持并发编程。下面...
性能之并发用户数的计算是指在性能测试中,计算并发用户数的方法和公式。并发用户数是指在某一时刻同时向服务器发送请求的用户数,它与在线用户数和注册用户数不同,在线用户数是指同时在线的用户数,而注册用户数是...
在现代计算系统中,多任务并行处理是常态,因此,软件必须能够正确处理并发操作。并发性测试主要检查以下几个方面:数据竞争(多个线程同时访问同一资源导致的不一致性)、死锁(两个或更多线程相互等待对方释放资源...
在软件性能测试中,了解并发用户数、吞吐量、思考时间的计算公式是非常重要的。本篇文章将从三个方面进行探讨,分别是软件性能的关注点、软件性能的几个主要术语和性能测试指标计算公式。 一、软件性能的关注点 在...
软件性能测试计算公式(整理)术语及缩写词测试时间:一轮测试从开始到结束所使用的时间并发线程数:测试时同时访问被测系统的线程数。注意,由于测试过程中,每个线程都是以尽可能快的速度发请求,与实际用户的使用有...
# 基于C语言的文件系统并发操作测试工具 ## 项目简介 本项目是一个基于C语言开发的文件系统并发操作测试工具,主要用于测试文件系统在并发创建、删除、读取和写入文件时的行为是否正确。通过模拟不同的场景,验证...
根据给定文件的信息,我们可以推断出这是一份关于系统并发压力性能测试的报告。虽然描述部分为空,但我们可以基于标题、标签以及“部分内容”这一提示来构建相关的知识点。 ### 系统并发压力性能测试报告知识点 ##...
8. **并发模式**:测试可能涉及到生产者消费者模型(`BlockingQueue`)、读者写者模式(`ReadWriteLock`)、单例模式(双检锁/静态内部类等实现)等并发编程的经典模式。 9. **并发异常处理**:线程间的异常处理是...
《H323话务产生器与并发测试工具深度解析》 在当今的VoIP(Voice over Internet Protocol)通信领域,H323标准扮演着至关重要的角色。H323话务产生器,作为一款专门针对H323协议进行并发测试的工具,为网络通信系统...
综上所述,HDFS并不适合需要高并发读写操作的实时应用,其性能更适用于大数据分析和离线计算。而FastDFS作为国产开源软件,其出色的并发性能和高效的数据处理,使其成为处理大量小文件和高并发场景的理想选择。但在...
【标题】:基于多核处理器并发计算软件构架设计与实现 【摘要】:随着信息技术的发展,多核处理器成为高性能计算的关键技术。本文探讨了一种针对异构多核处理器的并发计算软件架构,旨在提高处理器的实时并发处理能力...
10. **为并发代码创建测试**:并发代码的测试尤为重要,因为并发错误难以复现。通过模拟多线程环境进行测试,可以识别并解决潜在的并发问题。 总结,软件测试步骤中的单元测试是关键一环,它涉及到测试策略的制定、...
Future接口代表异步计算的结果,可以用来检查任务是否完成,获取结果或取消任务。 ```java ExecutorService executor = Executors.newFixedThreadPool(5); Future<Integer> future = executor.submit(() -> ...
5. 测试与调试:使用并发测试工具,如线程剖析器,确保在各种并发场景下的正确性。 综上所述,理解和掌握并发编程对于开发高性能、高可用的系统至关重要。无论是理论知识的积累,还是实践经验的积累,都是成为一名...
在项目的性能测试过程中,确定一个实际系统的并发用户数是非常重要的步骤。并发用户数是指在同一时间段内访问系统的用户数量,影响着系统的性能和稳定性。本文将详细介绍如何确定一个实际系统的并发用户数。 什么是...
- **示例计算**: 假设压力测试得出的TPS为100,且平均每条请求的响应时间为0.5秒,那么根据公式可以推算出系统的并发用户数。 #### 六、软件性能的关注点 - **用户视角**: - 关注点: 用户操作的响应时间。 - ...
2. **Future和Callable接口**:在并发环境中,我们通常使用`Future`接口来代表异步计算的结果,并使用`Callable`接口来定义计算任务。`Future`提供了检查任务是否完成、获取结果和取消任务的方法。 3. **HttpClient...
在测试结束后,会生成性能测试的聚合报告,这个报告包括了测试的总样本数,这个总数是根据线程数、循环次数和执行机总数计算得出的。 需要注意的是,在进行分布式测试时,必须保证所有的JMeter版本和JDK版本一致,...