Refactor testRpcBinderLatency
Use the runVmTestService helper method, report microseconds.
Test: atest MicrodroidBenchmarkApp
Change-Id: I0137f5140144e38ae668bcd8b7a9ee4d161ad99b
diff --git a/tests/benchmark/Android.bp b/tests/benchmark/Android.bp
index 9d2b6c7..dac4993 100644
--- a/tests/benchmark/Android.bp
+++ b/tests/benchmark/Android.bp
@@ -19,6 +19,7 @@
jni_libs: [
"MicrodroidBenchmarkNativeLib",
"MicrodroidIdleNativeLib",
+ "MicrodroidTestNativeLib",
"libiovsock_host_jni",
],
jni_uses_platform_apis: true,
diff --git a/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java b/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
index fd0158b..612b1ae 100644
--- a/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
+++ b/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
@@ -57,7 +57,6 @@
import java.util.List;
import java.util.Map;
import java.util.OptionalLong;
-import java.util.Random;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
@@ -72,7 +71,8 @@
private static final String APEX_ETC_FS = "/apex/com.android.virt/etc/fs/";
private static final double SIZE_MB = 1024.0 * 1024.0;
- private static final double NANO_TO_MILLI = 1000000.0;
+ private static final double NANO_TO_MILLI = 1_000_000.0;
+ private static final double NANO_TO_MICRO = 1_000.0;
private static final String MICRODROID_IMG_PREFIX = "microdroid_";
private static final String MICRODROID_IMG_SUFFIX = ".img";
@@ -569,64 +569,51 @@
}
@Test
- public void testVsockRpcBinderLatency() throws Exception {
+ public void testRpcBinderLatency() throws Exception {
+ final int NUM_WARMUPS = 10;
+ final int NUM_REQUESTS = 10_000;
+
VirtualMachineConfig config =
newVmConfigBuilder()
- .setPayloadConfigPath("assets/vm_config_io.json")
+ .setPayloadBinaryName("MicrodroidTestNativeLib.so")
.setDebugLevel(DEBUG_LEVEL_NONE)
.build();
- List<Double> requestLatencies = new ArrayList<>(IO_TEST_TRIAL_COUNT);
+ List<Double> requestLatencies = new ArrayList<>(IO_TEST_TRIAL_COUNT * NUM_REQUESTS);
for (int i = 0; i < IO_TEST_TRIAL_COUNT; ++i) {
- String vmName = "test_vm_request_" + i;
- VirtualMachine vm = forceCreateNewVirtualMachine(vmName, config);
- BenchmarkVmListener.create(new VsockRpcBinderLatencyListener(requestLatencies))
- .runToFinish(TAG, vm);
- }
- reportMetrics(requestLatencies, "vsock/rpcbinder/request_latency", "ms");
- }
+ VirtualMachine vm = forceCreateNewVirtualMachine("test_vm_latency" + i, config);
+ TestResults testResults =
+ runVmTestService(
+ TAG,
+ vm,
+ (ts, tr) -> {
+ // Correctness check
+ tr.mAddInteger = ts.addInteger(123, 456);
- private static class VsockRpcBinderLatencyListener
- implements BenchmarkVmListener.InnerListener {
- private static final int NUM_REQUESTS = 10000;
- private static final int NUM_WARMUP_REQUESTS = 10;
+ // Warmup
+ for (int j = 0; j < NUM_WARMUPS; j++) {
+ ts.addInteger(j, j + 1);
+ }
- private final List<Double> mResults;
-
- VsockRpcBinderLatencyListener(List<Double> results) {
- mResults = results;
- }
-
- @Override
- public void onPayloadReady(VirtualMachine vm, IBenchmarkService benchmarkService)
- throws RemoteException {
- // Warm up a few times.
- Random rand = new Random();
- for (int i = 0; i < NUM_WARMUP_REQUESTS; i++) {
- int a = rand.nextInt();
- int b = rand.nextInt();
- int c = benchmarkService.add(a, b);
- assertThat(c).isEqualTo(a + b);
- }
-
- // Use the VM to compute Fibonnacci numbers, save timestamps between requests.
- int a = 0;
- int b = 1;
- int c;
- long timestamps[] = new long[NUM_REQUESTS + 1];
- for (int i = 0; i < NUM_REQUESTS; i++) {
- timestamps[i] = System.nanoTime();
- c = benchmarkService.add(a, b);
- a = b;
- b = c;
- }
- timestamps[NUM_REQUESTS] = System.nanoTime();
-
- // Log individual request latencies.
- for (int i = 0; i < NUM_REQUESTS; i++) {
- long diff = timestamps[i + 1] - timestamps[i];
- mResults.add((double) diff / NANO_TO_MILLI);
+ // Count Fibonacci numbers, measure latency.
+ int a = 0;
+ int b = 1;
+ int c;
+ tr.mTimings = new long[NUM_REQUESTS];
+ for (int j = 0; j < NUM_REQUESTS; j++) {
+ long start = System.nanoTime();
+ c = ts.addInteger(a, b);
+ tr.mTimings[j] = System.nanoTime() - start;
+ a = b;
+ b = c;
+ }
+ });
+ testResults.assertNoException();
+ assertThat(testResults.mAddInteger).isEqualTo(579);
+ for (long duration : testResults.mTimings) {
+ requestLatencies.add((double) duration / NANO_TO_MICRO);
}
}
+ reportMetrics(requestLatencies, "latency/rpcbinder", "us");
}
}
diff --git a/tests/benchmark/src/native/benchmarkbinary.cpp b/tests/benchmark/src/native/benchmarkbinary.cpp
index 022698f..6cfc71d 100644
--- a/tests/benchmark/src/native/benchmarkbinary.cpp
+++ b/tests/benchmark/src/native/benchmarkbinary.cpp
@@ -96,11 +96,6 @@
return resultStatus(res);
}
- ndk::ScopedAStatus add(int32_t a, int32_t b, int32_t* out) override {
- *out = a + b;
- return ndk::ScopedAStatus::ok();
- }
-
private:
/**
* Measures the read rate for reading the given file.