使用线程池测试cpu的并发计算能力
接到一个需求是测试一下cpu并发计算能力,针对int和float求和单位时间能执行几次的问题。可能是服务器选型用到的参数。
开始使用的是fork-join,但是发现fork-join每次得到的结果值波动很明显不稳定(可能和fork-join的实现有关系,抽空研究一下),所以用了线程池的思路来实现
ps:
当然你可以把这篇文章作为线程池和Callable结合并发计算的一个demo来看
代码如下:
package com.company; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
* @author nf
* 多线程累加求和
*
*/
public class CpuTestByThreadPool{
private ThreadPoolExecutor pool = null;
public void init(int poolCount) {
pool = new ThreadPoolExecutor(
poolCount,
poolCount*2,
30,
TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(10));
}
public void destory() {
if(pool != null) {
pool.shutdownNow();
}
}
private class Sum implements Callable<Integer>{
private int subMin;
private int subMax;
private int[] arr;
public Sum(int subMin,int subMax,int[] arr){
this.subMin = subMin;
this.subMax = subMax;
this.arr = arr;
}
@Override
public Integer call() throws Exception {
int sum = 0;
for(int i = subMin;i <= subMax;i++){
sum += arr[i];
}
return sum;
}
} /**
* 求和范围是 min ~ max
* @param min
* @param max
* @param threadNum
* @return
*/
public Integer getSum(int min, int max,int[] arr, int threadNum){
int subMin;
int subMax;
List<FutureTask<Integer>> taskList = new ArrayList<>();
int sumCounts = max - min;
int subCounts = sumCounts/threadNum;
int remainder = sumCounts%threadNum;
int mark = min;
for(int i = 0;i<threadNum;i++){
subMin = mark;
if(remainder!=0&&remainder>i){
subMax = subMin + subCounts;
}else{
subMax = mark + subCounts - 1;
}
mark = subMax + 1;
FutureTask<Integer> task = new FutureTask<Integer>(new Sum(subMin,subMax,arr));
taskList.add(task);
pool.execute(new Thread(task));
}
int sum = taskListSum(taskList);
return sum;
} private Integer taskListSum(List<FutureTask<Integer>> taskList){
int sum = 0;
for(FutureTask<Integer> task : taskList){
try {
sum += task.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
return sum;
} private class SumFloat implements Callable<Float>{
private int subMin;
private int subMax;
private Float[] arr;
public SumFloat(int subMin,int subMax,Float[] arr){
this.subMin = subMin;
this.subMax = subMax;
this.arr = arr;
}
@Override
public Float call() throws Exception {
Float sum = 0f;
for(int i = subMin;i <= subMax;i++){
sum += arr[i];
}
return sum;
}
} /**
* 求和范围是 min ~ max
* @param min
* @param max
* @param threadNum
* @return
*/
public Float getSumFloat(int min, int max,Float[] arr, int threadNum){
int subMin;
int subMax;
List<FutureTask<Float>> taskList = new ArrayList<>();
int sumCounts = max - min;
int subCounts = sumCounts/threadNum;
int remainder = sumCounts%threadNum;
int mark = min;
for(int i = 0;i<threadNum;i++){
subMin = mark;
if(remainder!=0&&remainder>i){
subMax = subMin + subCounts;
}else{
subMax = mark + subCounts - 1;
}
mark = subMax + 1;
FutureTask<Float> task = new FutureTask<Float>(new SumFloat(subMin,subMax,arr));
taskList.add(task);
pool.execute(new Thread(task));
}
Float sum = taskListSumFloat(taskList);
return sum;
} private Float taskListSumFloat(List<FutureTask<Float>> taskList){
Float sum = 0f;
for(FutureTask<Float> task : taskList){
try {
sum += task.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
return sum;
} /**
* @param args
* 测试
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException{
//修改这三个参数
final int arrSize = 2800000,sleeptime=10000;
final int poolCount = 10;
int[] arr = new int[arrSize];
for (int i = 0; i < arrSize; i++) {
arr[i] = i + 1;
} Float[] arrFloat = new Float[arrSize];
for (int i = 0; i < arrSize; i++) {
arrFloat[i] = i + (((float)i) / 3f);
}
CpuTestByThreadPool sumCalculator = new CpuTestByThreadPool(); sumCalculator.init(poolCount);
long startTime = 0L;
long endTime = 0L;
long countL=0L,countF=0L;
startTime = System.nanoTime();
while ((endTime-startTime)<10000000000L) {//10秒
sumCalculator.getSum(0, arrSize,arr, poolCount);
endTime = System.nanoTime();
countL++;
}
System.out.println(countL);
Thread.sleep(sleeptime);
endTime = 0L;
startTime = System.nanoTime();
while ((endTime-startTime)<10000000000L) {
sumCalculator.getSumFloat(0, arrSize, arrFloat, poolCount);
endTime = System.nanoTime();
countF++;
}
System.out.println(countF);
sumCalculator.destory(); System.out.println("TPCC= " + (countL+countF)/2 + "tpmC");
} }
可以通过修改arrSize = 2800000;poolCount = 10;这两个参数匹配自己的机器(让运行时cpu内核占满就行了)
使用线程池测试cpu的并发计算能力的更多相关文章
- [原创] JAVA 递归线程池测试 ExecutorService / ForkJoinPool
测试工具使用递归的方式获取子进程的Msg消息,目前有2种常用的ExecutorService / ForkJoinPool 为了测试哪种效果较好,我们来写个测试Demo,循环5555555次+1(加锁 ...
- JAVA 递归线程池测试 ExecutorService / ForkJoinPool
测试工具使用递归的方式获取子进程的Msg消息,目前有2种常用的ExecutorService / ForkJoinPool 为了测试哪种效果较好,我们来写个测试Demo,循环5555555次+1(加锁 ...
- 【重学Java】多线程进阶(线程池、原子性、并发工具类)
线程池 线程状态介绍 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.线程对象在不同的时期有不同的状态.那么Java中的线程存在哪几种状态呢?Java中的线程 状态被定 ...
- javaWeb 使用线程池+队列解决"订单并发"问题
解决方式:使用线程池+队列 项目基于Spring,如果不用spring需要自己把 ThreadPoolManager.java 改成单例模式 1.写一个Controller(Spring mvc) / ...
- 线程池大小 & cpu core
http://stackoverflow.com/questions/14556037/number-of-processor-core-vs-the-size-of-a-thread-pool ht ...
- Java并发(二十一):线程池实现原理
一.总览 线程池类ThreadPoolExecutor的相关类需要先了解: (图片来自:https://javadoop.com/post/java-thread-pool#%E6%80%BB%E8% ...
- python 之 线程池实现并发
使用线程池实现高IO并发 模块:ThreadPoolExecutor, as_completed 测试代码如下: #!/opt/python3/bin/python3 from concurrent. ...
- 并发编程(六)--进程/线程池、协程、gevent第三方库
一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可 ...
- 并发编程(六)——进程/线程池、协程、gevent第三方库
进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...
随机推荐
- SQL SERVER 2005还原差异备份、日志备份 2012-03-29 11:43
其实要备份,还原最安全最有保障的是完全备份.但是完全备份肯定是需要更多的磁盘空间的开销.尤其是数据量比较大的.比如基数是500M,每天的增长量为10M,那么第一次完全备份是500M,第二次是510M, ...
- python批量提取哔哩哔哩bilibili视频
# -*- coding: utf-8 -*- """ Created on Tue Jan 29 13:26:41 2019 @author: kwy "&q ...
- 基于Modelsim的视频流仿真
一.前言 最近在看牟新刚写的<基于FPGA的数字图像处理原理及应用>,书中关于FPGA数字图像处理的原理的原理写的非常透彻,在网上寻找了很久都没有找到完整的源代码工程,因此尝试自己做了补充 ...
- leetcode 390. 消除游戏
{20-01-29 19:22} class Solution { public int lastRemaining(int n) { return help(n); } public static ...
- Uber为何会成为共享经济中全球市值最大的独角兽企业?
自5月10日登陆纽交所以来,Uber的股价就像过山车一般起起伏伏,让无数投资者痛并快乐着.不过在经过半个月时间的试探后,如今Uber的股价已经稳定在40美元左右.截至美国东部时间5月24日股市收盘,U ...
- Linux三剑客之awk精讲(基础与进阶)
第1章 awk基础入门 要弄懂awk程序,必须熟悉了解这个工具的规则.本实战笔记的目的是通过实际案例或面试题带同学们熟练掌握awk在企业中的用法,而不是awk程序的帮助手册. 1.1 awk简介 一种 ...
- 刷题56. Merge Intervals
一.题目说明 题目是56. Merge Intervals,给定一列区间的集合,归并重叠区域. 二.我的做法 这个题目不难,先对intervals排序,然后取下一个集合,如果cur[0]>res ...
- Day11 - N - Game HDU - 3389
题目链接 题意是说有1到n个标号的盒子,选择一个非空的盒子A,B是否空无所谓,满足(A+B)%2=1,(A+B)%3=0,A>B 解上面的同余方程组,最小解为3,循环为2*3=6,那我们可以把前 ...
- django 模版内置的过滤器
一.add 将传进来的参数添加到原来的值上面.这个过滤器会尝试将“值”和“参数”转换成整形然后进行相加.如果转换成整形过程中失败了,那么将会将“值”和“参数”进行拼接.如果是字符串,那么会拼接成字符串 ...
- 【IMU_Ops】------III------ IMU自动化运维平台之CMDB(admin)
说明本文中所有内容仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. #A 首先启用admin 通过python manage.p ...