aboutsummaryrefslogblamecommitdiff
path: root/benchmarks/java/src/main/java/com/google/protobuf/ProtoCaliperBenchmark.java
blob: 94568aea78efedc0020f3ae48549b2d620e90317 (plain) (tree)
1
2
3
4
5
 
                            

                                           
                                          








                                                                  
                              
                    

                                     
                          
                           
                                


                           
                                    







                                                                                                    







                                                                                                    






                                                                                                    




                                                                       








                                                                                            



                                    
                                                                                                    
       




                                                                       



                                                                                            



                                    
                                                                                                    
       



                                                      
   
 
                                                    
            









                                                     


















                                                                                              


                                   










                                                                            















                                                                                             




                                                           


                                        
                                    


                                                          




                                                          


                                        
                                    


                                                          




                                                             


                                        
                                    



                                                                   




                                                               


                                      
                                    



                                                                               




                                                              


                                    
                                    



                                                                               




                                                                 


                                      
                                    




                                                                               

     
 
 
 
package com.google.protobuf;

import com.google.caliper.BeforeExperiment;
import com.google.caliper.AfterExperiment;
import com.google.caliper.Benchmark;
import com.google.caliper.Param;
import com.google.protobuf.ByteString;
import com.google.protobuf.CodedOutputStream;
import com.google.protobuf.ExtensionRegistry;
import com.google.protobuf.Message;
import com.google.protobuf.benchmarks.Benchmarks.BenchmarkDataset;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;

public class ProtoCaliperBenchmark {
  public enum BenchmarkMessageType {
    GOOGLE_MESSAGE1_PROTO3 {
      @Override ExtensionRegistry getExtensionRegistry() { return ExtensionRegistry.newInstance(); }
      @Override
      Message getDefaultInstance() {
        return com.google.protobuf.benchmarks.BenchmarkMessage1Proto3.GoogleMessage1
            .getDefaultInstance();
      }
    },
    GOOGLE_MESSAGE1_PROTO2 {
      @Override ExtensionRegistry getExtensionRegistry() { return ExtensionRegistry.newInstance(); }
      @Override
      Message getDefaultInstance() {
        return com.google.protobuf.benchmarks.BenchmarkMessage1Proto2.GoogleMessage1
            .getDefaultInstance();
      }
    },
    GOOGLE_MESSAGE2 {
      @Override ExtensionRegistry getExtensionRegistry() { return ExtensionRegistry.newInstance(); }
      @Override
      Message getDefaultInstance() {
        return com.google.protobuf.benchmarks.BenchmarkMessage2.GoogleMessage2.getDefaultInstance();
      }
    },
    GOOGLE_MESSAGE3 {
      @Override
      ExtensionRegistry getExtensionRegistry() {
        ExtensionRegistry extensions = ExtensionRegistry.newInstance();
        com.google.protobuf.benchmarks.BenchmarkMessage38.registerAllExtensions(extensions);
        com.google.protobuf.benchmarks.BenchmarkMessage37.registerAllExtensions(extensions);
        com.google.protobuf.benchmarks.BenchmarkMessage36.registerAllExtensions(extensions);
        com.google.protobuf.benchmarks.BenchmarkMessage35.registerAllExtensions(extensions);
        com.google.protobuf.benchmarks.BenchmarkMessage34.registerAllExtensions(extensions);
        com.google.protobuf.benchmarks.BenchmarkMessage33.registerAllExtensions(extensions);
        com.google.protobuf.benchmarks.BenchmarkMessage32.registerAllExtensions(extensions);
        com.google.protobuf.benchmarks.BenchmarkMessage31.registerAllExtensions(extensions);
        com.google.protobuf.benchmarks.BenchmarkMessage3.registerAllExtensions(extensions);
        return extensions;
      }
      @Override
      Message getDefaultInstance() {
        return com.google.protobuf.benchmarks.BenchmarkMessage3.GoogleMessage3.getDefaultInstance();
      }
    },
    GOOGLE_MESSAGE4 {
      @Override
      ExtensionRegistry getExtensionRegistry() {
        ExtensionRegistry extensions = ExtensionRegistry.newInstance();
        com.google.protobuf.benchmarks.BenchmarkMessage43.registerAllExtensions(extensions);
        com.google.protobuf.benchmarks.BenchmarkMessage42.registerAllExtensions(extensions);
        com.google.protobuf.benchmarks.BenchmarkMessage41.registerAllExtensions(extensions);
        com.google.protobuf.benchmarks.BenchmarkMessage4.registerAllExtensions(extensions);
        return extensions;
      }
      @Override
      Message getDefaultInstance() {
        return com.google.protobuf.benchmarks.BenchmarkMessage4.GoogleMessage4.getDefaultInstance();
      }
    };
    
    abstract ExtensionRegistry getExtensionRegistry();
    abstract Message getDefaultInstance();
  }

  private BenchmarkMessageType benchmarkMessageType;
  @Param("")
  private String dataFile;
  
  private byte[] inputData;
  private BenchmarkDataset benchmarkDataset;
  private Message defaultMessage;
  private ExtensionRegistry extensions;
  private List<byte[]> inputDataList;
  private List<ByteArrayInputStream> inputStreamList;
  private List<ByteString> inputStringList;
  private List<Message> sampleMessageList;

  private BenchmarkMessageType getMessageType() throws IOException {
    if (benchmarkDataset.getMessageName().equals("benchmarks.proto3.GoogleMessage1")) {
      return BenchmarkMessageType.GOOGLE_MESSAGE1_PROTO3;
    } else if (benchmarkDataset.getMessageName().equals("benchmarks.proto2.GoogleMessage1")) {
      return BenchmarkMessageType.GOOGLE_MESSAGE1_PROTO2;
    } else if (benchmarkDataset.getMessageName().equals("benchmarks.proto2.GoogleMessage2")) {
      return BenchmarkMessageType.GOOGLE_MESSAGE2;
    } else if (benchmarkDataset.getMessageName().
        equals("benchmarks.google_message3.GoogleMessage3")) {
      return BenchmarkMessageType.GOOGLE_MESSAGE3;
    } else if (benchmarkDataset.getMessageName().
        equals("benchmarks.google_message4.GoogleMessage4")) {
      return BenchmarkMessageType.GOOGLE_MESSAGE4;
    } else {
      throw new IllegalStateException("Invalid DataFile! There's no testing message named "
          + benchmarkDataset.getMessageName());
    }
  }
  
  @BeforeExperiment
  void setUp() throws IOException {
    if (!dataFile.equals("")) {
      RandomAccessFile file = new RandomAccessFile(new File(dataFile), "r");
      inputData = new byte[(int) file.length()];
      file.readFully(inputData);
      benchmarkDataset = BenchmarkDataset.parseFrom(inputData);
      benchmarkMessageType = getMessageType();
    } else {
      inputData = new byte[0];
      benchmarkDataset = BenchmarkDataset.parseFrom(inputData);
      benchmarkMessageType = BenchmarkMessageType.GOOGLE_MESSAGE2;
    }
    defaultMessage = benchmarkMessageType.getDefaultInstance();
    extensions = benchmarkMessageType.getExtensionRegistry();
    inputDataList = new ArrayList<byte[]>();
    inputStreamList = new ArrayList<ByteArrayInputStream>();
    inputStringList = new ArrayList<ByteString>();
    sampleMessageList = new ArrayList<Message>();
    
    for (int i = 0; i < benchmarkDataset.getPayloadCount(); i++) {
      byte[] singleInputData = benchmarkDataset.getPayload(i).toByteArray();
      inputDataList.add(benchmarkDataset.getPayload(i).toByteArray());
      inputStreamList.add(new ByteArrayInputStream(
          benchmarkDataset.getPayload(i).toByteArray()));
      inputStringList.add(benchmarkDataset.getPayload(i));
      sampleMessageList.add(
          defaultMessage.newBuilderForType().mergeFrom(singleInputData, extensions).build());
    }
  }
  
  
  @Benchmark
  void serializeToByteString(int reps) throws IOException {
    if (sampleMessageList.size() == 0) {
      return;
    }
    for (int i = 0; i < reps; i++) {
      for (int j = 0; j < sampleMessageList.size(); j++) {
        sampleMessageList.get(j).toByteString();        
      }
    }
  }
  
  @Benchmark
  void serializeToByteArray(int reps) throws IOException {
    if (sampleMessageList.size() == 0) {
      return;
    }
    for (int i = 0; i < reps; i++) {
      for (int j = 0; j < sampleMessageList.size(); j++) {
        sampleMessageList.get(j).toByteArray();  
      }
    }
  }
  
  @Benchmark
  void serializeToMemoryStream(int reps) throws IOException {
    if (sampleMessageList.size() == 0) {
      return;
    }
    for (int i = 0; i < reps; i++) {
      for (int j = 0; j < sampleMessageList.size(); j++) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        sampleMessageList.get(j).writeTo(output); 
      }
    }
  }
  
  @Benchmark
  void deserializeFromByteString(int reps) throws IOException {
    if (inputStringList.size() == 0) {
      return;
    }
    for (int i = 0; i < reps; i++) {
      for (int j = 0; j < inputStringList.size(); j++) {
        benchmarkMessageType.getDefaultInstance().getParserForType().parseFrom(
          inputStringList.get(j), extensions);
      }
    }
  }
  
  @Benchmark
  void deserializeFromByteArray(int reps) throws IOException {
    if (inputDataList.size() == 0) {
      return;
    }
    for (int i = 0; i < reps; i++) {
      for (int j = 0; j < inputDataList.size(); j++) {
        benchmarkMessageType.getDefaultInstance().getParserForType().parseFrom(
          inputDataList.get(j), extensions);
      }
    }
  }
  
  @Benchmark
  void deserializeFromMemoryStream(int reps) throws IOException {
    if (inputStreamList.size() == 0) {
      return;
    }
    for (int i = 0; i < reps; i++) {
      for (int j = 0; j < inputStreamList.size(); j++) {
        benchmarkMessageType.getDefaultInstance().getParserForType().parseFrom(
            inputStreamList.get(j), extensions);
        inputStreamList.get(j).reset();
      }
    }
  }
}