PR# 5608 buffered_... features in EV_RICH_TEXT slow
Problem Report Summary
Submitter: ericbe
Category: EiffelVision
Priority: Medium
Date: 2005/10/17
Class: Bug
Severity: Serious
Number: 5608
Release: 5.6.1218
Confidential: No
Status: Open
Responsible: misterieking
Environment: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
Synopsis: buffered_... features in EV_RICH_TEXT slow
Description
I'm using an EV_RICH_TEXT and `buffered_append' to display some text in color. It works OK but I noticed that despite the "buffered" word in the feature name it took longer than before (when I was not using EV_RICH_TEXT) to display my text in the window. I made an experiment where I created the RTF string myself before passing it to the widget and I got better performance (see program attached). I also tried to colorize the text after it has been displayed to see if it could improve performance (using calls to EV_RICH_TEXT.modify_region) but the performance was even worse. So my questions are: why is `buffered_append' that slow, and will that be improved or should I keep my implementation where I build the RTF string myself?
To Reproduce
class MAIN_WINDOW inherit EV_TITLED_WINDOW redefine initialize, is_in_default_state end feature {NONE} -- Initialization initialize is -- Initialize `Current'. local font: EV_FONT vbox: EV_VERTICAL_BOX hbox: EV_HORIZONTAL_BOX button: EV_BUTTON do Precursor {EV_TITLED_WINDOW} close_request_actions.extend (agent ((create {EV_ENVIRONMENT}).application).destroy) create vbox create hbox create button button.set_text ("Display colored text") button.select_actions.extend (agent add_colored_text) hbox.extend (button) create button button.set_text ("Display rtf text") button.select_actions.extend (agent add_rtf_text) hbox.extend (button) vbox.extend (hbox) vbox.disable_item_expand (hbox) create rich_text rich_text.disable_word_wrapping vbox.extend (rich_text) vbox.enable_item_expand (rich_text) extend (vbox) create format1 format1.set_color (create {EV_COLOR}.make_with_rgb (0, 0, 0)) font := rich_text.font font.set_height (12) format1.set_font (font) create format2 format2.set_color (create {EV_COLOR}.make_with_rgb (0, 0, 1)) font := rich_text.font font.set_height (12) format2.set_font (font) end add_colored_text is -- local l_length: INTEGER i: INTEGER do set_pointer_style ((create {EV_STOCK_PIXMAPS}).wait_cursor) rich_text.set_text ("") from i := 1 until i > 50_000 loop if i \\ 100 = 0 then rich_text.buffered_append (i.out, format2) else rich_text.buffered_append (i.out, format1) end rich_text.buffered_append (" ", format1) if i \\ 5 = 0 then rich_text.buffered_append ("%N", format1) end i := i + 1 end l_length := rich_text.text_length rich_text.flush_buffer_to (l_length + 1, l_length + 1) set_pointer_style ((create {EV_STOCK_PIXMAPS}).standard_cursor) end add_rtf_text is -- local l_text: STRING i: INTEGER do set_pointer_style ((create {EV_STOCK_PIXMAPS}).wait_cursor) create l_text.make (500_000) l_text.append_string (k_rtf_header) l_text.append_string ("%N\cf1\fs") l_text.append_integer (rich_text.font.height_in_points * 2) l_text.append_string ("%N") from i := 1 until i > 50_000 loop if i \\ 100 = 0 then l_text.append_string (k_rtf_blue) l_text.append_string (i.out) l_text.append_string (k_rtf_end) else l_text.append_string (i.out) end l_text.append_character (' ') if i \\ 5 = 0 then l_text.append_string (k_rtf_newline) end i := i + 1 end l_text.append_string (k_rtf_end) rich_text.set_rtf_text (l_text) set_pointer_style ((create {EV_STOCK_PIXMAPS}).standard_cursor) end rich_text: MY_RICH_TEXT format1: EV_CHARACTER_FORMAT format2: EV_CHARACTER_FORMAT feature {NONE} -- Implementation is_in_default_state: BOOLEAN is -- Is `Current' in its default state? do -- Re-implement if you wish to enable checking -- for `Current'. Result := True end feature {NONE} -- RTF k_rtf_back: STRING is "{\cf1 " k_rtf_blue: STRING is "{\cf2 " k_rtf_end: STRING is "}" k_rtf_newline: STRING is "%N\par " k_rtf_tab: STRING is "\tab " k_rtf_left_brace: STRING is "\{" k_rtf_right_brace: STRING is "\}" k_rtf_backslash: STRING is "\\" k_newline: STRING is "%N" k_tab: STRING is "%T" k_left_brace: STRING is "{" k_right_brace: STRING is "}" k_backslash: STRING is "\" k_rtf_header: STRING is "% %{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033%N% %{\fonttbl%N% % {\f1\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}%N% % {\f0\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}%N% %}%N% %{\colortbl;%N% % \red0\green0\blue0;%N% % \red0\green0\blue255;%N% %}%N% %\tx360\tx720\tx1080\tx1440\tx1800\tx2160\tx2520\tx2880\tx3240\tx3600\tx3960\tx4320% %" end --------------------------------------------------- class MY_RICH_TEXT inherit EV_RICH_TEXT feature set_rtf_text (a_rtf_text: STRING) is -- Set `text' with RTF text `a_rtf_text'. require a_rtf_text_not_void: a_rtf_text /= Void local l_wel_rich_edit: WEL_RICH_EDIT l_stream: WEL_RICH_EDIT_BUFFER_LOADER do l_wel_rich_edit ?= implementation if l_wel_rich_edit /= Void then l_wel_rich_edit.set_text ("") create l_stream.make (a_rtf_text) l_wel_rich_edit.insert_rtf_stream_in (l_stream) end end end
Problem Report Interactions