optimize C API to reduce memory allocations and using PinnableSlice for zero-copy reads #13911
+274
−13
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
The current C API implementation has inefficiencies that impact performance in production environments:
std::string
, then copied again into a malloc'd bufferstd::string
as intermediate storage adds allocation/deallocation overheadsizeof(char)
multiplicationSolution
1. Use PinnableSlice for Get Operations
DB::Get() → std::string → malloc'd buffer
(2 allocations, 2 copies)DB::Get() → PinnableSlice → malloc'd buffer
(1 allocation, 1 copy)2. Optimize CopyString Helper
sizeof(char)
multiplicationSlice
parameter (works with all types via implicit conversion)inline
for better optimization3. New Zero-Copy API Functions
Added high-performance alternatives for allocation-sensitive workloads:
rocksdb_pinnable_handle_*
- Handle management functionsPerformance Improvements
Functions Optimized (30+)
Testing
Migration Path
Applications can adopt improvements in three ways: