浏览代码

Add benchmarks for writing to a FileOutputStream. Patch from Evan Jones.

kenton@google.com 16 年之前
父节点
当前提交
6ba3df0d32
共有 1 个文件被更改,包括 26 次插入0 次删除
  1. 26 0
      benchmarks/ProtoBench.java

+ 26 - 0
benchmarks/ProtoBench.java

@@ -33,12 +33,15 @@ package com.google.protocolbuffers;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.io.RandomAccessFile;
 import java.lang.reflect.Method;
 import java.lang.reflect.Method;
 
 
 import com.google.protobuf.ByteString;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.CodedOutputStream;
 import com.google.protobuf.Message;
 import com.google.protobuf.Message;
 
 
 public class ProtoBench {
 public class ProtoBench {
@@ -88,6 +91,16 @@ public class ProtoBench {
       final ByteArrayInputStream inputStream = new ByteArrayInputStream(inputData);
       final ByteArrayInputStream inputStream = new ByteArrayInputStream(inputData);
       final ByteString inputString = ByteString.copyFrom(inputData);
       final ByteString inputString = ByteString.copyFrom(inputData);
       final Message sampleMessage = defaultMessage.newBuilderForType().mergeFrom(inputString).build();
       final Message sampleMessage = defaultMessage.newBuilderForType().mergeFrom(inputString).build();
+      FileOutputStream devNullTemp = null;
+      CodedOutputStream reuseDevNullTemp = null;
+      try {
+        devNullTemp = new FileOutputStream("/dev/null");
+        reuseDevNullTemp = CodedOutputStream.newInstance(devNullTemp);
+      } catch (FileNotFoundException e) {
+        // ignore: this is probably Windows, where /dev/null does not exist
+      }
+      final FileOutputStream devNull = devNullTemp;
+      final CodedOutputStream reuseDevNull = reuseDevNullTemp;
       benchmark("Serialize to byte string", inputData.length, new Action() {
       benchmark("Serialize to byte string", inputData.length, new Action() {
         public void execute() { sampleMessage.toByteString(); }
         public void execute() { sampleMessage.toByteString(); }
       });      
       });      
@@ -99,6 +112,19 @@ public class ProtoBench {
           sampleMessage.writeTo(new ByteArrayOutputStream()); 
           sampleMessage.writeTo(new ByteArrayOutputStream()); 
         }
         }
       });
       });
+      if (devNull != null) {
+        benchmark("Serialize to /dev/null with FileOutputStream", inputData.length, new Action() {
+          public void execute() throws IOException {
+            sampleMessage.writeTo(devNull);
+          }
+        });
+        benchmark("Serialize to /dev/null reusing FileOutputStream", inputData.length, new Action() {
+          public void execute() throws IOException {
+            sampleMessage.writeTo(reuseDevNull);
+            reuseDevNull.flush();  // force the write to the OutputStream
+          }
+        });
+      }
       benchmark("Deserialize from byte string", inputData.length, new Action() {
       benchmark("Deserialize from byte string", inputData.length, new Action() {
         public void execute() throws IOException { 
         public void execute() throws IOException { 
           defaultMessage.newBuilderForType().mergeFrom(inputString).build();
           defaultMessage.newBuilderForType().mergeFrom(inputString).build();