ConcurrentSkipListMap性能测试

来源:互联网 发布:二维数组赋值 编辑:程序博客网 时间:2024/06/09 14:45
package vertices;import java.util.Map;import java.util.concurrent.ConcurrentLinkedDeque;import java.util.concurrent.ConcurrentMap;import java.util.concurrent.ConcurrentSkipListMap;import org.apache.hadoop.io.FloatWritable;import org.apache.hadoop.io.IntWritable;import com.google.common.collect.Maps;/** * 注意 :ConcurrentSkipListMap和ConcurrentLinkedDeque都可以双向访问, ConcurrentSkipListMap可以将keyset进行降序遍历,ConcurrentLinkedDeque提供降序迭代器 * @author Administrator * */public class VerticesTest {public static void main(String[] args) {int VERTICES_NUMBER_0 =  400000;int VERTICES_NUMBER_1 = 1000000;        //case1long start = System.currentTimeMillis(); ConcurrentMap<IntWritable, TestVertex> vertexMap0 = Maps .newConcurrentMap(); ConcurrentMap<IntWritable, TestVertex> vertexMap1 = Maps .newConcurrentMap(); for (int i = 0; i < VERTICES_NUMBER_0; i++) { vertexMap0.put(new IntWritable(i), new TestVertex( new IntWritable(i), new FloatWritable(i))); } for (int i = 0; i < VERTICES_NUMBER_1; i++) { vertexMap1.put(new IntWritable(i), new TestVertex( new IntWritable(i), new FloatWritable(i))); } System.out.println("ConcurrentMap load last " + (System.currentTimeMillis() - start) + " ms"); start = System.currentTimeMillis(); Thread t0 = new Thread(new MapWorker(vertexMap0)); Thread t1 = new Thread(new MapWorker(vertexMap1)) ; try { t0.start() ; t1.start(); t0.join() ; t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ConcurrentMap run last " + (System.currentTimeMillis() - start) + " ms");         //case2 start = System.currentTimeMillis(); ConcurrentSkipListMap<IntWritable, TestVertex> skipMap0 = new ConcurrentSkipListMap<IntWritable, TestVertex> () ; ConcurrentSkipListMap<IntWritable, TestVertex> skipMap1 = new ConcurrentSkipListMap<IntWritable, TestVertex> () ; for (int i = 0; i < VERTICES_NUMBER_0; i++) { skipMap0.put(new IntWritable(i), new TestVertex( new IntWritable(i), new FloatWritable(i))); } for (int i = 0; i < VERTICES_NUMBER_1; i++) { skipMap1.put(new IntWritable(i), new TestVertex( new IntWritable(i), new FloatWritable(i))); } System.out.println("ConcurrentSkipListMap load last " + (System.currentTimeMillis() - start) + " ms"); start = System.currentTimeMillis(); t0 = new Thread(new MapWorker(skipMap0)); t1 = new Thread(new MapWorker(skipMap1)) ; try { t0.start() ; t1.start(); t0.join() ; t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ConcurrentSkipListMap run last " + (System.currentTimeMillis() - start) + " ms");    //case3ConcurrentLinkedDeque<TestVertex> vertices0 = new ConcurrentLinkedDeque<TestVertex>();ConcurrentLinkedDeque<TestVertex> vertices1 = new ConcurrentLinkedDeque<TestVertex>();start = System.currentTimeMillis();for (int i = 0; i < VERTICES_NUMBER_0; i++) {vertices0.add(new TestVertex(new IntWritable(i), new FloatWritable(i)));}for (int i = 0; i < VERTICES_NUMBER_1; i++) {vertices1.add(new TestVertex(new IntWritable(i), new FloatWritable(i)));}System.out.println("ConcurrentLinkedDeque Load last "+ (System.currentTimeMillis() - start) + " ms");start = System.currentTimeMillis();t0 = new Thread(new DequeWorker(vertices0));t1 = new Thread(new DequeWorker(vertices1));try {t0.start();t1.start();t0.join();t1.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("ConcurrentLinkedDeque run last "+ (System.currentTimeMillis() - start) + " ms");System.out.println(vertices1.getLast().value);}}class TestVertex {IntWritable id;FloatWritable value;int flag = 0;public TestVertex(IntWritable id, FloatWritable value) {this.id = id;this.value = value;}}class MapWorker implements Runnable {ConcurrentMap<IntWritable, TestVertex> vertexMap;public MapWorker(ConcurrentMap<IntWritable, TestVertex> vertexMap) {this.vertexMap = vertexMap;}@Overridepublic void run() {for (Map.Entry<IntWritable, TestVertex> e : vertexMap.entrySet()) {TestVertex v = e.getValue();v.value.set(v.value.get() * 2);}}}class DequeWorker implements Runnable {ConcurrentLinkedDeque<TestVertex> vertices;public DequeWorker(ConcurrentLinkedDeque<TestVertex> vertices) {this.vertices = vertices;}@Overridepublic void run() {//long start = System.currentTimeMillis();for (TestVertex v : vertices) {v.value.set(v.value.get() * 2);v.flag = 1 ;}//System.out.println(Thread.currentThread().getName() + " last " + (System.currentTimeMillis() - start) + " ms" );}}


测试结果:

ConcurrentMap load last 1633 ms
ConcurrentMap run last 103 ms
ConcurrentSkipListMap load last 1178 ms
ConcurrentSkipListMap run last 38 ms
ConcurrentLinkedDeque Load last 122 ms
ConcurrentLinkedDeque run last 21 ms


阅读全文
0 0
原创粉丝点击