文档章节

ConcurrentBenchmark

pumpkinHua
 pumpkinHua
发布于 2014/04/26 21:38
字数 309
阅读 15
收藏 0

package org.springside.modules.test.benchmark;


import java.util.Date;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;


/**

 * 多线程Benchmark测试框架. 提供多线程调度及定时的测试进度, tps/latency信息打印.

 * 为方便移植重用, 无任何第三方类库依赖.

 * 

 * @author calvin

 */

public abstract class ConcurrentBenchmark {


public static final String THREAD_COUNT_NAME = "benchmark.thread.count";

public static final String LOOP_COUNT_NAME = "benchmark.loop.count";


protected int threadCount;

protected long loopCount;


protected CountDownLatch startLock;

protected CountDownLatch finishLock;


protected Date startTime;

protected int intervalMillis = 10 * 1000;


public ConcurrentBenchmark(int defaultThreadCount, long defaultLoopCount) {

// merge default setting and system properties

this.threadCount = Integer.parseInt(System.getProperty(THREAD_COUNT_NAME, String.valueOf(defaultThreadCount)));

this.loopCount = Long.parseLong(System.getProperty(LOOP_COUNT_NAME, String.valueOf(defaultLoopCount)));


startLock = new CountDownLatch(threadCount);

finishLock = new CountDownLatch(threadCount);


}


public void execute() throws Exception {

// override for connection & data setup

setUp();


// start threads

ExecutorService threadPool = Executors.newFixedThreadPool(threadCount);

try {

for (int i = 0; i < threadCount; i++) {

BenchmarkTask task = createTask();

task.taskSequence = i;

task.parent = this;

threadPool.execute(task);

}


// wait for all threads ready

startLock.await();


// print start message

startTime = new Date();

printStartMessage();


// wait for all threads finish

finishLock.await();


// print finish summary message

printFinishMessage();

} finally {

threadPool.shutdownNow();

// override for connection & data cleanup

tearDown();

}

}


protected void printStartMessage() {

String className = this.getClass().getSimpleName();

long invokeTimes = threadCount * loopCount;


System.out.printf("%s started at %s.\n%d threads with %,d loops, totally %,d requests will be invoked.\n",

className, startTime.toString(), threadCount, loopCount, invokeTimes);

}


protected void printFinishMessage() {

Date endTime = new Date();

String className = this.getClass().getSimpleName();

long invokeTimes = threadCount * loopCount;

long totalTimeMillis = endTime.getTime() - startTime.getTime();

long tps = (invokeTimes * 1000) / totalTimeMillis;


System.out.printf("%s finished at %s.\n%d threads processed %,d requests after %,d ms, tps is %,d.\n",

className, endTime.toString(), threadCount, invokeTimes, totalTimeMillis, tps);

}


protected void setIntervalSeconds(int intervalSeconds) {

this.intervalMillis = intervalSeconds * 1000;

}


/**

* Override for connection & data setup.

*/

protected void setUp() {

}


/**

* Override to connection & data cleanup.

*/

protected void tearDown() {

}


/**

* create a new benchmark task.

*/

protected abstract BenchmarkTask createTask();

}


© 著作权归作者所有

上一篇: RedisCounterBenchmark
下一篇: benchmark
pumpkinHua
粉丝 3
博文 16
码字总数 3338
作品 0
衡阳
程序员
私信 提问

暂无文章

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.6K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部