java thread stepping_java – newFixedThreadPool与newSingleThreadExecutor的性能问题

我正在尝试对客户端代码进行基准测试.所以我决定编写一个多线程程序来对我的客户端代码进行基准测试.我想测量下面方法需要多少时间(95百分位数) –

attributes = deClient.getDEAttributes(columnsList);

下面是我编写的用于对上述方法进行基准测试的多线程代码.我在两个场景中看到很多变化 –

1)首先,使用20个线程并运行15分钟的多线程代码.我得到95百分位数为37毫秒.我正在使用 –

ExecutorService service = Executors.newFixedThreadPool(20);

2)但如果我使用以下方式运行同一个程序15分钟 –

ExecutorService service = Executors.newSingleThreadExecutor();

代替

ExecutorService service = Executors.newFixedThreadPool(20);

当我用newFixedThreadPool(20)运行我的代码时,我得到95百分位为7毫秒,这比上面的数字小.

任何人都可以告诉我这样的高性能问题可能是什么原因 –

newSingleThreadExecutor vs newFixedThreadPool(20)

通过这两种方式,我运行我的程序15分钟.

以下是我的代码 –

public static void main(String[] args) {

try {

// create thread pool with given size

//ExecutorService service = Executors.newFixedThreadPool(20);

ExecutorService service = Executors.newSingleThreadExecutor();

long startTime = System.currentTimeMillis();

long endTime = startTime + (15 * 60 * 1000);//Running for 15 minutes

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

service.submit(new ServiceTask(endTime, serviceList));

}

// wait for termination

service.shutdown();

service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

} catch (InterruptedException e) {

} catch (Exception e) {

}

}

下面是实现Runnable接口的类 –

class ServiceTask implements Runnable {

private static final Logger LOG = Logger.getLogger(ServiceTask.class.getName());

private static Random random = new SecureRandom();

public static volatile AtomicInteger countSize = new AtomicInteger();

private final long endTime;

private final LinkedHashMap tableLists;

public static ConcurrentHashMap selectHistogram = new ConcurrentHashMap();

public ServiceTask(long endTime, LinkedHashMap tableList) {

this.endTime = endTime;

this.tableLists = tableList;

}

@Override

public void run() {

try {

while (System.currentTimeMillis() <= endTime) {

double randomNumber = random.nextDouble() * 100.0;

ServiceInfo service = selectRandomService(randomNumber);

final String id = generateRandomId(random);

final List columnsList = getColumns(service.getColumns());

List> attributes = null;

DEKey bk = new DEKey(service.getKeys(), id);

List list = new ArrayList();

list.add(bk);

Client deClient = new Client(list);

final long start = System.nanoTime();

attributes = deClient.getDEAttributes(columnsList);

final long end = System.nanoTime() - start;

final long key = end / 1000000L;

boolean done = false;

while(!done) {

Long oldValue = selectHistogram.putIfAbsent(key, 1L);

if(oldValue != null) {

done = selectHistogram.replace(key, oldValue, oldValue + 1);

} else {

done = true;

}

}

countSize.getAndAdd(attributes.size());

handleDEAttribute(attributes);

if (BEServiceLnP.sleepTime > 0L) {

Thread.sleep(BEServiceLnP.sleepTime);

}

}

} catch (Exception e) {

}

}

}

更新:-

这是我的处理器规范 – 我从Linux机器运行我的程序,其中2个处理器定义为:

vendor_id : GenuineIntel

cpu family : 6

model : 45

model name : Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz

stepping : 7

cpu MHz : 2599.999

cache size : 20480 KB

fpu : yes

fpu_exception : yes

cpuid level : 13

wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm arat pln pts

bogomips : 5199.99

clflush size : 64

cache_alignment : 64

address sizes : 40 bits physical, 48 bits virtual

power management:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值