[英]nanopb - how to optimize encoding for runtime speed
我正在使用nanopb
在嵌入式系统上进行日志记录:我的日志记录消息将是.proto
消息。
编码速度是最重要的因素; 我有足够的内存和 flash。
问题
具体到nanopb
,如何最大限度地减少编码时间?
我知道我可以进行的所有 C 优化:内联函数,在 RAM 中设置pb_encode
函数而不是 flash 等
如果我在.proto
文件中使用所有固定大小的类型会有所不同吗?
我知道的简单方法是:
PB_BUFFER_ONLY
。PB_LITTLE_ENDIAN_8BIT
。 不过,它应该在大多数编译器上自动检测到。这些可能会导致速度提高多达 2 倍。
通过编程对编码函数的直接调用,而不是通过消息结构和描述符循环,还可以进一步加快编码速度。 我希望这可以将编码速度提高到 5 倍。 需要一些关于protobuf 编码规范的知识。
例如,对于此消息:
message LogMessage {
uint64 timestamp = 1;
float batterylevel = 2;
string logmessage = 3;
}
你可以这样做:
void writelog(const char *logmsg)
{
uint8_t buffer[256];
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
// Get system state
uint64_t timestamp = get_system_timestamp();
float batterylevel = get_batterylevel();
// Encode timestamp
pb_encode_tag(&stream, PB_WT_VARINT, LogMessage_timestamp_tag);
pb_encode_varint(&stream, timestamp);
// Encode battery level
pb_encode_tag(&stream, PB_WT_32BIT, LogMessage_batterylevel_tag);
pb_encode_fixed32(&stream, &batterylevel);
// If we have explicit message, encode it also.
if (logmsg)
{
pb_encode_tag(&stream, PB_WT_STRING, LogMessage_logmessage_tag);
pb_encode_string(&stream, logmsg, strlen(logmsg));
}
// Save the encoded message data to storage
save_log(buffer, stream.bytes_written);
}
虽然这会导致消息定义的部分硬编码,但 protobuf 消息的向后和向前兼容性照常工作。 标记号可以通过 nanopb 生成器生成的Message_field_tag
宏访问。 字段类型在 C 代码中定义,但它们也嵌入在编码消息中,因此将在解码端检测到任何不匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.