Use stack allocation for small counts

This commit is contained in:
2024-10-28 21:51:20 -07:00
parent 3f15db7e82
commit dc16eccf06

View File

@@ -4713,6 +4713,8 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
return;
}
interleaved_insert::Result stackResults[100];
#if __has_attribute(preserve_none) && __has_attribute(musttail)
constexpr int kConcurrent = 16;
interleaved_insert::Job inProgress[kConcurrent];
@@ -4721,8 +4723,12 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
context.count = count;
context.root = root;
context.writes = writes;
context.results = (interleaved_insert::Result *)safe_malloc(
sizeof(interleaved_insert::Result) * count);
context.results = stackResults;
if (count > int(sizeof(stackResults) / sizeof(stackResults[0])))
[[unlikely]] {
context.results = (interleaved_insert::Result *)safe_malloc(
count * sizeof(interleaved_insert::Result));
}
int64_t started = std::min(kConcurrent, count);
context.started = started;
for (int i = 0; i < started; i++) {
@@ -4755,7 +4761,11 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
addPointWrite(getInTree(context.results[i].insertionPoint, this),
context.results[i].remaining, writeVersion, &writeContext);
}
safe_free(context.results, sizeof(interleaved_insert::Result) * count);
if (count > int(sizeof(stackResults) / sizeof(stackResults[0])))
[[unlikely]] {
safe_free(context.results, count * sizeof(interleaved_insert::Result));
}
}
void addWrites(const WriteRange *writes, int count, int64_t writeVersion) {