Skip to content

Commit 07aaba3

Browse files
committed
[perf] minor optimization for filtering
1 parent 57d10d4 commit 07aaba3

File tree

8 files changed

+56
-33
lines changed

8 files changed

+56
-33
lines changed

src/filter_observer.cc

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,23 @@
2727
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828
*/
2929

30+
#include <algorithm>
31+
#include <iterator>
32+
3033
#include "filter_observer.hh"
3134

35+
#include "base/lnav_log.hh"
3236
#include "config.h"
3337
#include "log_format.hh"
38+
#include "shared_buffer.hh"
3439

3540
void
3641
line_filter_observer::logline_new_lines(const logfile& lf,
3742
logfile::const_iterator ll_begin,
3843
logfile::const_iterator ll_end,
3944
const shared_buffer_ref& sbr)
4045
{
41-
size_t offset = std::distance(lf.begin(), ll_begin);
46+
const auto offset = std::distance(lf.begin(), ll_begin);
4247

4348
require(&lf == this->lfo_filter_state.tfs_logfile.get());
4449

@@ -53,7 +58,7 @@ line_filter_observer::logline_new_lines(const logfile& lf,
5358
lf.get_format()->get_subline(*ll_begin, sbr_copy);
5459
}
5560
sbr_copy.erase_ansi();
56-
for (auto& filter : this->lfo_filter_stack) {
61+
for (const auto& filter : this->lfo_filter_stack) {
5762
if (filter->lf_deleted) {
5863
continue;
5964
}
@@ -69,7 +74,8 @@ line_filter_observer::logline_new_lines(const logfile& lf,
6974
void
7075
line_filter_observer::logline_eof(const logfile& lf)
7176
{
72-
for (auto& iter : this->lfo_filter_stack) {
77+
this->lfo_filter_state.reserve(lf.size() + lf.estimated_remaining_lines());
78+
for (const auto& iter : this->lfo_filter_stack) {
7379
if (iter->lf_deleted) {
7480
continue;
7581
}
@@ -82,7 +88,7 @@ line_filter_observer::get_min_count(size_t max) const
8288
{
8389
size_t retval = max;
8490

85-
for (auto& filter : this->lfo_filter_stack) {
91+
for (const auto& filter : this->lfo_filter_stack) {
8692
if (filter->lf_deleted) {
8793
continue;
8894
}

src/filter_observer.hh

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,24 @@
3030
#ifndef filter_observer_hh
3131
#define filter_observer_hh
3232

33-
#include <sys/types.h>
33+
#include <cstdint>
34+
#include <memory>
3435

36+
#include "base/file_range.hh"
3537
#include "logfile.hh"
38+
#include "shared_buffer.hh"
3639
#include "textview_curses.hh"
3740

3841
class line_filter_observer : public logline_observer {
3942
public:
40-
line_filter_observer(filter_stack& fs, std::shared_ptr<logfile> lf)
43+
line_filter_observer(filter_stack& fs, const std::shared_ptr<logfile>& lf)
4144
: lfo_filter_stack(fs), lfo_filter_state(lf)
4245
{
4346
}
4447

4548
void logline_restart(const logfile& lf, file_size_t rollback_size) override
4649
{
47-
for (auto& filter : this->lfo_filter_stack) {
50+
for (const auto& filter : this->lfo_filter_stack) {
4851
filter->revert_to_last(this->lfo_filter_state, rollback_size);
4952
}
5053
}

src/lnav.indexing.cc

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class loading_observer : public logfile_observer {
4646
public:
4747
loading_observer() : lo_last_offset(0) {}
4848

49-
indexing_result logfile_indexing(const std::shared_ptr<logfile>& lf,
49+
indexing_result logfile_indexing(const logfile* lf,
5050
file_off_t off,
5151
file_size_t total) override
5252
{
@@ -87,16 +87,19 @@ class loading_observer : public logfile_observer {
8787
};
8888

8989
void
90-
do_observer_update(const std::shared_ptr<logfile>& lf)
90+
do_observer_update(const logfile* lf)
9191
{
92-
if (lf && lnav_data.ld_mode == ln_mode_t::FILES
92+
if (lf != nullptr && lnav_data.ld_mode == ln_mode_t::FILES
9393
&& lnav_data.ld_exec_phase < lnav_exec_phase::INTERACTIVE)
9494
{
9595
auto& fc = lnav_data.ld_active_files;
96-
const auto iter = std::find(fc.fc_files.begin(), fc.fc_files.end(), lf);
96+
size_t index = 0;
9797

98-
if (iter != fc.fc_files.end()) {
99-
auto index = std::distance(fc.fc_files.begin(), iter);
98+
for (const auto& curr_file : fc.fc_files) {
99+
if (curr_file.get() != lf) {
100+
index++;
101+
continue;
102+
}
100103
lnav_data.ld_files_view.set_selection(
101104
vis_line_t(fc.fc_other_files.size() + index));
102105
lnav_data.ld_files_view.reload_data();

src/lnav.indexing.hh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,6 @@ rebuild_indexes_result_t rebuild_indexes(
4545
void rebuild_indexes_repeatedly();
4646
bool rescan_files(bool required = false);
4747
bool update_active_files(file_collection& new_files);
48-
void do_observer_update(const std::shared_ptr<logfile>& lf);
48+
void do_observer_update(const logfile* lf);
4949

5050
#endif

src/logfile.cc

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,9 @@ logfile::process_prefix(shared_buffer_ref& sbr,
623623
|| li.li_utf8_scan_result.usr_has_ansi);
624624
}
625625
if (prescan_size > 0 && this->lf_index.size() >= prescan_size
626-
&& prescan_time != this->lf_index[prescan_size - 1].get_time<std::chrono::microseconds>())
626+
&& prescan_time
627+
!= this->lf_index[prescan_size - 1]
628+
.get_time<std::chrono::microseconds>())
627629
{
628630
retval = true;
629631
}
@@ -931,8 +933,7 @@ logfile::rebuild_index(std::optional<ui_clock::time_point> deadline)
931933
this->lf_notes.writeAccess()->emplace(note_type::not_utf,
932934
note_um);
933935
if (this->lf_logfile_observer != nullptr) {
934-
this->lf_logfile_observer->logfile_indexing(
935-
this->shared_from_this(), 0, 0);
936+
this->lf_logfile_observer->logfile_indexing(this, 0, 0);
936937
}
937938
break;
938939
}
@@ -1030,7 +1031,7 @@ logfile::rebuild_index(std::optional<ui_clock::time_point> deadline)
10301031

10311032
if (this->lf_logfile_observer != nullptr) {
10321033
auto indexing_res = this->lf_logfile_observer->logfile_indexing(
1033-
this->shared_from_this(),
1034+
this,
10341035
this->lf_line_buffer.get_read_offset(
10351036
li.li_file_range.next_offset()),
10361037
st.st_size);
@@ -1086,7 +1087,7 @@ logfile::rebuild_index(std::optional<ui_clock::time_point> deadline)
10861087
}
10871088

10881089
for (const auto& pd : this->lf_applicable_partitioners) {
1089-
static thread_local auto part_md
1090+
thread_local auto part_md
10901091
= lnav::pcre2pp::match_data::unitialized();
10911092

10921093
auto curr_ll = this->end() - 1;
@@ -1146,8 +1147,7 @@ logfile::rebuild_index(std::optional<ui_clock::time_point> deadline)
11461147
this->lf_notes.writeAccess()->emplace(note_type::indexing_disabled,
11471148
note_um);
11481149
if (this->lf_logfile_observer != nullptr) {
1149-
this->lf_logfile_observer->logfile_indexing(
1150-
this->shared_from_this(), 0, 0);
1150+
this->lf_logfile_observer->logfile_indexing(this, 0, 0);
11511151
}
11521152
}
11531153

@@ -1219,7 +1219,8 @@ logfile::rebuild_index(std::optional<ui_clock::time_point> deadline)
12191219
this->lf_sort_needed = false;
12201220
}
12211221

1222-
this->lf_index_time = std::chrono::seconds{this->lf_line_buffer.get_file_time()};
1222+
this->lf_index_time
1223+
= std::chrono::seconds{this->lf_line_buffer.get_file_time()};
12231224
if (this->lf_index_time.count() == 0) {
12241225
this->lf_index_time = std::chrono::seconds{st.st_mtime};
12251226
}
@@ -1355,7 +1356,7 @@ logfile::reobserve_from(iterator iter)
13551356

13561357
if (this->lf_logfile_observer != nullptr) {
13571358
auto indexing_res = this->lf_logfile_observer->logfile_indexing(
1358-
this->shared_from_this(), offset, this->size());
1359+
this, offset, this->size());
13591360
if (indexing_res == logfile_observer::indexing_result::BREAK) {
13601361
break;
13611362
}
@@ -1373,7 +1374,7 @@ logfile::reobserve_from(iterator iter)
13731374
}
13741375
if (this->lf_logfile_observer != nullptr) {
13751376
this->lf_logfile_observer->logfile_indexing(
1376-
this->shared_from_this(), this->size(), this->size());
1377+
this, this->size(), this->size());
13771378
this->lf_logline_observer->logline_eof(*this);
13781379
}
13791380
}
@@ -1685,4 +1686,3 @@ logfile::estimated_remaining_lines() const
16851686

16861687
return remaining_bytes / bytes_per_line;
16871688
}
1688-

src/logfile.hh

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public:
7878
* @param total The total size of the file.
7979
* @return false
8080
*/
81-
virtual indexing_result logfile_indexing(const std::shared_ptr<logfile>& lf,
81+
virtual indexing_result logfile_indexing(const logfile* lf,
8282
file_off_t off,
8383
file_size_t total)
8484
= 0;
@@ -87,7 +87,7 @@ public:
8787
struct logfile_activity {
8888
int64_t la_polls{0};
8989
int64_t la_reads{0};
90-
struct rusage la_initial_index_rusage {};
90+
struct rusage la_initial_index_rusage{};
9191
};
9292

9393
/**
@@ -180,7 +180,10 @@ public:
180180
* @return The last modified time of the file when the file was last
181181
* indexed.
182182
*/
183-
std::chrono::microseconds get_modified_time() const { return this->lf_index_time; }
183+
std::chrono::microseconds get_modified_time() const
184+
{
185+
return this->lf_index_time;
186+
}
184187

185188
int get_time_offset_line() const { return this->lf_time_offset_line; }
186189

@@ -464,7 +467,7 @@ private:
464467
std::optional<std::filesystem::path> lf_actual_path;
465468
std::string lf_basename;
466469
std::string lf_content_id;
467-
struct stat lf_stat {};
470+
struct stat lf_stat{};
468471
std::shared_ptr<log_format> lf_format;
469472
uint32_t lf_format_quality{0};
470473
std::vector<logline> lf_index;
@@ -473,9 +476,7 @@ private:
473476
bool lf_sort_needed{false};
474477
line_buffer lf_line_buffer;
475478
int lf_time_offset_line{0};
476-
struct timeval lf_time_offset {
477-
0, 0
478-
};
479+
struct timeval lf_time_offset{0, 0};
479480
bool lf_is_closed{false};
480481
bool lf_indexing{true};
481482
bool lf_partial_line{false};

src/textview_curses.cc

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1083,7 +1083,8 @@ textview_curses::grep_value_for_line(vis_line_t line, std::string& value_out)
10831083
if (retval.li_utf8_scan_result.is_valid()
10841084
&& retval.li_utf8_scan_result.usr_has_ansi)
10851085
{
1086-
// log_debug("has ansi %d", retval.li_utf8_scan_result.usr_has_ansi);
1086+
// log_debug("has ansi %d",
1087+
// retval.li_utf8_scan_result.usr_has_ansi);
10871088
auto new_size = erase_ansi_escapes(value_out);
10881089
value_out.resize(new_size);
10891090
}
@@ -1384,6 +1385,12 @@ logfile_filter_state::resize(size_t newsize)
13841385
}
13851386
}
13861387

1388+
void
1389+
logfile_filter_state::reserve(size_t expected)
1390+
{
1391+
this->tfs_mask.reserve(expected);
1392+
}
1393+
13871394
std::optional<size_t>
13881395
logfile_filter_state::content_line_to_vis_line(uint32_t line)
13891396
{

src/textview_curses.hh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#include "ring_span.hh"
4949
#include "text_format.hh"
5050
#include "textview_curses_fwd.hh"
51+
#include "vis_line.hh"
5152

5253
class textview_curses;
5354

@@ -65,6 +66,8 @@ public:
6566

6667
void resize(size_t newsize);
6768

69+
void reserve(size_t expected);
70+
6871
std::optional<size_t> content_line_to_vis_line(uint32_t line);
6972

7073
const static int MAX_FILTERS = 32;

0 commit comments

Comments
 (0)