1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-07 20:45:42 +02:00

core: optimize the removal of lines in buffers (a lot faster to clear/close buffers with lot of lines)

The update of variables "buffer_max_length" and "prefix_max_length" in struct
t_gui_lines is now delayed and made during the main refresh (in main loop).

For a buffer with 50K lines, it is up to 3300 times faster to clear/close it.
For a buffer with 4096 lines (default limit), it is up to 120 times faster.
This commit is contained in:
Sebastien Helleu
2013-08-10 17:18:12 +02:00
parent a5cbfdf7fd
commit 6714d6fc82
12 changed files with 81 additions and 33 deletions
+2
View File
@@ -14,6 +14,8 @@ http://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes]
Version 0.4.2 (under dev!)
--------------------------
* core: optimize the removal of lines in buffers (a lot faster to clear/close
buffers with lot of lines)
* core: change color format for options weechat.look.buffer_time_format and
weechat.look.prefix_{action|error|join|network|quit} from `${xxx}` to
`${color:xxx}`
+3 -1
View File
@@ -786,7 +786,9 @@
'first_line_not_read' (integer) +
'lines_hidden' (integer) +
'buffer_max_length' (integer) +
'prefix_max_length' (integer) |
'buffer_max_length_refresh' (integer) +
'prefix_max_length' (integer) +
'prefix_max_length_refresh' (integer) |
|
-
+3 -1
View File
@@ -786,7 +786,9 @@
'first_line_not_read' (integer) +
'lines_hidden' (integer) +
'buffer_max_length' (integer) +
'prefix_max_length' (integer) |
'buffer_max_length_refresh' (integer) +
'prefix_max_length' (integer) +
'prefix_max_length_refresh' (integer) |
|
-
+3 -1
View File
@@ -786,7 +786,9 @@
'first_line_not_read' (integer) +
'lines_hidden' (integer) +
'buffer_max_length' (integer) +
'prefix_max_length' (integer) |
'buffer_max_length_refresh' (integer) +
'prefix_max_length' (integer) +
'prefix_max_length_refresh' (integer) |
|
-
+3 -1
View File
@@ -786,7 +786,9 @@
'first_line_not_read' (integer) +
'lines_hidden' (integer) +
'buffer_max_length' (integer) +
'prefix_max_length' (integer) |
'buffer_max_length_refresh' (integer) +
'prefix_max_length' (integer) +
'prefix_max_length_refresh' (integer) |
|
-
+3 -1
View File
@@ -786,7 +786,9 @@
'first_line_not_read' (integer) +
'lines_hidden' (integer) +
'buffer_max_length' (integer) +
'prefix_max_length' (integer) |
'buffer_max_length_refresh' (integer) +
'prefix_max_length' (integer) +
'prefix_max_length_refresh' (integer) |
|
-
+2 -2
View File
@@ -412,9 +412,9 @@ config_compute_prefix_max_length_all_buffers ()
ptr_buffer = ptr_buffer->next_buffer)
{
if (ptr_buffer->own_lines)
gui_line_compute_prefix_max_length (ptr_buffer->own_lines);
ptr_buffer->own_lines->prefix_max_length_refresh = 1;
if (ptr_buffer->mixed_lines)
gui_line_compute_prefix_max_length (ptr_buffer->mixed_lines);
ptr_buffer->mixed_lines->prefix_max_length_refresh = 1;
}
}
+30
View File
@@ -51,6 +51,7 @@
#include "../gui-filter.h"
#include "../gui-input.h"
#include "../gui-layout.h"
#include "../gui-line.h"
#include "../gui-history.h"
#include "../gui-mouse.h"
#include "../gui-nicklist.h"
@@ -311,6 +312,35 @@ gui_main_refreshs ()
gui_color_buffer_refresh_needed = 0;
}
/* compute max length for prefix/buffer if needed */
for (ptr_buffer = gui_buffers; ptr_buffer;
ptr_buffer = ptr_buffer->next_buffer)
{
/* compute buffer/prefix max length for own_lines */
if (ptr_buffer->own_lines)
{
if (ptr_buffer->own_lines->buffer_max_length_refresh)
{
gui_line_compute_buffer_max_length (ptr_buffer,
ptr_buffer->own_lines);
}
if (ptr_buffer->own_lines->prefix_max_length_refresh)
gui_line_compute_prefix_max_length (ptr_buffer->own_lines);
}
/* compute buffer/prefix max length for mixed_lines */
if (ptr_buffer->mixed_lines)
{
if (ptr_buffer->mixed_lines->buffer_max_length_refresh)
{
gui_line_compute_buffer_max_length (ptr_buffer,
ptr_buffer->mixed_lines);
}
if (ptr_buffer->mixed_lines->prefix_max_length_refresh)
gui_line_compute_prefix_max_length (ptr_buffer->mixed_lines);
}
}
/* refresh window if needed */
if (gui_window_refresh_needed)
{
+3 -4
View File
@@ -1013,7 +1013,7 @@ gui_buffer_set_short_name (struct t_gui_buffer *buffer, const char *short_name)
strdup (short_name) : NULL;
if (buffer->mixed_lines)
gui_line_compute_buffer_max_length (buffer, buffer->mixed_lines);
buffer->mixed_lines->buffer_max_length_refresh = 1;
gui_buffer_ask_chat_refresh (buffer, 1);
hook_signal_send ("buffer_renamed",
@@ -2741,9 +2741,8 @@ gui_buffer_unmerge (struct t_gui_buffer *buffer, int number)
if (ptr_new_active_buffer)
{
gui_line_compute_prefix_max_length (ptr_new_active_buffer->mixed_lines);
gui_line_compute_buffer_max_length (ptr_new_active_buffer,
ptr_new_active_buffer->mixed_lines);
ptr_new_active_buffer->mixed_lines->prefix_max_length_refresh = 1;
ptr_new_active_buffer->mixed_lines->buffer_max_length_refresh = 1;
}
gui_window_ask_refresh (1);
+1 -1
View File
@@ -180,7 +180,7 @@ gui_filter_buffer (struct t_gui_buffer *buffer,
}
if (line_data)
gui_line_compute_prefix_max_length (line_data->buffer->lines);
line_data->buffer->lines->prefix_max_length_refresh = 1;
if (buffer->lines->lines_hidden != lines_hidden)
{
+26 -21
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -60,7 +60,9 @@ struct t_gui_lines
int lines_hidden; /* 1 if at least one line is hidden */
int buffer_max_length; /* max length for buffer name (for */
/* mixed lines only) */
int buffer_max_length_refresh; /* refresh asked for buffer max len. */
int prefix_max_length; /* max length for prefix align */
int prefix_max_length_refresh; /* refresh asked for prefix max len. */
};
/* line functions */