Fix performance issue in Paul Heckel's diff algorithm

This commit is contained in:
Fangrui Song 2018-01-14 01:49:41 -08:00
parent a47115208b
commit d099afb0cc

View File

@ -145,6 +145,7 @@ void WorkingFile::ComputeLineMapping() {
buffer_hashes[i++] = h; buffer_hashes[i++] = h;
} }
// Align unique lines.
i = 0; i = 0;
for (auto h : index_hashes) { for (auto h : index_hashes) {
if (from_index[i] >= 0) { if (from_index[i] >= 0) {
@ -159,22 +160,23 @@ void WorkingFile::ComputeLineMapping() {
i++; i++;
} }
std::fill(from_buffer.begin(), from_buffer.end(), -1); // Extending upwards and downwards.
for (i = 0; i < (int)index_hashes.size() - 1; i++) { for (i = 0; i < (int)index_hashes.size() - 1; i++) {
int j = from_index[i]; int j = from_index[i];
if (0 <= j && j + 1 < buffer_hashes.size() && if (0 <= j && j + 1 < buffer_hashes.size() &&
index_hashes[i + 1] == buffer_hashes[j + 1]) { index_hashes[i + 1] == buffer_hashes[j + 1])
from_index[i + 1] = j + 1; from_index[i + 1] = j + 1;
from_buffer[j + 1] = i + 1;
}
} }
for (i = (int)index_hashes.size(); --i > 0; ) { for (i = (int)index_hashes.size(); --i > 0; ) {
int j = from_index[i]; int j = from_index[i];
if (0 < j && index_hashes[i - 1] == buffer_hashes[j - 1]) { if (0 < j && index_hashes[i - 1] == buffer_hashes[j - 1])
from_index[i - 1] = j - 1; from_index[i - 1] = j - 1;
from_buffer[j - 1] = i - 1;
}
} }
std::fill(from_buffer.begin(), from_buffer.end(), -1);
for (i = 0; i < (int)index_hashes.size(); i++)
if (from_index[i] >= 0)
from_buffer[from_index[i]] = i;
} }
optional<int> WorkingFile::GetBufferLineFromIndexLine(int index_line) { optional<int> WorkingFile::GetBufferLineFromIndexLine(int index_line) {