lesismal / nbio

Pure Go 1000k+ connections solution, support tls/http1.x/websocket and basically compatible with net/http, with high-performance and low memory cost, non-blocking, event-driven, easy-to-use.
MIT License
2.11k stars 151 forks source link

请教下关于二进制数据压缩的问题 #431

Closed ericjing83 closed 2 months ago

ericjing83 commented 2 months ago

您好大佬,

我猜,用nbio发送字符串或者文本数据的时候,如果有大量的文本字符是相同的,默认配置下,这个库会进行数据压缩,这样会减小网络传输的带宽。 我现在的生产环境下,有时候需要发送文本数据,有时候需要发送从整数转换成二进制格式的数据(比如用户ID,文档的ID等),数据是这样转换的:整数的数字-->二进制(字符1对应的ascii码是49,但是数字1转为二进制后还是1),然后从二进制-->base64,这样,最终base64格式的数据里会有大量的字符是相同的(一共只有64个字符)。我想了解下,nbio在网络传输过程中,对数据的压缩和解压缩,对于这样的base64数据也适用吗?如果能适用的话,我觉得应该会压缩效果比较好。

lesismal commented 2 months ago

如果是用的nbio 四层,例如 TCP, 那应用层的数据格式或者是否压缩, 应该由应用层自己处理, 你门自己封装下nbio.Conn.Write, 你门自己里面压缩一下就可以了, 这不应该让nbio这种网络框架自己实现. nbio不会提供这种功能的, 因为实在没必要.

lxzan commented 2 months ago

不如应用层直接对二进制数据进行压缩, base64会造成体积膨胀, 也不利于提高压缩率

ericjing83 commented 2 months ago

好的,感谢大佬的建议,我自己实现下二进制的数据压缩。 我测试了下gzip压缩base64数据,在最佳压缩率下,CPU占用率有明显提高,但是压缩后的base64数据占的空间仍然有75~80%左右。所以,gzip我就不准备用了。我自己实现二进制的压缩会性能更好,因为很多整数二进制的高位比特位上,有很多空余的二进制0,造成了带宽浪费。