一亿行挑战(1BRC)top代码精析-使用 SWAR 技术找到分号分隔符

文章介绍了如何使用mmap技术高效地从华氏度数据中定位分号,通过计算long型数据与特定模式的异或结果来判断分号的存在。文章还探讨了如何进一步优化,利用accic字符集的特性简化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上对这段代码相关内容介绍非常少,给出下知识背景:

输入文本格式:

Hamburg;12.0
Bulawayo;8.9
Palembang;38.8
St. John's;15.2
Cracow;12.6
Bridgetown;26.9
Istanbul;6.2
Roseau;34.4
Conakry;31.2
Istanbul;23.0

前面是气象站名称,后面是温度(注意是华氏度)

这里关注一个优化点,如何最高效的分离出;所在的位置。

基本思想:

1. 根据mmap,从文本中一次读取一个64位的数据(通过unsafe),按照long类型读出来

2. 从long类型的数据中确定是否存在;

第二步精析:

1. long SEMICOLON_PATTERN = 0X3BL; // ;的accic码

2. 假设读取到的long类型的数据为0x3B00000000000000L

3. long match = i ^ SEMICOLON_PATTERN

4. 异或的结果是如果存在分号,则必然在某一段字节不为0。如果不存在分号,则全部的字节必然全部不为0.按照示例step2中为例,则前两个字节必然为0.

5. 问题划归到如何判断patternMatch中是否有字段为0的问题

该问题解析为:

long mask = ((match - 0x0101010101010101L) & ~match) & 0x8080808080808080L;

如果mask !=0 ,则必然其中包含分号。如果=0,则不包含。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值