OSDN Git Service

ui/vnc: optimize dirty bitmap tracking
authorPeter Lieven <pl@kamp.de>
Wed, 8 Jan 2014 09:08:35 +0000 (10:08 +0100)
committerGerd Hoffmann <kraxel@redhat.com>
Mon, 10 Mar 2014 11:35:04 +0000 (12:35 +0100)
commit12b316d4c173bf07f421ef9dc98ba4b53916066e
tree843e39ea377bb7cf66421dada6656aa43ca5c8af
parent6cd859aa8a7fb60fe6edb89e628cddfe25dfe186
ui/vnc: optimize dirty bitmap tracking

vnc_update_client currently scans the dirty bitmap of each client
bitwise which is a very costly operation if only few bits are dirty.
vnc_refresh_server_surface does almost the same.
this patch optimizes both by utilizing the heavily optimized
function find_next_bit to find the offset of the next dirty
bit in the dirty bitmaps.

The following artifical test (just the bitmap operation part) running
vnc_update_client 65536 times on a 2560x2048 surface illustrates the
performance difference:

All bits clean - vnc_update_client_new: 0.07 secs
 vnc_update_client_old: 10.98 secs

All bits dirty - vnc_update_client_new: 11.26 secs
 vnc_update_client_old: 20.19 secs

Few bits dirty - vnc_update_client_new: 0.08 secs
 vnc_update_client_old: 10.98 secs

The case for all bits dirty is still rather slow, this
is due to the implementation of find_and_clear_dirty_height.
This will be addresses in a separate patch.

Signed-off-by: Peter Lieven <pl@kamp.de>
Reviewed-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
ui/vnc.c
ui/vnc.h