wiki:TEXT_PERFORMANCE_R0

Version 7 (modified by kyli, 15 years ago) (diff)

--

Error: Macro BackLinksMenu(None) failed
compressed data is corrupt

Error: Macro TicketQuery(summary=TEXT_PERFORMANCE_R0, format=table, col=summary|owner|status|type|component|priority|effort|importance, rows=description|analysis_owners|analysis_reviewers|analysis_score|design_owners|design_reviewers|design_score|implementation_owners|implementation_reviewers|implementation_score|test_owners|test_reviewers|test_score|) failed
current transaction is aborted, commands ignored until end of transaction block

Analysis

Overview

Text performance is bad. The purpose of this task is to improve it and make Sophie usable with large text (see the Comments section). At the first revision, known bottlenecks should be attacked and fixed and a way to measure performance should be established. At next revisions, profiling should be performed to find other bottlenecks that slow down the text. These should be fixed as well.

Task requirements

  • The following issues that are known to affect text performance should be fixed:
    • Text processors - they should have a faster implementation. Currently their naive implementation processes the whole text after every keystroke, which is very slow.
    • Properties in BaseTextModel - they should be reduced as their constant re-computation causes slowdown.
    • Mark and caret positions - when navigating through the text or typing, mark and caret positions are moved separately, which leads to processing the text twice.
  • Tests should be extended to show text processors performance. At later revisions, they should be extended to serve as profilers.

Task result

Source code

Implementation idea

  • Text processors should not process the whole text but instead only the portion of it that has changed.
  • The processedText property in BaseTextModel is computationally heavy and should be changed if possible.
  • Mark and caret positions can be combined in a single property since they are the same in most cases (except selection).
  • Text performance is best measured by running automatic tests. A set of predefined and fixed text resources should be created and used in the tests. Performance of each individual task should be tested - e.g. importing, typing, deleting, changing styles, chaining, wrapping, etc.

TEXT_MODEL_REDESIGN

How to demo

  • Show the better performance by pasting a large text and editing it.
  • Run the performance tests written and describe the results.
  • (internal) Show and describe the implementation of one of the processors.
  • (internal) Show and describe the improved BaseTextModel.

Design

What should the test measure:

  • Insert a large text in s frame (like a paste will do);
  • Simulate pressing left / right arrows (navigation);
  • Simulate typing several chars in the frame;
  • Select some text;
  • Simulate backspace (deleting the selection);
  • Press "Undo";
  • Apply a link to the text;
  • write some more chars in the text.

The test will extend SystemTestBase, since it is the only testbase that starts the whole app. Thus we will be able to take in mind other factors like halo menus. It will perform these things and print the result in milliseconds. Unnecessary modules will not be started (alternative skin, for example). All the measurements will be placed in one test case, since starting the app for every case will be very slow.

Create class SelectionInfo, which will hold the mark and caret positions. It will be immutable, 2 private final int fields - mark and caret. A default constructor will be provided, as well as getters for the mark and caret indices. Also, generated hashcode() and equals() and public static SelectionInfo DEFAULT = new SelectionInfo(-1, -1) (values are same to the current default values for the mark and caret);

In BaseTextModel, delete mark() and caret(), instead create private RwProp<SelectionInfo> selectionInfo(), with a default value of SelectionInfo.DEFAULT.

Replace getMark() and getCaret() with getSelectionInfo(). Replace setMark() and setCaret() with setSelectionInfo(). I think the purpose of these methods is clear, as is their usage.

Implementation

Describe and link the implementation results here (from the wiki or the repository).

Testing

Place the testing results here.

Comments

"Large text" is currently defined as the text contained within 100 standard-sized frames, each one on its own page.