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

Commit 8c84b807 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
(cherry picked from commit 1873e93a)
parent 91030925
Loading
Loading
Loading
Loading
+44 −20
Original line number Original line Diff line number Diff line
@@ -263,15 +263,15 @@ static NotifyMotionArgs generateMotionArgs() {
static void benchmarkNotifyMotion(benchmark::State& state) {
static void benchmarkNotifyMotion(benchmark::State& state) {
    // Create dispatcher
    // Create dispatcher
    sp<FakeInputDispatcherPolicy> fakePolicy = new FakeInputDispatcherPolicy();
    sp<FakeInputDispatcherPolicy> fakePolicy = new FakeInputDispatcherPolicy();
    std::unique_ptr<InputDispatcher> dispatcher = std::make_unique<InputDispatcher>(fakePolicy);
    InputDispatcher dispatcher(fakePolicy);
    dispatcher->setInputDispatchMode(/*enabled*/ true, /*frozen*/ false);
    dispatcher.setInputDispatchMode(/*enabled*/ true, /*frozen*/ false);
    dispatcher->start();
    dispatcher.start();


    // Create a window that will receive motion events
    // Create a window that will receive motion events
    std::shared_ptr<FakeApplicationHandle> application = std::make_shared<FakeApplicationHandle>();
    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();
    NotifyMotionArgs motionArgs = generateMotionArgs();


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


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


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


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


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


    // Create a window that will receive motion events
    // Create a window that will receive motion events
    std::shared_ptr<FakeApplicationHandle> application = std::make_shared<FakeApplicationHandle>();
    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) {
    for (auto _ : state) {
        MotionEvent event = generateMotionEvent();
        MotionEvent event = generateMotionEvent();
        // Send ACTION_DOWN
        // Send ACTION_DOWN
        dispatcher->injectInputEvent(&event, INJECTOR_PID, INJECTOR_UID,
        dispatcher.injectInputEvent(&event, INJECTOR_PID, INJECTOR_UID,
                                    InputEventInjectionSync::NONE, INJECT_EVENT_TIMEOUT,
                                    InputEventInjectionSync::NONE, INJECT_EVENT_TIMEOUT,
                                    POLICY_FLAG_FILTERED | POLICY_FLAG_PASS_TO_USER);
                                    POLICY_FLAG_FILTERED | POLICY_FLAG_PASS_TO_USER);


        // Send ACTION_UP
        // Send ACTION_UP
        event.setAction(AMOTION_EVENT_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,
                                    InputEventInjectionSync::NONE, INJECT_EVENT_TIMEOUT,
                                    POLICY_FLAG_FILTERED | POLICY_FLAG_PASS_TO_USER);
                                    POLICY_FLAG_FILTERED | POLICY_FLAG_PASS_TO_USER);


@@ -324,11 +324,35 @@ static void benchmarkInjectMotion(benchmark::State& state) {
        window->consumeEvent();
        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(benchmarkNotifyMotion);
BENCHMARK(benchmarkInjectMotion);
BENCHMARK(benchmarkInjectMotion);
BENCHMARK(benchmarkOnWindowInfosChanged);


} // namespace android::inputdispatcher
} // namespace android::inputdispatcher