diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-01-31 14:05:18 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-01-31 14:05:18 +0100 |
| commit | 8a419b7d67feaa587fe0b0b9c3d0521389a4d5ef (patch) | |
| tree | 1386ca524834dbcc386feb210d3ed097ffb91324 | |
| parent | 963c238ff8d3f734bd852669d379e951f4fc7649 (diff) | |
| download | vis-8a419b7d67feaa587fe0b0b9c3d0521389a4d5ef.tar.gz vis-8a419b7d67feaa587fe0b0b9c3d0521389a4d5ef.tar.xz | |
sam: optmize transcript insertion for common case
This esentially performs an insertion sort. Rather than iterating the list
from the start every time keep track of the latest change and optmize for
monotonically increasing file positions.
| -rw-r--r-- | sam.c | 11 | ||||
| -rw-r--r-- | vis-core.h | 1 |
2 files changed, 10 insertions, 2 deletions
@@ -444,8 +444,14 @@ static void change_free(Change *c) { static Change *change_new(Transcript *t, enum ChangeType type, Filerange *range, Win *win, Cursor *cur) { if (!text_range_valid(range)) return NULL; - // TODO optimize for common case - Change **prev = &t->changes, *next = t->changes; + Change **prev, *next; + if (t->latest && t->latest->range.end <= range->start) { + prev = &t->latest->next; + next = t->latest->next; + } else { + prev = &t->changes; + next = t->changes; + } while (next && next->range.end <= range->start) { prev = &next->next; next = next->next; @@ -462,6 +468,7 @@ static Change *change_new(Transcript *t, enum ChangeType type, Filerange *range, new->win = win; new->next = next; *prev = new; + t->latest = new; } return new; } @@ -110,6 +110,7 @@ typedef struct { /** collects all information until an operator is e typedef struct Change Change; typedef struct { Change *changes; /* all changes in monotonically increasing file position */ + Change *latest; /* most recent change */ enum SamError error; /* non-zero in case something went wrong */ } Transcript; |
