Speed up single-line deltas

2e6f12725b slowed down the application of
deltas that only affect a single line. The slow-down, though trivial for
a single line, is significant for operations than separately modify
thousands of rows (such as indenting a large document).

This commit speeds up single-line deltas by avoiding unnecessary calls
to splitLine() and joinLineWithNext().
This commit is contained in:
aldendaniels 2014-01-01 14:45:54 -06:00
commit 612478e39f

View file

@ -261,9 +261,13 @@ var Document = function(textOrLines) {
throw errorText; throw errorText;
} }
// Validate action.
if (delta.action != 'insert' && delta.action != 'delete')
fnThrow('Delta action must be "insert" or "delete".');
// Validate lines. // Validate lines.
if (!delta.lines instanceof Array) if (!delta.lines instanceof Array)
fnThrow('Delta object lines must be an array'); fnThrow('Delta lines must be an array');
// Validate range type. // Validate range type.
if (!delta.range instanceof Range) if (!delta.range instanceof Range)
@ -567,8 +571,30 @@ var Document = function(textOrLines) {
this.$validateDelta(delta); this.$validateDelta(delta);
// Apply delta. // Apply delta.
switch (delta.action) if (delta.range.start.row == delta.range.end.row)
{ {
// Apply single-line delta.
// Note: The multi-line code below correctly handle single-line
// deltas too, but we need to short-circuit for speed.
var row = delta.range.start.row;
var startColumn = delta.range.start.column;
var endColumn = delta.range.end.column;
var line = this.$lines[row];
switch (delta.action) {
case 'insert':
this.$lines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);
break;
case 'delete':
this.$lines[row] = line.substring(0, startColumn) + line.substring(endColumn);
break;
}
} else {
// Apply multi-line delta.
switch (delta.action) {
case 'insert': case 'insert':
splitLine(this.$lines, delta.range.start); splitLine(this.$lines, delta.range.start);
for (var i = 0; i < delta.lines.length; i++) { for (var i = 0; i < delta.lines.length; i++) {
@ -588,9 +614,7 @@ var Document = function(textOrLines) {
); );
joinLineWithNext(this.$lines, delta.range.start.row); joinLineWithNext(this.$lines, delta.range.start.row);
break; break;
}
default:
throw 'Invalid delta type: ' + delta.action
} }
this._emit("change", { data: delta }); this._emit("change", { data: delta });