|  | @@ -33,12 +33,15 @@ package com.google.protocolbuffers;
 | 
	
		
			
				|  |  |  import java.io.ByteArrayInputStream;
 | 
	
		
			
				|  |  |  import java.io.ByteArrayOutputStream;
 | 
	
		
			
				|  |  |  import java.io.File;
 | 
	
		
			
				|  |  | +import java.io.FileOutputStream;
 | 
	
		
			
				|  |  | +import java.io.FileNotFoundException;
 | 
	
		
			
				|  |  |  import java.io.IOException;
 | 
	
		
			
				|  |  |  import java.io.RandomAccessFile;
 | 
	
		
			
				|  |  |  import java.lang.reflect.Method;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import com.google.protobuf.ByteString;
 | 
	
		
			
				|  |  |  import com.google.protobuf.CodedInputStream;
 | 
	
		
			
				|  |  | +import com.google.protobuf.CodedOutputStream;
 | 
	
		
			
				|  |  |  import com.google.protobuf.Message;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  public class ProtoBench {
 | 
	
	
		
			
				|  | @@ -88,6 +91,16 @@ public class ProtoBench {
 | 
	
		
			
				|  |  |        final ByteArrayInputStream inputStream = new ByteArrayInputStream(inputData);
 | 
	
		
			
				|  |  |        final ByteString inputString = ByteString.copyFrom(inputData);
 | 
	
		
			
				|  |  |        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() {
 | 
	
		
			
				|  |  |          public void execute() { sampleMessage.toByteString(); }
 | 
	
		
			
				|  |  |        });      
 | 
	
	
		
			
				|  | @@ -99,6 +112,19 @@ public class ProtoBench {
 | 
	
		
			
				|  |  |            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() {
 | 
	
		
			
				|  |  |          public void execute() throws IOException { 
 | 
	
		
			
				|  |  |            defaultMessage.newBuilderForType().mergeFrom(inputString).build();
 |