方法
ArrowStreamDecoderget_next_required_size
自:18.0.0 起可用
声明 [源码]
gsize
garrow_stream_decoder_get_next_required_size (
GArrowStreamDecoder* decoder
)
描述 [源码]
此方法提供给想要优化性能的用户。普通用户无需使用此方法。
以下是普通用户的示例用法
garrow_stream_decoder_consume_buffer(decoder, buffer1);
garrow_stream_decoder_consume_buffer(decoder, buffer2);
garrow_stream_decoder_consume_buffer(decoder, buffer3);
解码器具有内部缓冲区。如果已消耗的数据不足以推进解码器的状态,则已消耗的数据将被缓冲到内部缓冲区。这会导致性能开销。
如果将 `garrow_stream_decoer_get_next_required_size()` 返回的大小数据传递给每次 garrow_stream_decoder_consume_bytes()/garrow_stream_decoder_consume_buffer() 调用,则解码器不会使用其内部缓冲区。这将提高性能。
以下是避免使用内部缓冲区的示例用法
buffer1 = get_data(garrow_stream_decoder_get_next_required_size(decoder));
garrow_stream_decoder_consume_buffer(buffer1);
buffer2 = get_data(garrow_stream_decoder_get_next_required_size(decoder));
garrow_stream_decoder_consume_buffer(buffer2);
用户可以使用此方法来避免创建小块。记录批数据必须是连续数据。如果用户将小块传递给解码器,则解码器需要在内部连接小块。这会导致性能开销。
以下是减少小块的示例用法
GArrowResizablBuffer *buffer = garrow_resizable_buffer_new(1024, NULL);
while ((small_chunk = get_data(&small_chunk_size))) {
size_t current_buffer_size = garrow_buffer_get_size(GARROW_BUFFER(buffer));
garrow_resizable_buffer_resize(buffer, current_buffer_size + small_chunk_size,
NULL); garrow_mutable_buffer_set_data(GARROW_MUTABLE_BUFFER(buffer), current_buffer_size, small_chunk, small_chunk_size, NULL); if (garrow_buffer_get_size(GARROW_BUFFER(buffer)) < garrow_stream_decoder_get_next_required_size(decoder)) { continue; } garrow_stream_decoder_consume_buffer(decoder, GARROW_BUFFER(buffer), NULL); g_object_unref(buffer); buffer = garrow_resizable_buffer_new(1024, NULL); } if (garrow_buffer_get_size(GARROW_BUFFER(buffer)) > 0) { garrow_stream_decoder_consume_buffer(decoder, GARROW_BUFFER(buffer), NULL); } g_object_unref(buffer);
可用版本:自 18.0.0 起