越是憧憬 越要风雨兼程


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

伪共享

发表于 2018-10-20 | 分类于 java冷知识 | | 阅读次数:

引入

在JMH的例子中,JMHSample_37_CacheAccess这个例子很有意思,测试一个二维数组通过row、col两种不同的方式遍历数据的平均时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(5)
@State(Scope.Benchmark)
public class JMHSample_37_CacheAccess {

/*
* This sample serves as a warning against subtle differences in cache access patterns.
*
* Many performance differences may be explained by the way tests are accessing memory.
* In the example below, we walk the matrix either row-first, or col-first:
*/

private final static int COUNT = 4096;
private final static int MATRIX_SIZE = COUNT * COUNT;

private int[][] matrix;

@Setup
public void setup() {
matrix = new int[COUNT][COUNT];
Random random = new Random(1234);
for (int i = 0; i < COUNT; i++) {
for (int j = 0; j < COUNT; j++) {
matrix[i][j] = random.nextInt();
}
}
}

@Benchmark
@OperationsPerInvocation(MATRIX_SIZE)
public void colFirst(Blackhole bh) {
for (int c = 0; c < COUNT; c++) {
for (int r = 0; r < COUNT; r++) {
bh.consume(matrix[r][c]);
}
}
}

@Benchmark
@OperationsPerInvocation(MATRIX_SIZE)
public void rowFirst(Blackhole bh) {
for (int r = 0; r < COUNT; r++) {
for (int c = 0; c < COUNT; c++) {
bh.consume(matrix[r][c]);
}
}
}
}

如上述代码所示,两种遍历的次数相同,差异是一个按行读取,一个按列读取。那么,最终两种方式的性能会有差异吗?

阅读全文 »

微基准测试JMH

发表于 2018-10-19 | 分类于 java tool | | 阅读次数:

JMH 是 Java Microbenchmark Harness(微基准测试),其特色优势在于它是由 Oracle 实现 JIT 的相同人员开发的。

为什么使用JMH

在开发过程中,为了确定一个方法的性能,很多时候都是写一个循环多次调用方法通过计算时间来查看性能是否达到预期。但这种简单的方式得出的结论往往是不准确的。现代JVM不断优化,随着代码执行次数的增加,JVM会对其进行编译优化(JIT),最终结果与简单测试得出的结果可能差距很大。此外,测试往往需要做很多额外工作,比如:控制读写线程比例,控制线程同时启动,设置多线程测试中的状态对象,统计测试结果等等,自己实现这些功能既繁琐又不能完全保证正确。而JMH就是恰好能满足上述性能测试需求的工具。

hello wrold

增加JMH依赖

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.21</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.18</version>
</dependency>

第一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* hello JMH
*
* @author fei
*/
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
public class HelloJHM {

@Benchmark
public void wellHelloThere() {
// this method was intentionally left blank.
}
}

最终结果:

1
2
Benchmark                 Mode  Cnt           Score          Error  Units
HelloJHM.wellHelloThere thrpt 5 1173003521.014 ± 72815462.460 ops/s

阅读全文 »

JMockit

发表于 2016-07-20 | 分类于 java tool | | 阅读次数:

JMockit 是用以帮助开发人员编写测试程序的一组工具和API,与JUnit TestNG配合使用。

阅读全文 »

fastjson

发表于 2016-05-14 | 分类于 java tool | | 阅读次数:

Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。

阅读全文 »

解析proto文件

发表于 2016-04-22 | 分类于 java tool | | 阅读次数:

这篇文章主要描述如何使用程序获取proto文件的信息。

生成desc文件命令

1
protoc -I=IMPORT_PATH --descriptor_set_out=DST_FILE path/to/file.proto
阅读全文 »

protobuf生成的java代码

发表于 2016-04-20 | 分类于 java tool | | 阅读次数:

这篇文章描述了protobuf编译生成的java文件内容,原文地址Java Generated Code

阅读全文 »

protobuf

发表于 2016-04-07 | 分类于 java tool | | 阅读次数:

这篇protobuf指南描述了怎样使用proto3构造protocol buffer数据,包括.proto文件语法以及怎样从.proto文件生成数据访问类。

阅读全文 »

jzmq编译

发表于 2016-04-06 | 分类于 java tool | | 阅读次数:

版本:zmq4.14

阅读全文 »

Merge Sort

发表于 2015-11-23 | 分类于 algorithm | | 阅读次数:

归并排序(Merge sort),是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。

归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

阅读全文 »

Quick Sort

发表于 2015-11-16 | 分类于 algorithm | | 阅读次数:
快速排序
阅读全文 »
1234

sky

keep going

34 日志
8 分类
16 标签
© 2015 — 2019 sky
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4