diff options
author | Keith Winstein <keithw@mit.edu> | 2012-03-14 01:59:07 -0400 |
---|---|---|
committer | Keith Winstein <keithw@mit.edu> | 2012-03-14 01:59:07 -0400 |
commit | 487ab77e42faf513569d29dee527bdacc0d1b488 (patch) | |
tree | fdda449fc1a76c2bf3cfe29b9ddbbd4db8c029cb /src | |
parent | 612159490fe93d7a98297dc933806f6303e4d59e (diff) |
Eliminate one terminal copy per frame (20% speedup on benchmark)
Diffstat (limited to 'src')
-rw-r--r-- | src/examples/benchmark.cc | 25 | ||||
-rw-r--r-- | src/frontend/stmclient.cc | 13 | ||||
-rw-r--r-- | src/frontend/stmclient.h | 7 |
3 files changed, 31 insertions, 14 deletions
diff --git a/src/examples/benchmark.cc b/src/examples/benchmark.cc index a9c44c2..abcd8cd 100644 --- a/src/examples/benchmark.cc +++ b/src/examples/benchmark.cc @@ -50,12 +50,17 @@ extern "C" { const int ITERATIONS = 1000; +using namespace Terminal; + int main( void ) { - Terminal::Framebuffer local_framebuffer( 80, 24 ); + int fbmod = 0; + Framebuffer local_framebuffers[ 2 ] = { Framebuffer(80,24), Framebuffer(80,24) }; + Framebuffer *local_framebuffer = &(local_framebuffers[ fbmod ]); + Framebuffer *new_state = &(local_framebuffers[ !fbmod ]); Overlay::OverlayManager overlays; - Terminal::Display display( true ); - Terminal::Complete local_terminal( 80, 24 ); + Display display( true ); + Complete local_terminal( 80, 24 ); /* Adopt native locale */ if ( NULL == setlocale( LC_ALL, "" ) ) { @@ -71,25 +76,27 @@ int main( void ) for ( int i = 0; i < ITERATIONS; i++ ) { /* type a character */ - overlays.get_prediction_engine().new_user_byte( i + 'x', local_framebuffer ); + overlays.get_prediction_engine().new_user_byte( i + 'x', *local_framebuffer ); /* fetch target state */ - Terminal::Framebuffer new_state( local_terminal.get_fb() ); + *new_state = local_terminal.get_fb(); /* apply local overlays */ - overlays.apply( new_state ); + overlays.apply( *new_state ); /* calculate minimal difference from where we are */ const string diff( display.new_frame( false, - local_framebuffer, - new_state ) ); + *local_framebuffer, + *new_state ) ); /* make sure to use diff */ if ( diff.size() > INT_MAX ) { exit( 1 ); } - local_framebuffer = new_state; + fbmod = !fbmod; + local_framebuffer = &(local_framebuffers[ fbmod ]); + new_state = &(local_framebuffers[ !fbmod ]); } return 0; diff --git a/src/frontend/stmclient.cc b/src/frontend/stmclient.cc index 6b181e5..0af3784 100644 --- a/src/frontend/stmclient.cc +++ b/src/frontend/stmclient.cc @@ -128,6 +128,7 @@ void STMClient::main_init( void ) /* local state */ local_framebuffer = new Terminal::Framebuffer( window_size.ws_col, window_size.ws_row ); + new_state = new Terminal::Framebuffer( 1, 1 ); /* initialize screen */ string init = display.new_frame( false, *local_framebuffer, *local_framebuffer ); @@ -152,19 +153,23 @@ void STMClient::output_new_frame( void ) } /* fetch target state */ - Terminal::Framebuffer new_state( network->get_latest_remote_state().state.get_fb() ); + *new_state = network->get_latest_remote_state().state.get_fb(); /* apply local overlays */ - overlays.apply( new_state ); + overlays.apply( *new_state ); /* calculate minimal difference from where we are */ const string diff( display.new_frame( !repaint_requested, *local_framebuffer, - new_state ) ); + *new_state ) ); swrite( STDOUT_FILENO, diff.data(), diff.size() ); - *local_framebuffer = new_state; repaint_requested = false; + + /* switch pointers */ + Terminal::Framebuffer *tmp = new_state; + new_state = local_framebuffer; + local_framebuffer = tmp; } bool STMClient::process_network_input( void ) diff --git a/src/frontend/stmclient.h b/src/frontend/stmclient.h index 173b288..1da4b1d 100644 --- a/src/frontend/stmclient.h +++ b/src/frontend/stmclient.h @@ -39,7 +39,7 @@ private: int signal_fd; struct winsize window_size; - Terminal::Framebuffer *local_framebuffer; + Terminal::Framebuffer *local_framebuffer, *new_state; Overlay::OverlayManager overlays; Network::Transport< Network::UserStream, Terminal::Complete > *network; Terminal::Display display; @@ -60,6 +60,7 @@ public: signal_fd(), window_size(), local_framebuffer( NULL ), + new_state( NULL ), overlays(), network( NULL ), display( true ), /* use TERM environment var to initialize display */ @@ -90,6 +91,10 @@ public: delete local_framebuffer; } + if ( new_state != NULL ) { + delete new_state; + } + if ( network != NULL ) { delete network; } |