Skip to content

Commit 27d229a

Browse files
committed
Huge optimization to index building: don't use back_inserter!
1 parent f4fc9a4 commit 27d229a

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

src/LineFinder.cpp

+11-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
#include "LineSink.h"
44

5-
#include <algorithm>
65
#include <cstring>
76

87
LineFinder::LineFinder(LineSink &sink)
@@ -18,7 +17,7 @@ void LineFinder::add(const uint8_t *data, uint64_t length, bool last) {
1817
lineData(data, lineEnd);
1918
data = lineEnd + 1;
2019
} else {
21-
std::copy(data, endData, std::back_inserter(lineBuffer_));
20+
append(data, endData);
2221
break;
2322
}
2423
}
@@ -36,7 +35,7 @@ void LineFinder::lineData(const uint8_t *begin, const uint8_t *end) {
3635
reinterpret_cast<const char *>(begin), end - begin);
3736
length = (end - begin) + 1;
3837
} else {
39-
std::copy(begin, end, std::back_inserter(lineBuffer_));
38+
append(begin, end);
4039
shouldAddLine = sink_.onLine(lineOffsets_.size() + 1, currentLineOffset_,
4140
&lineBuffer_[0], lineBuffer_.size());
4241
length = lineBuffer_.size() + 1;
@@ -46,3 +45,12 @@ void LineFinder::lineData(const uint8_t *begin, const uint8_t *end) {
4645
lineOffsets_.emplace_back(currentLineOffset_);
4746
currentLineOffset_ += length;
4847
}
48+
49+
void LineFinder::append(const uint8_t *begin, const uint8_t *end) {
50+
// Was: std::copy(begin, end, std::back_inserter(lineBuffer_));
51+
// but it turns out that's pretty slow... so let's do this instead:
52+
auto offset = lineBuffer_.size();
53+
auto size = end - begin;
54+
lineBuffer_.resize(offset + size);
55+
std::memcpy(lineBuffer_.data() + offset, begin, size);
56+
}

src/LineFinder.h

+1
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ class LineFinder {
2626

2727
private:
2828
void lineData(const uint8_t *begin, const uint8_t *end);
29+
void append(const uint8_t *begin, const uint8_t *end);
2930
};

0 commit comments

Comments
 (0)