diff options
author | Andy Walls <awalls.cx18@gmail.com> | 2017-12-11 19:25:01 -0500 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2018-02-03 14:23:32 +0100 |
commit | eee29fbe8ff4c58ae68af89384328f23f0a8e7b6 (patch) | |
tree | 35c9a212e0dfc2dbcf2cc3d01ef8e40bf22244c0 /gnuradio-runtime/lib/block_detail.cc | |
parent | b0912d31f1a2cfea93a5588898cae0c652cd89d4 (diff) |
gnuradio-runtime: Optimize some buffer[_reader]_sptr grabs and releases
Optimize some reference counted buffer[_reader]_sptr grabs and releases
that show up as minor CPU wasters in profiling when there are a lot of
tags or some blocks that "return 0" often.
At high sample rates (e.g. 160 Msps), this can save ~2% CPU on
blocks that propagate a fair number of tags.
Diffstat (limited to 'gnuradio-runtime/lib/block_detail.cc')
-rw-r--r-- | gnuradio-runtime/lib/block_detail.cc | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/gnuradio-runtime/lib/block_detail.cc b/gnuradio-runtime/lib/block_detail.cc index 9e2e29fcd9..3da150ed8f 100644 --- a/gnuradio-runtime/lib/block_detail.cc +++ b/gnuradio-runtime/lib/block_detail.cc @@ -313,17 +313,19 @@ namespace gr { d_total_noutput_items = noutput_items; d_pc_start_time = (float)gr::high_res_timer_now(); for(size_t i=0; i < d_input.size(); i++) { - gr::thread::scoped_lock guard(*d_input[i]->mutex()); - float pfull = static_cast<float>(d_input[i]->items_available()) / - static_cast<float>(d_input[i]->max_possible_items_available()); + buffer_reader_sptr in_buf = d_input[i]; + gr::thread::scoped_lock guard(*in_buf->mutex()); + float pfull = static_cast<float>(in_buf->items_available()) / + static_cast<float>(in_buf->max_possible_items_available()); d_ins_input_buffers_full[i] = pfull; d_avg_input_buffers_full[i] = pfull; d_var_input_buffers_full[i] = 0; } for(size_t i=0; i < d_output.size(); i++) { - gr::thread::scoped_lock guard(*d_output[i]->mutex()); - float pfull = 1.0f - static_cast<float>(d_output[i]->space_available()) / - static_cast<float>(d_output[i]->bufsize()); + buffer_sptr out_buf = d_output[i]; + gr::thread::scoped_lock guard(*out_buf->mutex()); + float pfull = 1.0f - static_cast<float>(out_buf->space_available()) / + static_cast<float>(out_buf->bufsize()); d_ins_output_buffers_full[i] = pfull; d_avg_output_buffers_full[i] = pfull; d_var_output_buffers_full[i] = 0; @@ -351,9 +353,10 @@ namespace gr { d_avg_throughput = d_total_noutput_items / monitor_time; for(size_t i=0; i < d_input.size(); i++) { - gr::thread::scoped_lock guard(*d_input[i]->mutex()); - float pfull = static_cast<float>(d_input[i]->items_available()) / - static_cast<float>(d_input[i]->max_possible_items_available()); + buffer_reader_sptr in_buf = d_input[i]; + gr::thread::scoped_lock guard(*in_buf->mutex()); + float pfull = static_cast<float>(in_buf->items_available()) / + static_cast<float>(in_buf->max_possible_items_available()); d = pfull - d_avg_input_buffers_full[i]; d_ins_input_buffers_full[i] = pfull; @@ -362,9 +365,10 @@ namespace gr { } for(size_t i=0; i < d_output.size(); i++) { - gr::thread::scoped_lock guard(*d_output[i]->mutex()); - float pfull = 1.0f - static_cast<float>(d_output[i]->space_available()) / - static_cast<float>(d_output[i]->bufsize()); + buffer_sptr out_buf = d_output[i]; + gr::thread::scoped_lock guard(*out_buf->mutex()); + float pfull = 1.0f - static_cast<float>(out_buf->space_available()) / + static_cast<float>(out_buf->bufsize()); d = pfull - d_avg_output_buffers_full[i]; d_ins_output_buffers_full[i] = pfull; |