Use stack allocation for small counts
This commit is contained in:
@@ -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) {
|
||||
|
Reference in New Issue
Block a user