Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1873e93a authored by Siarhei Vishniakou's avatar Siarhei Vishniakou
Browse files

Add benchmark for onWindowInfosChanged

This benchmark should not have any socket writes, and will help us
detect whether the high variability of results we are seeing in the
other two benchmarks could potentially come from that.

Results:

arm64-v8a inputflinger_benchmarks: Passed: 3, Failed: 0, Ignored: 0, Assumption Failed: 0,
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Benchmark                             Time         CPU       Iteration
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
inputflinger_benchmarks:
  #benchmarkNotifyMotion            125573 ns    90766 ns         5699
  #benchmarkInjectMotion            123218 ns    91416 ns         6341
  #benchmarkOnWindowInfosChanged     10888 ns    10000 ns        65385

Bug: 210926970
Test: atest inputflinger_benchmarks (see results above)
Change-Id: I1d0b6f00c3d4fa74188c7493129ed9515f3246d2
parent 9eb196d2
Loading
Loading
Loading
Loading
+44 −20
Original line number Diff line number Diff line
@@ -263,15 +263,15 @@ static NotifyMotionArgs generateMotionArgs() {
static void benchmarkNotifyMotion(benchmark::State& state) {
    // Create dispatcher
    sp<FakeInputDispatcherPolicy> fakePolicy = new FakeInputDispatcherPolicy();
    std::unique_ptr<InputDispatcher> dispatcher = std::make_unique<InputDispatcher>(fakePolicy);
    dispatcher->setInputDispatchMode(/*enabled*/ true, /*frozen*/ false);
    dispatcher->start();
    InputDispatcher dispatcher(fakePolicy);
    dispatcher.setInputDispatchMode(/*enabled*/ true, /*frozen*/ false);
    dispatcher.start();

    // Create a window that will receive motion events
    std::shared_ptr<FakeApplicationHandle> application = std::make_shared<FakeApplicationHandle>();
    sp<FakeWindowHandle> window = new FakeWindowHandle(application, *dispatcher, "Fake Window");
    sp<FakeWindowHandle> window = new FakeWindowHandle(application, dispatcher, "Fake Window");

    dispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}});
    dispatcher.setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}});

    NotifyMotionArgs motionArgs = generateMotionArgs();

@@ -280,43 +280,43 @@ static void benchmarkNotifyMotion(benchmark::State& state) {
        motionArgs.action = AMOTION_EVENT_ACTION_DOWN;
        motionArgs.downTime = now();
        motionArgs.eventTime = motionArgs.downTime;
        dispatcher->notifyMotion(&motionArgs);
        dispatcher.notifyMotion(&motionArgs);

        // Send ACTION_UP
        motionArgs.action = AMOTION_EVENT_ACTION_UP;
        motionArgs.eventTime = now();
        dispatcher->notifyMotion(&motionArgs);
        dispatcher.notifyMotion(&motionArgs);

        window->consumeEvent();
        window->consumeEvent();
    }

    dispatcher->stop();
    dispatcher.stop();
}

static void benchmarkInjectMotion(benchmark::State& state) {
    // Create dispatcher
    sp<FakeInputDispatcherPolicy> fakePolicy = new FakeInputDispatcherPolicy();
    std::unique_ptr<InputDispatcher> dispatcher = std::make_unique<InputDispatcher>(fakePolicy);
    dispatcher->setInputDispatchMode(/*enabled*/ true, /*frozen*/ false);
    dispatcher->start();
    InputDispatcher dispatcher(fakePolicy);
    dispatcher.setInputDispatchMode(/*enabled*/ true, /*frozen*/ false);
    dispatcher.start();

    // Create a window that will receive motion events
    std::shared_ptr<FakeApplicationHandle> application = std::make_shared<FakeApplicationHandle>();
    sp<FakeWindowHandle> window = new FakeWindowHandle(application, *dispatcher, "Fake Window");
    sp<FakeWindowHandle> window = new FakeWindowHandle(application, dispatcher, "Fake Window");

    dispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}});
    dispatcher.setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}});

    for (auto _ : state) {
        MotionEvent event = generateMotionEvent();
        // Send ACTION_DOWN
        dispatcher->injectInputEvent(&event, INJECTOR_PID, INJECTOR_UID,
        dispatcher.injectInputEvent(&event, INJECTOR_PID, INJECTOR_UID,
                                    InputEventInjectionSync::NONE, INJECT_EVENT_TIMEOUT,
                                    POLICY_FLAG_FILTERED | POLICY_FLAG_PASS_TO_USER);

        // Send ACTION_UP
        event.setAction(AMOTION_EVENT_ACTION_UP);
        dispatcher->injectInputEvent(&event, INJECTOR_PID, INJECTOR_UID,
        dispatcher.injectInputEvent(&event, INJECTOR_PID, INJECTOR_UID,
                                    InputEventInjectionSync::NONE, INJECT_EVENT_TIMEOUT,
                                    POLICY_FLAG_FILTERED | POLICY_FLAG_PASS_TO_USER);

@@ -324,11 +324,35 @@ static void benchmarkInjectMotion(benchmark::State& state) {
        window->consumeEvent();
    }

    dispatcher->stop();
    dispatcher.stop();
}

static void benchmarkOnWindowInfosChanged(benchmark::State& state) {
    // Create dispatcher
    sp<FakeInputDispatcherPolicy> fakePolicy = new FakeInputDispatcherPolicy();
    InputDispatcher dispatcher(fakePolicy);
    dispatcher.setInputDispatchMode(/*enabled*/ true, /*frozen*/ false);
    dispatcher.start();

    // Create a window
    std::shared_ptr<FakeApplicationHandle> application = std::make_shared<FakeApplicationHandle>();
    sp<FakeWindowHandle> window = new FakeWindowHandle(application, dispatcher, "Fake Window");

    std::vector<gui::WindowInfo> windowInfos{*window->getInfo()};
    gui::DisplayInfo info;
    info.displayId = window->getInfo()->displayId;
    std::vector<gui::DisplayInfo> displayInfos{info};

    for (auto _ : state) {
        dispatcher.onWindowInfosChanged(windowInfos, displayInfos);
        dispatcher.onWindowInfosChanged({} /*windowInfos*/, {} /*displayInfos*/);
    }
    dispatcher.stop();
}

BENCHMARK(benchmarkNotifyMotion);
BENCHMARK(benchmarkInjectMotion);
BENCHMARK(benchmarkOnWindowInfosChanged);

} // namespace android::inputdispatcher