|
|
|
@ -43,14 +43,18 @@ import com.google.protobuf.Message; |
|
|
|
|
import com.google.protobuf.benchmarks.Benchmarks.BenchmarkDataset; |
|
|
|
|
import java.io.ByteArrayInputStream; |
|
|
|
|
import java.io.ByteArrayOutputStream; |
|
|
|
|
import java.io.EOFException; |
|
|
|
|
import java.io.File; |
|
|
|
|
import java.io.FileNotFoundException; |
|
|
|
|
import java.io.FileOutputStream; |
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.io.PrintWriter; |
|
|
|
|
import java.io.RandomAccessFile; |
|
|
|
|
import java.nio.file.Files; |
|
|
|
|
import java.nio.file.Paths; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Scanner; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class ProtoBench { |
|
|
|
@ -71,6 +75,7 @@ public class ProtoBench { |
|
|
|
|
} |
|
|
|
|
System.exit(success ? 0 : 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Runs a single test with specific test data. Error messages are displayed to stderr, |
|
|
|
@ -86,7 +91,6 @@ public class ProtoBench { |
|
|
|
|
System.err.println("Unable to get input data"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<String> argsList = getCaliperOption(benchmarkDataset); |
|
|
|
|
if (argsList == null) { |
|
|
|
|
System.err.println("Unable to get default message " + benchmarkDataset.getMessageName()); |
|
|
|
@ -98,15 +102,40 @@ public class ProtoBench { |
|
|
|
|
try { |
|
|
|
|
String args[] = new String[argsList.size()]; |
|
|
|
|
argsList.toArray(args); |
|
|
|
|
CaliperMain.exitlessMain(args, |
|
|
|
|
CaliperMain.exitlessMain(args, |
|
|
|
|
new PrintWriter(System.out, true), new PrintWriter(System.err, true)); |
|
|
|
|
return true; |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
System.err.println("Error: " + e.getMessage()); |
|
|
|
|
System.err.println("Detailed exception information:"); |
|
|
|
|
e.printStackTrace(System.err); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
try { |
|
|
|
|
double mininumScale = 0; |
|
|
|
|
// If the file not exist, this will throw IOException, which won't print the warning
|
|
|
|
|
// information below.
|
|
|
|
|
Scanner scanner = new Scanner(new String(readAllBytes("JavaBenchmarkWarning.txt"))); |
|
|
|
|
while (scanner.hasNext()) { |
|
|
|
|
mininumScale = Math.max(mininumScale, scanner.nextDouble()); |
|
|
|
|
} |
|
|
|
|
scanner.close(); |
|
|
|
|
|
|
|
|
|
System.out.println( |
|
|
|
|
"WARNING: This benchmark's whole iterations are not enough, consider to config caliper to " |
|
|
|
|
+ "run for more time to make the result more convincing. You may change the configure " |
|
|
|
|
+ "code in com.google.protobuf.ProtoBench.getCaliperOption() of benchmark " |
|
|
|
|
+ benchmarkDataset.getMessageName() |
|
|
|
|
+ " to run for more time. e.g. Change the value of " |
|
|
|
|
+ "instrument.runtime.options.timingInterval or value of " |
|
|
|
|
+ "instrument.runtime.options.measurements to be at least " |
|
|
|
|
+ Math.round(mininumScale * 10 + 1) / 10.0 |
|
|
|
|
+ " times of before, then build and run the benchmark again\n"); |
|
|
|
|
Files.deleteIfExists(Paths.get("JavaBenchmarkWarning.txt")); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
// The IOException here should be file not found, which means there's no warning generated by
|
|
|
|
|
// The benchmark, so this IOException should be discarded.
|
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -121,9 +150,13 @@ public class ProtoBench { |
|
|
|
|
} else if (benchmarkDataset.getMessageName(). |
|
|
|
|
equals("benchmarks.google_message3.GoogleMessage3")) { |
|
|
|
|
temp.add("-DbenchmarkMessageType=GOOGLE_MESSAGE3"); |
|
|
|
|
temp.add("-Cinstrument.runtime.options.timingInterval=3000ms"); |
|
|
|
|
temp.add("-Cinstrument.runtime.options.measurements=20"); |
|
|
|
|
} else if (benchmarkDataset.getMessageName(). |
|
|
|
|
equals("benchmarks.google_message4.GoogleMessage4")) { |
|
|
|
|
temp.add("-DbenchmarkMessageType=GOOGLE_MESSAGE4"); |
|
|
|
|
temp.add("-Cinstrument.runtime.options.timingInterval=1500ms"); |
|
|
|
|
temp.add("-Cinstrument.runtime.options.measurements=20"); |
|
|
|
|
} else { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
@ -134,7 +167,6 @@ public class ProtoBench { |
|
|
|
|
String benchmarkNames = "serializeToByteString,serializeToByteArray,serializeToMemoryStream" |
|
|
|
|
+ ",deserializeFromByteString,deserializeFromByteArray,deserializeFromMemoryStream"; |
|
|
|
|
temp.add(benchmarkNames); |
|
|
|
|
temp.add("-Cinstrument.runtime.options.timingInterval=3000ms"); |
|
|
|
|
|
|
|
|
|
return temp; |
|
|
|
|
} |
|
|
|
|