|
@@ -43,14 +43,18 @@ import com.google.protobuf.Message;
|
|
import com.google.protobuf.benchmarks.Benchmarks.BenchmarkDataset;
|
|
import com.google.protobuf.benchmarks.Benchmarks.BenchmarkDataset;
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.ByteArrayOutputStream;
|
|
|
|
+import java.io.EOFException;
|
|
import java.io.File;
|
|
import java.io.File;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.FileOutputStream;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
import java.io.PrintWriter;
|
|
import java.io.PrintWriter;
|
|
import java.io.RandomAccessFile;
|
|
import java.io.RandomAccessFile;
|
|
|
|
+import java.nio.file.Files;
|
|
|
|
+import java.nio.file.Paths;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
+import java.util.Scanner;
|
|
|
|
|
|
|
|
|
|
public class ProtoBench {
|
|
public class ProtoBench {
|
|
@@ -71,6 +75,7 @@ public class ProtoBench {
|
|
}
|
|
}
|
|
System.exit(success ? 0 : 1);
|
|
System.exit(success ? 0 : 1);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
|
|
/**
|
|
/**
|
|
* Runs a single test with specific test data. Error messages are displayed to stderr,
|
|
* 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");
|
|
System.err.println("Unable to get input data");
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
-
|
|
|
|
List<String> argsList = getCaliperOption(benchmarkDataset);
|
|
List<String> argsList = getCaliperOption(benchmarkDataset);
|
|
if (argsList == null) {
|
|
if (argsList == null) {
|
|
System.err.println("Unable to get default message " + benchmarkDataset.getMessageName());
|
|
System.err.println("Unable to get default message " + benchmarkDataset.getMessageName());
|
|
@@ -98,15 +102,40 @@ public class ProtoBench {
|
|
try {
|
|
try {
|
|
String args[] = new String[argsList.size()];
|
|
String args[] = new String[argsList.size()];
|
|
argsList.toArray(args);
|
|
argsList.toArray(args);
|
|
- CaliperMain.exitlessMain(args,
|
|
|
|
|
|
+ CaliperMain.exitlessMain(args,
|
|
new PrintWriter(System.out, true), new PrintWriter(System.err, true));
|
|
new PrintWriter(System.out, true), new PrintWriter(System.err, true));
|
|
- return true;
|
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
System.err.println("Error: " + e.getMessage());
|
|
System.err.println("Error: " + e.getMessage());
|
|
System.err.println("Detailed exception information:");
|
|
System.err.println("Detailed exception information:");
|
|
e.printStackTrace(System.err);
|
|
e.printStackTrace(System.err);
|
|
return false;
|
|
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().
|
|
} else if (benchmarkDataset.getMessageName().
|
|
equals("benchmarks.google_message3.GoogleMessage3")) {
|
|
equals("benchmarks.google_message3.GoogleMessage3")) {
|
|
temp.add("-DbenchmarkMessageType=GOOGLE_MESSAGE3");
|
|
temp.add("-DbenchmarkMessageType=GOOGLE_MESSAGE3");
|
|
|
|
+ temp.add("-Cinstrument.runtime.options.timingInterval=3000ms");
|
|
|
|
+ temp.add("-Cinstrument.runtime.options.measurements=20");
|
|
} else if (benchmarkDataset.getMessageName().
|
|
} else if (benchmarkDataset.getMessageName().
|
|
equals("benchmarks.google_message4.GoogleMessage4")) {
|
|
equals("benchmarks.google_message4.GoogleMessage4")) {
|
|
temp.add("-DbenchmarkMessageType=GOOGLE_MESSAGE4");
|
|
temp.add("-DbenchmarkMessageType=GOOGLE_MESSAGE4");
|
|
|
|
+ temp.add("-Cinstrument.runtime.options.timingInterval=1500ms");
|
|
|
|
+ temp.add("-Cinstrument.runtime.options.measurements=20");
|
|
} else {
|
|
} else {
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
@@ -134,7 +167,6 @@ public class ProtoBench {
|
|
String benchmarkNames = "serializeToByteString,serializeToByteArray,serializeToMemoryStream"
|
|
String benchmarkNames = "serializeToByteString,serializeToByteArray,serializeToMemoryStream"
|
|
+ ",deserializeFromByteString,deserializeFromByteArray,deserializeFromMemoryStream";
|
|
+ ",deserializeFromByteString,deserializeFromByteArray,deserializeFromMemoryStream";
|
|
temp.add(benchmarkNames);
|
|
temp.add(benchmarkNames);
|
|
- temp.add("-Cinstrument.runtime.options.timingInterval=3000ms");
|
|
|
|
|
|
|
|
return temp;
|
|
return temp;
|
|
}
|
|
}
|