最高效的进制是什么?

初学二进制的时候,老师喜欢问一个问题,为何二进制很重要?同学们喜欢这么回答:因为二进制非常有趣、容易理解而且更加高效!我非常清楚,对他们而言,二进制并不有趣,也不容易,更为重要的是,他们不知道什么进制更加高效。原谅我的夸张,大多数人(包括学计算机数十年的老手)也不见得知道什么进制最高效。因为,老师从来不教,而且问这样的问题有意思吗?嗯哼,看看下面的分析再下结论吧。

首先,我们先定义电路的开销。二进制有两种状态,如果把二进制电路的开销定为2(两个单位开销),那么三进制有三种状态,开销就是3,四进制有四个状态则开销就是4。因此,我们可令b进制电路的开销为b。

其次,b进制如果要表达0到M范围的值需要log_b( M + 1 ) (即,以b为底对M+1求对数)这么多电路。比如,如果是二进制要表达0-255,则需要log( 256 ) = 8个比特。 又比如,用十进制表示0-999需要log_10(1000)=3个十进制数。

接着,就可以定义表达这M+1个数所使用电路的开销,简单的乘法得:
c = k*log_b(M+1)*b (公式1)
其中,k是一个比例常数。

然后,就需要使用一点点高等数学的知识了。把c理解为b的函数,该函数会在导数为零处达到极值,因此,要对c进行求导。有一个技巧就是,先对log_b(M+1)进行换底(高中的换底公式没有忘记吧,刚高考完的大一新生们?)得到以e为底的自然对数表达:ln (M+1) / ln b 。其好处还是明显的,把M+1这一项独立出来。运用链式法则,整理得:
c‘ = k*ln (M+1) * (ln b - 1 )/ (ln b)^2
该公式在ln b - 1时为0,即 b为e (2.718,欧拉常数,又称纳皮尔常数,我最近才知道这个名字。)时为零。因此,三进制是最高效的进制。

最后,二进制与三进制差别有多大呢?使用公式1,很容易算:
c(2) : c(3) = 2*ln 3 : 3*ln 2 = 1.056
结论是,二进制比三进制稍微开销大那么一点点。如果结合二进制电路在实现上的优势,这点开销也许就可以忽略不计。

以上分析展示了一种分析问题解决问题的典范实例,可推广称为通用方法,值得学习。就结论本身而言,也许还不如提出问题更有价值。

本文的分析源自于Henry S. Warren的《Hacker's delight》,目前是第二版,有中文翻译版(不建议购买),值得阅读,是一本内涵深刻的算法书,尽管名字有点古怪。
<think>嗯,用户问为什么二进制传输快,我需要仔细解释清楚。之前他们问过前后端数据传输方式,现在可能是在深入理解其中的细节。首先,得明确二进制传输和文本传输的区别。 二进制数据,比如图片、视频或者序列化的协议缓冲(Protobuf),通常体积更小。因为文本格式如JSON或XML会有很多冗余的字符,比如引号、逗号、标签等,而二进制直接用紧凑的字节表示,减少了这些额外开销。比如数字12345,JSON会用五个字符,而二进制可能只用两个字节。这个体积的减少直接减少了传输时间,特别是在网络带宽有限的情况下,效果更明显。 然后是解析速度。文本数据需要解析字符串,转换成对应的数据结构,这个过程可能比较耗时,尤其是复杂或庞大的数据。而二进制数据有固定的结构,解析时可以直接按预定义的格式读取,不需要分词或语法分析,所以更快。例如Protobuf解码比JSON快很多,因为不需要处理语法结构。 还有编码和解码的效率。文本数据通常需要序列化和反序列化,比如JSON.stringify和JSON.parse,这些操作在JavaScript中是相对耗时的。而二进制格式的编码解码通常更高效,尤其是使用像Protobuf这样的库,它们经过优化,处理速度更快。 另外,二进制协议如HTTP/2使用二进制分帧层,相比HTTP/1.1的文本格式,处理起来更高效,减少了解析的复杂性,提高了传输速度。这也是为什么HTTP/2在性能上有显著提升的原因之一。 可能用户的应用场景涉及大量数据传输,比如实时游戏、视频流或者高频交易,这些情况下二进制传输的优势更明显。需要强调二进制在特定场景下的必要性,比如对延迟敏感的应用。 还要考虑用户可能存在的疑问,比如二进制是否更难处理。可以提到虽然二进制需要预先定义结构(比如.proto文件),但现代工具如Protobuf提供了方便的代码生成工具,简化了开发流程。 另外,安全性方面,二进制数据虽然本身不加密,但结合加密协议如HTTPS,同样可以保证安全传输。不过这可能不是用户当前的重点,但可以简要提及。 总结时,要分点列出原因:体积小、解析快、编码高效、协议优化。同时结合具体例子,比如数字存储、Protobuf的使用,以及HTTP/2的改进,帮助用户更好地理解。后,可能需要建议用户根据实际需求选择合适的数据格式,平衡开发便利性和性能需求。</think>前后端数据传输中,二进制传输之所以更快,主要是因为它在**数据体积、解析效率、编码方式**等方面具有显著优势。以下是具体原因的分层解释: --- ### **一、体积更小:减少网络传输时间** 二进制数据直接以字节(Byte)形式存储,避免了文本格式的冗余字符,从而大幅压缩数据体积: - **文本格式的冗余** 例如,JSON 或 XML 中需要大量引号、逗号、标签等符号描述数据结构: ```json { "id": 123, "name": "Alice" } // 27字节(含空格) ``` 而二进制格式(如 Protobuf)直接存储数据内容,无需冗余符号: ```plaintext 0x08 7B 12 05 41 6C 69 63 65 // 9字节(id=123, name=Alice) ``` - **数值存储效率** 文本格式中数值以字符串形式传输(如 `"12345"` 占用 5 字节),二进制则直接存储为紧凑的二进制数值(如 `0x3039` 仅 2 字节)。 --- ### **二、解析更快:避免复杂的语法分析** 二进制数据通常基于**预定义的结构**(如 Protobuf 的 `.proto` 文件),解析时无需处理复杂语法: - **文本解析开销** JSON/XML 需要分词(Tokenization)、语法树构建(Parsing)、类型转换等步骤: ```javascript JSON.parse('{"id": 123}'); // 需解析引号、冒号、括号,并转为数字类型 ``` - **二进制直接映射内存** 二进制数据按固定偏移量读取,例如 Protobuf 解码时直接通过预编译的代码将字节映射到内存中的对象: ```javascript // Protobuf 解码(伪代码) const buffer = new Uint8Array([0x08, 0x7B]); const user = User.decode(buffer); // 直接读取字节位置,无需语法解析 ``` --- ### **三、编码/解码效率更高** 二进制编码器(如 Protobuf、MessagePack)针对性能优化,远快于文本序列化: - **文本序列化的性能瓶颈** JSON 的 `stringify`/`parse` 在 JavaScript 中是基于递归的文本操作,效率较低: ```javascript // 大型 JSON 解析可能阻塞主线程 const data = JSON.parse(largeJSONString); ``` - **二进制编码器的优化** Protobuf 等工具通过预生成编解码代码,直接操作内存缓冲区,避免动态类型判断: ```javascript // Protobuf 编码(伪代码) const buffer = User.encode({ id: 123 }).finish(); // 预编译的编码函数,直接操作字节 ``` --- ### **四、协议层的优化支持** 现代协议(如 HTTP/2、gRPC)基于二进制分帧设计,天然适合二进制传输: - **HTTP/1.1 的文本缺陷** HTTP/1.1 使用纯文本格式(如请求头、换行符分隔),需逐行解析,效率低下。 - **HTTP/2 的二进制分帧** HTTP/2 将数据拆分为二进制帧(Frame),每个帧有明确的长度和类型,解析速度极快: ```plaintext +---------------------+ | Length (24 bits) | // 帧长度 | Type (8 bits) | // 帧类型(HEADERS、DATA 等) | Flags (8 bits) | // 标志位 | Stream ID (31 bits) | // 流标识 | Payload (变长) | // 数据内容 +---------------------+ ``` --- ### **五、适用场景示例** | **场景** | **二进制优势** | **典型工具** | |------------------|-------------------------------------------|-----------------------| | 实时游戏 | 高频小数据包,低延迟需求 | Protobuf + WebSocket | | 视频流传输 | 减少海量数据体积 | H.264/HEVC 编码 | | 物联网设备通信 | 节省设备资源(CPU、带宽) | MessagePack | | 微服务间调用 | 高效序列化 + HTTP/2 多路复用 | gRPC | --- ### **总结:为什么二进制更快?** 1. **体积更小**:消除冗余字符,紧凑存储数据。 2. **解析更快**:按预定义结构直接读取,无需分词和语法分析。 3. **编码高效**:预编译的编解码器直接操作内存。 4. **协议优化**:HTTP/2、gRPC 等协议原生支持二进制分帧。 因此,在对性能敏感的场景(如实时通信、高频数据传输)中,二进制传输通常是首选方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值