File: latency_report.py

package info (click to toggle)
wayvnc 0.5.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 412 kB
  • sloc: ansic: 3,278; xml: 1,319; python: 58; sh: 24; makefile: 3
file content (74 lines) | stat: -rwxr-xr-x 2,170 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/python

import os
import math

stream = os.popen('perf script -F time,event')

is_in_update_fb = False

class StateTracker:
    def __init__(self, name, src, enter, leave):
        self.is_active = False
        self.name = name
        self.src = src
        self.enter = enter
        self.leave = leave
        self.n = 0
        self.dt_sum = 0.0
        self.dt_square_sum = 0.0
        self.dt_max = 0.0
        self.dt_min = math.inf

    def add_dt(self, dt):
        self.n += 1
        self.dt_sum += dt
        self.dt_square_sum += dt ** 2
        self.dt_max = max(self.dt_max, dt)
        self.dt_min = min(self.dt_min, dt)

    def apply(self, src, event, t):
        if self.is_active:
            if (src, event) == (self.src, self.leave):
                self.is_active = False
                self.add_dt(t - self.t0)
        else:
            if (src, event) == (self.src, self.enter):
                self.is_active = True
                self.t0 = t

    def avg(self):
        return self.dt_sum / self.n

    def var(self):
        return self.dt_square_sum / self.n - self.avg() ** 2

    def stddev(self):
        return math.sqrt(self.var())

    def report(self):
        if self.n == 0:
            return

        print('{}:'.format(self.name))
        print('\tMin, max: {:.1f} ms, {:.1f} ms'.format(self.dt_min * 1e3, self.dt_max * 1e3))
        print('\tAverage, std.dev.: {:.1f} ms, {:.1f} ms'.format(self.avg() * 1e3, self.stddev() * 1e3))

trackers = [
    StateTracker('Framebuffer update', 'sdt_neatvnc', 'update_fb_start', 'update_fb_done'),
    StateTracker('Framebuffer update (only sending)', 'sdt_neatvnc', 'send_fb_start', 'send_fb_done'),
    StateTracker('Screencopy', 'sdt_wayvnc', 'screencopy_start', 'screencopy_ready'),
    StateTracker('Refine damage', 'sdt_wayvnc', 'refine_damage_start', 'refine_damage_end'),
    StateTracker('Render', 'sdt_wayvnc', 'render_start', 'render_end'),
]

for line in stream:
    [t, src, event, _] = line.replace(' ', '').split(':')
    t = float(t)

    for tracker in trackers:
        tracker.apply(src, event, t)

for tracker in trackers:
    tracker.report()
    print()