RecordBench.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:10k
源码类别:

网格计算

开发平台:

Java

  1. /*
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.record;
  19. import java.io.ByteArrayInputStream;
  20. import java.io.ByteArrayOutputStream;
  21. import java.io.DataInputStream;
  22. import java.io.DataOutputStream;
  23. import java.io.IOException;
  24. import java.lang.reflect.Array;
  25. import java.lang.reflect.InvocationTargetException;
  26. import java.lang.reflect.Method;
  27. import java.util.Random;
  28. /**
  29.  * Benchmark for various types of serializations
  30.  */
  31. public class RecordBench {
  32.   
  33.   private static class Times {
  34.     long init;
  35.     long serialize;
  36.     long deserialize;
  37.     long write;
  38.     long readFields;
  39.   };
  40.   
  41.   private static final long SEED = 0xDEADBEEFL;
  42.   private static final Random rand = new Random();
  43.   
  44.   /** Do not allow to create a new instance of RecordBench */
  45.   private RecordBench() {}
  46.   
  47.   private static void initBuffers(Record[] buffers) {
  48.     final int BUFLEN = 32;
  49.     for (int idx = 0; idx < buffers.length; idx++) {
  50.       buffers[idx] = new RecBuffer();
  51.       int buflen = rand.nextInt(BUFLEN);
  52.       byte[] bytes = new byte[buflen];
  53.       rand.nextBytes(bytes);
  54.       ((RecBuffer)buffers[idx]).setData(new Buffer(bytes));
  55.     }
  56.   }
  57.   
  58.   private static void initStrings(Record[] strings) {
  59.     final int STRLEN = 32;
  60.     for (int idx = 0; idx < strings.length; idx++) {
  61.       strings[idx] = new RecString();
  62.       int strlen = rand.nextInt(STRLEN);
  63.       StringBuilder sb = new StringBuilder(strlen);
  64.       for (int ich = 0; ich < strlen; ich++) {
  65.         int cpt = 0;
  66.         while (true) {
  67.           cpt = rand.nextInt(0x10FFFF+1);
  68.           if (Utils.isValidCodePoint(cpt)) {
  69.             break;
  70.           }
  71.         }
  72.         sb.appendCodePoint(cpt);
  73.       }
  74.       ((RecString)strings[idx]).setData(sb.toString());
  75.     }
  76.   }
  77.   
  78.   private static void initInts(Record[] ints) {
  79.     for (int idx = 0; idx < ints.length; idx++) {
  80.       ints[idx] = new RecInt();
  81.       ((RecInt)ints[idx]).setData(rand.nextInt());
  82.     }
  83.   }
  84.   
  85.   private static Record[] makeArray(String type, int numRecords, Times times) {
  86.     Method init = null;
  87.     try {
  88.       init = RecordBench.class.getDeclaredMethod("init"+
  89.                                                  toCamelCase(type) + "s",
  90.                                                  new Class[] {Record[].class});
  91.     } catch (NoSuchMethodException ex) {
  92.       throw new RuntimeException(ex);
  93.     }
  94.     Record[] records = new Record[numRecords];
  95.     times.init = System.nanoTime();
  96.     try {
  97.       init.invoke(null, new Object[]{records});
  98.     } catch (Exception ex) {
  99.       throw new RuntimeException(ex);
  100.     }
  101.     times.init = System.nanoTime() - times.init;
  102.     return records;
  103.   }
  104.   
  105.   private static void runBinaryBench(String type, int numRecords, Times times)
  106.     throws IOException {
  107.     Record[] records = makeArray(type, numRecords, times);
  108.     ByteArrayOutputStream bout = new ByteArrayOutputStream();
  109.     BinaryRecordOutput rout = new BinaryRecordOutput(bout);
  110.     DataOutputStream dout = new DataOutputStream(bout);
  111.     
  112.     for(int idx = 0; idx < numRecords; idx++) {
  113.       records[idx].serialize(rout);
  114.     }
  115.     bout.reset();
  116.     
  117.     times.serialize = System.nanoTime();
  118.     for(int idx = 0; idx < numRecords; idx++) {
  119.       records[idx].serialize(rout);
  120.     }
  121.     times.serialize = System.nanoTime() - times.serialize;
  122.     
  123.     byte[] serialized = bout.toByteArray();
  124.     ByteArrayInputStream bin = new ByteArrayInputStream(serialized);
  125.     BinaryRecordInput rin = new BinaryRecordInput(bin);
  126.     
  127.     times.deserialize = System.nanoTime();
  128.     for(int idx = 0; idx < numRecords; idx++) {
  129.       records[idx].deserialize(rin);
  130.     }
  131.     times.deserialize = System.nanoTime() - times.deserialize;
  132.     
  133.     bout.reset();
  134.     
  135.     times.write = System.nanoTime();
  136.     for(int idx = 0; idx < numRecords; idx++) {
  137.       records[idx].write(dout);
  138.     }
  139.     times.write = System.nanoTime() - times.write;
  140.     
  141.     bin.reset();
  142.     DataInputStream din = new DataInputStream(bin);
  143.     
  144.     times.readFields = System.nanoTime();
  145.     for(int idx = 0; idx < numRecords; idx++) {
  146.       records[idx].readFields(din);
  147.     }
  148.     times.readFields = System.nanoTime() - times.readFields;
  149.   }
  150.   
  151.   private static void runCsvBench(String type, int numRecords, Times times)
  152.     throws IOException {
  153.     Record[] records = makeArray(type, numRecords, times);
  154.     ByteArrayOutputStream bout = new ByteArrayOutputStream();
  155.     CsvRecordOutput rout = new CsvRecordOutput(bout);
  156.     
  157.     for(int idx = 0; idx < numRecords; idx++) {
  158.       records[idx].serialize(rout);
  159.     }
  160.     bout.reset();
  161.     
  162.     times.serialize = System.nanoTime();
  163.     for(int idx = 0; idx < numRecords; idx++) {
  164.       records[idx].serialize(rout);
  165.     }
  166.     times.serialize = System.nanoTime() - times.serialize;
  167.     
  168.     byte[] serialized = bout.toByteArray();
  169.     ByteArrayInputStream bin = new ByteArrayInputStream(serialized);
  170.     CsvRecordInput rin = new CsvRecordInput(bin);
  171.     
  172.     times.deserialize = System.nanoTime();
  173.     for(int idx = 0; idx < numRecords; idx++) {
  174.       records[idx].deserialize(rin);
  175.     }
  176.     times.deserialize = System.nanoTime() - times.deserialize;
  177.   }
  178.   
  179.   private static void runXmlBench(String type, int numRecords, Times times)
  180.     throws IOException {
  181.     Record[] records = makeArray(type, numRecords, times);
  182.     ByteArrayOutputStream bout = new ByteArrayOutputStream();
  183.     XmlRecordOutput rout = new XmlRecordOutput(bout);
  184.     
  185.     for(int idx = 0; idx < numRecords; idx++) {
  186.       records[idx].serialize(rout);
  187.     }
  188.     bout.reset();
  189.     
  190.     bout.write("<records>n".getBytes());
  191.     
  192.     times.serialize = System.nanoTime();
  193.     for(int idx = 0; idx < numRecords; idx++) {
  194.       records[idx].serialize(rout);
  195.     }
  196.     times.serialize = System.nanoTime() - times.serialize;
  197.     
  198.     bout.write("</records>n".getBytes());
  199.     
  200.     byte[] serialized = bout.toByteArray();
  201.     ByteArrayInputStream bin = new ByteArrayInputStream(serialized);
  202.         
  203.     times.deserialize = System.nanoTime();
  204.     XmlRecordInput rin = new XmlRecordInput(bin);
  205.     for(int idx = 0; idx < numRecords; idx++) {
  206.       records[idx].deserialize(rin);
  207.     }
  208.     times.deserialize = System.nanoTime() - times.deserialize;
  209.   }
  210.   private static void printTimes(String type,
  211.                                  String format,
  212.                                  int numRecords,
  213.                                  Times times) {
  214.     System.out.println("Type: " + type + " Format: " + format +
  215.                        " #Records: "+numRecords);
  216.     if (times.init != 0) {
  217.       System.out.println("Initialization Time (Per record) : "+
  218.                          times.init/numRecords + " Nanoseconds");
  219.     }
  220.     
  221.     if (times.serialize != 0) {
  222.       System.out.println("Serialization Time (Per Record) : "+
  223.                          times.serialize/numRecords + " Nanoseconds");
  224.     }
  225.     
  226.     if (times.deserialize != 0) {
  227.       System.out.println("Deserialization Time (Per Record) : "+
  228.                          times.deserialize/numRecords + " Nanoseconds");
  229.     }
  230.     
  231.     if (times.write != 0) {
  232.       System.out.println("Write Time (Per Record) : "+
  233.                          times.write/numRecords + " Nanoseconds");
  234.     }
  235.     
  236.     if (times.readFields != 0) {
  237.       System.out.println("ReadFields Time (Per Record) : "+
  238.                          times.readFields/numRecords + " Nanoseconds");
  239.     }
  240.     
  241.     System.out.println();
  242.   }
  243.   
  244.   private static String toCamelCase(String inp) {
  245.     char firstChar = inp.charAt(0);
  246.     if (Character.isLowerCase(firstChar)) {
  247.       return ""+Character.toUpperCase(firstChar) + inp.substring(1);
  248.     }
  249.     return inp;
  250.   }
  251.   
  252.   private static void exitOnError() {
  253.     String usage = "RecordBench {buffer|string|int}"+
  254.       " {binary|csv|xml} <numRecords>";
  255.     System.out.println(usage);
  256.     System.exit(1);
  257.   }
  258.   
  259.   /**
  260.    * @param args the command line arguments
  261.    */
  262.   public static void main(String[] args) throws IOException {
  263.     String version = "RecordBench v0.1";
  264.     System.out.println(version+"n");
  265.     
  266.     if (args.length != 3) {
  267.       exitOnError();
  268.     }
  269.     
  270.     String typeName = args[0];
  271.     String format = args[1];
  272.     int numRecords = Integer.decode(args[2]).intValue();
  273.     
  274.     Method bench = null;
  275.     try {
  276.       bench = RecordBench.class.getDeclaredMethod("run"+
  277.                                                   toCamelCase(format) + "Bench",
  278.                                                   new Class[] {String.class, Integer.TYPE, Times.class});
  279.     } catch (NoSuchMethodException ex) {
  280.       ex.printStackTrace();
  281.       exitOnError();
  282.     }
  283.     
  284.     if (numRecords < 0) {
  285.       exitOnError();
  286.     }
  287.     
  288.     // dry run
  289.     rand.setSeed(SEED);
  290.     Times times = new Times();
  291.     try {
  292.       bench.invoke(null, new Object[] {typeName, numRecords, times});
  293.     } catch (Exception ex) {
  294.       ex.printStackTrace();
  295.       System.exit(1);
  296.     }
  297.     
  298.     // timed run
  299.     rand.setSeed(SEED);
  300.     try {
  301.       bench.invoke(null, new Object[] {typeName, numRecords, times});
  302.     } catch (Exception ex) {
  303.       ex.printStackTrace();
  304.       System.exit(1);
  305.     }
  306.     printTimes(typeName, format, numRecords, times);
  307.   }
  308. }