aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Keith Winstein <keithw@mit.edu>2012-03-14 01:59:07 -0400
committerGravatar Keith Winstein <keithw@mit.edu>2012-03-14 01:59:07 -0400
commit487ab77e42faf513569d29dee527bdacc0d1b488 (patch)
treefdda449fc1a76c2bf3cfe29b9ddbbd4db8c029cb /src
parent612159490fe93d7a98297dc933806f6303e4d59e (diff)
Eliminate one terminal copy per frame (20% speedup on benchmark)
Diffstat (limited to 'src')
-rw-r--r--src/examples/benchmark.cc25
-rw-r--r--src/frontend/stmclient.cc13
-rw-r--r--src/frontend/stmclient.h7
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;
}