diff options
author | dequis <dx@dxzone.com.ar> | 2017-06-05 16:05:00 -0300 |
---|---|---|
committer | dequis <dx@dxzone.com.ar> | 2017-06-05 18:10:27 -0300 |
commit | 0e44ea891645044f47bf3754e141045ee3b24324 (patch) | |
tree | 96c154eeea8b309f2fd253fbff7f15f56da13c27 | |
parent | 31b9d115b065570020ce9be1a1d8cd49212f70a9 (diff) | |
download | irssi-0e44ea891645044f47bf3754e141045ee3b24324.zip |
Performance improvements for /lastlog with big result sets
This applies to "/lastlog" with no filters (or with filters that don't
filter a lot) and with large amounts of text in the scrollback.
Test case:
/exec seq 1 500000
/lastlog -file log.txt
Thanks to morning for reporting this.
-rw-r--r-- | src/fe-text/textbuffer.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/fe-text/textbuffer.c b/src/fe-text/textbuffer.c index 3668f4c7..fdb95451 100644 --- a/src/fe-text/textbuffer.c +++ b/src/fe-text/textbuffer.c @@ -616,21 +616,23 @@ GList *textbuffer_find_text(TEXT_BUFFER_REC *buffer, LINE_REC *startline, } for (; pre_line != line; pre_line = pre_line->next) - matches = g_list_append(matches, pre_line); + matches = g_list_prepend(matches, pre_line); match_after = after; } if (line_matched || match_after > 0) { /* matched */ - matches = g_list_append(matches, line); + matches = g_list_prepend(matches, line); if ((!line_matched && --match_after == 0) || (line_matched && match_after == 0 && before > 0)) - matches = g_list_append(matches, NULL); + matches = g_list_prepend(matches, NULL); } } + matches = g_list_reverse(matches); + #ifdef USE_GREGEX if (preg != NULL) g_regex_unref(preg); |