数据:大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压力测试及并发量计算-1
软件性能测试计算公式(整理)术语及缩写词测试时间:一轮测试从开始到结束所使用的时间并发线程数:测试时同时访问被测系统的线程数。注意,由于测试过程中,每个线程都是以尽可能快的速度发请求,与实际用户的使用有...
并发用户数、吞吐量、思考时间的计算公式
在软件性能测试范畴内就有很多,诸如并发测试、压力测试、基准测试、测试场景等概念和名词,这让刚接触性能测试的新手眼花缭乱,目不暇接。但我们如果能深入软件性能测试的本质,从哲学的角度看问题,找出其内在联系...
包括并发的基础理论知识、不同并发模型的选择与适用环境、编写并发程序的基本步骤,并发算法的正确性证明与性能评价,以及在编写并发程序时遵循的一些指导原则等
资源概要:1,多线程;2,synchronized;3,volatile;4,多线程在JVM中的实现原理剖析 导语: 什么是多线程? 多线程(multithreading)是指从软件或者硬件上实现多个线程并发执行的...线程池案例-Web容器-压力测试
本文来自于csdn,文章主要从系统吞度量要素,系统吞吐量评估,软件性能测试的基本概念和计算公式等等方面来介绍。一.系统吞度量要素:一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联...
支持异步高并发网络性能测试。 3.支持网络交互行为的自定义流程化测试管理。 4.支持测试方案配置管理。 5.支持大数据收发测试。 6.支持测试流程循环、跳转等自定义配置。 7.支持接收数据按需验证。
ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,它既可以用来测试Apache的负载压力,也可以测试Nginx、Lighthttp、Tomcat、IIS等其它Web服务器的压力。 ...
测试WPF
支持异步高并发网络性能测试。 3.支持网络交互行为的自定义流程化测试管理。 4.支持测试方案配置管理。 5.支持大数据收发测试。 6.支持测试流程循环、跳转等自定义配置。 7.支持接收数据按需验证。
1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合...
随着多核处理器的普及,使用并发成为...第12章 测试并发程序 第4部分 高级主题 第13章 显示锁 第14章 构建自定义的同步工具 第15章 原子变量与非阻塞同步机制 第16章 Java存储模型 附录A 同步Annotation 参考文献 索引
可以测试不同上网方式、在不同地区、访问Web不同页面、在不同并发访问密度情况下的:客户端的响应时间、流量和流速;可以测试任何主机、Web Server和页面(HTML、CGI、JSP、PHP、ASP、GIF、FLASH以及声音、MPEG等...
并发与并行的区别 并发:concurrency。单个cpu+多道技术就可以实现并发 并行:parallel:同时运行,只有具备多个cpu才能实现并行 测试环境 os:64位win10 anconda3:1915 64 bit python:3.7.3
开启两个线程,“Thread 1”计算(100!)和“Thread 2”计算(100000!) 在main()方法中启动两个线程,然后调用thread1.join()和thread2.join(),以使主线程在“线程1”和“线程2”都返回结果之前不会进一步...
对分布式事务数据库产品HotDB Server v2.5.5单计算节点模式(以下简称HotDB)进行性能压力测试,明确HotDB在开启强一致(即XA)模式和普通一致模式下,银行事务型转账场景的吞吐量、响应时间、服务器资源使用率等...
5. 使用一台或多台高配置的测试计算机(多CPU,大内存),每台计算机上运行一套StressMark,每套StressMark模拟多个客户线程,以此测试服务程序在大压力情况下的响应能力,这一方法甚至可以测出服务程序支持的并发数...
性能测试:关于网站性能计算的公式。主要有以下几种介绍 1.并发用户数的计算公式 2.吞吐量的计算公式 3.思考计算时间