Skip to content

Commit f029c39

Browse files
committed
Op: Make the functions in DataBuffer inline
`DataBuffer` is the basic buffer manager of pax. Make frequently called methods to inline can reduce some instruction calls.
1 parent 3273f75 commit f029c39

2 files changed

Lines changed: 54 additions & 93 deletions

File tree

contrib/pax_storage/src/cpp/storage/pax_buffer.cc

Lines changed: 0 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,6 @@ void BlockBufferBase::Set(char *ptr, size_t size) {
2525
block_pos_ = ptr;
2626
}
2727

28-
void BlockBufferBase::Write(char *ptr, size_t size) {
29-
Assert(block_pos_ + size <= block_buffer_.End());
30-
memcpy(block_pos_, ptr, size);
31-
}
32-
33-
void BlockBufferBase::WriteZero(size_t size) {
34-
Assert(block_pos_ + size <= block_buffer_.End());
35-
memset(block_pos_, 0, size);
36-
}
37-
3828
void BlockBufferBase::Combine(const BlockBufferBase &buffer) {
3929
Assert(Available() > buffer.Used());
4030
Write(buffer.block_buffer_.Start(), buffer.Used());
@@ -62,16 +52,6 @@ template <typename T> // NOLINT: redirect constructor
6252
DataBuffer<T>::DataBuffer(size_t size)
6353
: DataBuffer(nullptr, size, false, true) {}
6454

65-
template <typename T>
66-
T &DataBuffer<T>::operator[](size_t i) {
67-
return data_buffer_[i];
68-
}
69-
70-
template <typename T>
71-
size_t DataBuffer<T>::GetSize() {
72-
return Used() / sizeof(T);
73-
}
74-
7555
template <typename T>
7656
DataBuffer<T>::~DataBuffer() {
7757
if (mem_take_over_ && data_buffer_) {
@@ -100,46 +80,6 @@ void DataBuffer<T>::Reset() {
10080
data_buffer_ = nullptr;
10181
}
10282

103-
template <typename T>
104-
void DataBuffer<T>::Write(T value) {
105-
Assert(block_pos_ + sizeof(T) <= block_buffer_.End());
106-
*(reinterpret_cast<T *>(block_pos_)) = value;
107-
}
108-
109-
template <typename T>
110-
void DataBuffer<T>::Write(T *ptr, size_t size) {
111-
Assert(size % sizeof(T) == 0 && (block_pos_ + size) <= block_buffer_.End());
112-
memcpy(block_pos_, reinterpret_cast<const char *>(ptr), size);
113-
}
114-
115-
template <typename T>
116-
void DataBuffer<T>::Write(const T *ptr, size_t size) {
117-
Assert(size % sizeof(T) == 0 && (block_pos_ + size) <= block_buffer_.End());
118-
memcpy(block_pos_, reinterpret_cast<const char *>(ptr), size);
119-
}
120-
121-
template <typename T>
122-
void DataBuffer<T>::Read(T *dst) {
123-
Assert(Used() > sizeof(T) && Used() <= Capacity());
124-
memcpy(dst, block_pos_, sizeof(T));
125-
}
126-
127-
template <typename T>
128-
void DataBuffer<T>::Read(void *dst, size_t n) {
129-
Assert(Used() > n && Used() <= Capacity());
130-
memcpy(dst, block_pos_, n);
131-
}
132-
133-
template <typename T>
134-
T *DataBuffer<T>::GetBuffer() const {
135-
return data_buffer_;
136-
}
137-
138-
template <typename T>
139-
T *DataBuffer<T>::GetAvailableBuffer() const {
140-
return data_buffer_ + Used();
141-
}
142-
14383
template <typename T>
14484
void DataBuffer<T>::ReSize(size_t size, double mul_ratio) {
14585
Assert(mul_ratio > 1);
@@ -175,24 +115,6 @@ void DataBuffer<T>::ReSize(size_t size) {
175115
BlockBufferBase::Set(reinterpret_cast<char *>(data_buffer_), size, used);
176116
}
177117

178-
template <typename T>
179-
bool DataBuffer<T>::IsMemTakeOver() const {
180-
return mem_take_over_;
181-
}
182-
183-
template <typename T>
184-
void DataBuffer<T>::SetMemTakeOver(bool take_over) {
185-
mem_take_over_ = take_over;
186-
}
187-
188-
template <typename T>
189-
void DataBuffer<T>::Clear() {
190-
if (mem_take_over_ && data_buffer_) {
191-
cbdb::Pfree(data_buffer_);
192-
}
193-
data_buffer_ = nullptr;
194-
}
195-
196118
template class DataBuffer<char>;
197119
template class DataBuffer<int8>;
198120
template class DataBuffer<int16>;

contrib/pax_storage/src/cpp/storage/pax_buffer.h

Lines changed: 54 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,16 @@ class BlockBufferBase {
7777

7878
virtual void Set(char *ptr, size_t size);
7979

80-
void Write(char *ptr, size_t size);
80+
inline void Write(char *ptr, size_t size) {
81+
Assert(block_pos_ + size <= block_buffer_.End());
82+
memcpy(block_pos_, ptr, size);
83+
}
84+
85+
inline void WriteZero(size_t size) {
86+
Assert(block_pos_ + size <= block_buffer_.End());
87+
memset(block_pos_, 0, size);
88+
}
8189

82-
void WriteZero(size_t size);
8390

8491
void Combine(const BlockBufferBase &buffer);
8592

@@ -139,12 +146,16 @@ class DataBuffer : public BlockBufferBase {
139146
data_buffer_(reinterpret_cast<T *>(data_buffer.data_buffer_)) {}
140147

141148
// Direct access elements of internal buffer
142-
T &operator[](size_t i);
149+
inline T &operator[](size_t i) {
150+
return data_buffer_[i];
151+
}
143152

144-
T *StartT() const { return data_buffer_; }
153+
inline T *StartT() const { return data_buffer_; }
145154

146155
// Get size of elements of internal buffer
147-
size_t GetSize();
156+
inline size_t GetSize() {
157+
return Used() / sizeof(T);
158+
}
148159

149160
~DataBuffer() override;
150161

@@ -160,22 +171,41 @@ class DataBuffer : public BlockBufferBase {
160171

161172
// Direct write a element into available buffer
162173
// Should call `Brush` after write
163-
virtual void Write(T value);
174+
inline void Write(T value) {
175+
Assert(block_pos_ + sizeof(T) <= block_buffer_.End());
176+
*(reinterpret_cast<T *>(block_pos_)) = value;
177+
}
164178

165-
virtual void Write(T *ptr, size_t size);
179+
inline void Write(T *ptr, size_t size) {
180+
Assert(size % sizeof(T) == 0 && (block_pos_ + size) <= block_buffer_.End());
181+
memcpy(block_pos_, reinterpret_cast<const char *>(ptr), size);
182+
}
166183

167-
virtual void Write(const T *ptr, size_t size);
184+
inline void Write(const T *ptr, size_t size) {
185+
Assert(size % sizeof(T) == 0 && (block_pos_ + size) <= block_buffer_.End());
186+
memcpy(block_pos_, reinterpret_cast<const char *>(ptr), size);
187+
}
168188

169189
// Read all to dst pointer
170-
virtual void Read(T *dst);
190+
inline void Read(T *dst) {
191+
Assert(Used() > sizeof(T) && Used() <= Capacity());
192+
memcpy(dst, block_pos_, sizeof(T));
193+
}
171194

172-
virtual void Read(void *dst, size_t n);
195+
inline void Read(void *dst, size_t n) {
196+
Assert(Used() > n && Used() <= Capacity());
197+
memcpy(dst, block_pos_, n);
198+
}
173199

174200
// Get the internal buffer pointer
175-
T *GetBuffer() const;
201+
inline T *GetBuffer() const {
202+
return data_buffer_;
203+
}
176204

177205
// Get the available buffer pointer
178-
T *GetAvailableBuffer() const;
206+
inline T *GetAvailableBuffer() const {
207+
return data_buffer_ + Used();
208+
}
179209

180210
// Resize the internal buffer, size should bigger than capacity of internal
181211
// buffer `mem_take_over` should be true
@@ -188,13 +218,22 @@ class DataBuffer : public BlockBufferBase {
188218
virtual void ReSize(size_t size);
189219

190220
// Is current internal buffer take over by DataBuffer
191-
bool IsMemTakeOver() const;
221+
inline bool IsMemTakeOver() const {
222+
return mem_take_over_;
223+
}
192224

193-
void SetMemTakeOver(bool take_over);
225+
inline void SetMemTakeOver(bool take_over) {
226+
mem_take_over_ = take_over;
227+
}
194228

195229
// Clear up the DataBuffer
196230
// Caller should call `Set` to reuse current `DataBuffer` after call `Clear`
197-
virtual void Clear();
231+
inline void Clear() {
232+
if (mem_take_over_ && data_buffer_) {
233+
cbdb::Pfree(data_buffer_);
234+
}
235+
data_buffer_ = nullptr;
236+
}
198237

199238
protected:
200239
bool mem_take_over_;

0 commit comments

Comments
 (0)