如何快速检测是否为空白字符

article/2025/8/17 16:15:09

作者:温绍锦(高铁)   阿里云计算平台团队

在Parser场景,包括SQL Parser和JSON Parser,如何更快检测空白字符是一个提升性能的关键点。笔者有多年SQL Parser和JSON Parser的经验,把我所知道的一些检测空白的方法分享给大家。

一、什么是空白字符

如果采用json.org的标准,空白字符包括:

'\b' -- ASCII 8
'\t' -- ASCII 9
'\n' -- ASCII 10
'\f' -- ASCII 12
'\r' -- ASCII 13
' '  -- ASCII 32

二、检测空白字符的5种方法

2.1 方法1

JDK的Character提供了isWhiteSpace方法,逻辑不能定制化,不支持上面的'\b'字符判空,但为了性能比较,也加入进来。

boolean space = Character.isWhitespace(ch);

2.1 方法2

这个常规办法,用6个并列的or判断。所有的字符检测都需要做6次判断,性能较差。

boolean space = ch == ' '|| ch == '\n'|| ch == '\r'|| ch == '\f'|| ch == '\t'|| ch == '\b';

2.2 方法3

由于空白字符最大的是空格ASCII 32,在方法2的基础上先做一个预先检测,这样就能获得非常好的性能,但当输入的有大量空白字符\b时,就就会面临方法2的问题。fastjson 1.x ( GitHub - alibaba/fastjson: A fast JSON parser/generator for Java. )判空用的是这个方法。

boolean space = ch <= ' '&& (ch == ' '|| ch == '\n'|| ch == '\r'|| ch == '\f'|| ch == '\t'|| ch == '\b');

2.3 方法4

这种算法,在JDK 17下性能有较大提升。在大量输入是非空字符时,性能并不出色。

boolean space;
switch (ch) {case ' ':case '\n':case '\r':case '\t':case '\b':case '\f':space = true;break;default:space = false;break;
}

2.4 方法5

通过预计算一个常量的long,然后做bitAnd判断。
fastjson2 ( GitHub - alibaba/fastjson2: 🚄 FASTJSON2是FASTJSON项目的重要升级,目标是为下一个十年提供一个高性能的JSON库 )判空用的是这个方法。

static final long SPACE = (1L << ' ') | (1L << '\n') | (1L << '\r') | (1L << '\f') | (1L << '\t') | (1L << '\b');boolean space = ch <= ' ' && ((1L << ch) & SPACE) != 0;

三、测试环境

3.1 x86服务器

使用阿里云x64当前代计算型4核8G服务器,CPU型号 Intel Xeon(Ice Lake) Platinum 8369B

3.2 ARM服务器

使用阿里云ARM当前代计算型4核8G服务器,CPU型号 Ampere Altra / AltraMax

3.3 JDK

下载Oracle最新的LTS版本Linux JDK

jdk1.8.0_333_x64
jdk-11.0.15.1_x64
jdk-17.0.3.1_x64
jdk1.8.0_333_aarch64
jdk-11.0.15.1_aarch64
jdk-17.0.3.1_aarch64

3.4 测试数据

{"images": [{"height":768,"size":"LARGE","title":"Javaone Keynote","uri":"http://javaone.com/keynote_large.jpg","width":1024}, {"height":240,"size":"SMALL","title":"Javaone Keynote","uri":"http://javaone.com/keynote_small.jpg","width":320}],"media": {"bitrate":262144,"duration":18000000,"format":"video/mpg4","height":480,"persons": ["Bill Gates","Steve Jobs"],"player":"JAVA","size":58982400,"title":"Javaone Keynote","uri":"http://javaone.com/keynote.mpg","width":640}
}

3.5 测试代码及运行方法

测试代码:
fastjson2/benchmark/src/main/java/com/alibaba/fastjson2/benchmark at main · alibaba/fastjson2 · GitHub

执行测试代码

git clone https://github.com/alibaba/fastjson2
cd fastjson2
mvn clean install -Dmaven.test.skip
java -cp benchmark/target/fastjson2-benchmarks.jar com.alibaba.fastjson2.benchmark.SpaceCheckBenchmark

四、JMH测试结果

4.1 x64测试结果

JDK8JDK11JDK17
方法11756.8841692.2151770.658
方法21911.8201866.8881903.105
方法33496.6294228.9723956.434
方法42798.6792910.5252876.148
方法53522.4623694.0074474.286
  • 原始数据
### jdk1.8.0_333_x64
Benchmark                                   Mode  Cnt     Score      Error   Units
SpaceCheckBenchmark.CharacterIsWhitespace  thrpt    5  1756.884 ?    2.202  ops/ms
SpaceCheckBenchmark.spaceOr                thrpt    5  1911.820 ?    5.965  ops/ms
SpaceCheckBenchmark.spaceOrPreCheck        thrpt    5  3496.629 ?  739.373  ops/ms
SpaceCheckBenchmark.spaceSwitch            thrpt    5  2798.679 ? 1024.227  ops/ms
SpaceCheckBenchmark.spaceBitAnd            thrpt    5  3522.462 ?  859.084  ops/ms### jdk-11.0.15.1_x64
Benchmark                                   Mode  Cnt     Score     Error   Units
SpaceCheckBenchmark.CharacterIsWhitespace  thrpt    5  1692.215 ? 363.925  ops/ms
SpaceCheckBenchmark.spaceOr                thrpt    5  1866.888 ?  33.836  ops/ms
SpaceCheckBenchmark.spaceOrPreCheck        thrpt    5  4228.972 ? 212.870  ops/ms
SpaceCheckBenchmark.spaceSwitch            thrpt    5  2910.525 ? 584.406  ops/ms
SpaceCheckBenchmark.spaceBitAnd            thrpt    5  3694.007 ? 158.193  ops/ms### jdk-17.0.3.1_x64
Benchmark                                   Mode  Cnt     Score     Error   Units
SpaceCheckBenchmark.CharacterIsWhitespace  thrpt    5  1770.658 ? 651.168  ops/ms
SpaceCheckBenchmark.spaceOr                thrpt    5  1903.105 ?  40.520  ops/ms
SpaceCheckBenchmark.spaceOrPreCheck        thrpt    5  3956.434 ? 628.745  ops/ms
SpaceCheckBenchmark.spaceSwitch            thrpt    5  2876.148 ? 127.401  ops/ms
SpaceCheckBenchmark.spaceBitAnd            thrpt    5  4474.286 ? 539.261  ops/ms

4.1 ARM测试结果

JDK8JDK11JDK17
方法1911.795785.3391269.834
方法2789.439833.830842.177
方法32304.4192429.9072146.953
方法4880.3871124.9671540.419
方法52363.9572392.1232570.536
  • 原始数据
### jdk1.8.0_333_aarch64
Benchmark                                   Mode  Cnt     Score     Error   Units
SpaceCheckBenchmark.CharacterIsWhitespace  thrpt    5   911.795 ?   5.171  ops/ms
SpaceCheckBenchmark.spaceOr                thrpt    5   789.439 ? 163.867  ops/ms
SpaceCheckBenchmark.spaceOrPreCheck        thrpt    5  2304.419 ?  29.643  ops/ms
SpaceCheckBenchmark.spaceSwitch            thrpt    5   880.387 ?  63.411  ops/ms
SpaceCheckBenchmark.spaceBitAnd            thrpt    5  2363.957 ? 759.335  ops/ms### jdk-11.0.15.1_aarch64
Benchmark                                   Mode  Cnt     Score     Error   Units
SpaceCheckBenchmark.CharacterIsWhitespace  thrpt    5   785.339 ?   5.361  ops/ms
SpaceCheckBenchmark.spaceOr                thrpt    5   833.830 ?  14.402  ops/ms
SpaceCheckBenchmark.spaceOrPreCheck        thrpt    5  2429.907 ?   9.120  ops/ms
SpaceCheckBenchmark.spaceSwitch            thrpt    5  1124.967 ? 811.435  ops/ms
SpaceCheckBenchmark.spaceBitAnd            thrpt    5  2392.123 ? 381.551  ops/ms### jdk-17.0.3.1_aarch64
Benchmark                                   Mode  Cnt     Score     Error   Units
SpaceCheckBenchmark.CharacterIsWhitespace  thrpt    5  1269.834 ?   5.587  ops/ms
SpaceCheckBenchmark.spaceOr                thrpt    5   842.177 ?   7.969  ops/ms
SpaceCheckBenchmark.spaceOrPreCheck        thrpt    5  2146.953 ? 518.320  ops/ms
SpaceCheckBenchmark.spaceSwitch            thrpt    5  1540.419 ?  32.401  ops/ms
SpaceCheckBenchmark.spaceBitAnd            thrpt    5  2570.536 ?   2.284  ops/ms

五、结论

综合来看,无论是x64还是aarch64,方法5性能最理想。


http://chatgpt.dhexx.cn/article/t73Ha1Sa.shtml

相关文章

从String中移除空白字符的多种方式

字符串&#xff0c;是Java中最常用的一个数据类型了。我们在日常开发时候会经常使用字符串做很多的操作。比如字符串的拼接、截断、替换等。 这一篇文章&#xff0c;我们介绍一个比较常见又容易被忽略的一个操作&#xff0c;那就是移除字符串中的空格。 其实&#xff0c;在Ja…

html空白字符显示效果,什么是空白字符?空白符有哪些?

空白字符&#xff0c;也可简称“空白符”&#xff0c;通俗理解&#xff0c;就是不会显示出来的字符&#xff0c;类似空格符、回车换行符、制表符之类的字符&#xff0c;从视觉效果上来看&#xff0c;只是一个空白区域而已。 空白字符有哪些&#xff1f; 空白符主要有空格符、回…

java 字符串 空白字符_Java String中移除空白字符的多种方式汇总

前言 字符串,是Java中最常用的一个数据类型了。我们在日常开发时候会经常使用字符串做很多的操作。比如字符串的拼接、截断、替换等。 这一篇文章,我们介绍一个比较常见又容易被忽略的一个操作,那就是移除字符串中的空格。 其实,在Java中从字符串中删除空格有很多不同的方法…

Spark 高级数据分析(第2版)

内容简介 作为计算框架&#xff0c;Spark 速度快&#xff0c;开发简单&#xff0c;能同时兼顾批处理和实时数据分析&#xff0c;因此很快被广大企业级用户所采纳&#xff0c;并随着近年人工智能的崛起而成为分析和挖掘大数据的重要得力工具。 本书由业内知名数据科学家执笔&a…

XGBoost与LightGBM文本分类

目录 用户评论情感极性判别 一、数据准备 二、数据预处理 三、文本特征提取 四、将数据转换为DMatrix类型 五、构建XGBoost模型 1、XGBoost模型主要参数 &#xff08;1&#xff09;通用参数 &#xff08;2&#xff09;Booster参数 &#xff08;3&#xff09;学习目标…

文本分类概念类大总结(机器学习+深度学习)

基础普及&#xff1a; https://zhuanlan.zhihu.com/p/25928551 综述类&#xff08;有不同算法在各数据集上的性能对比&#xff09;&#xff1a;   Deep Learning Based Text Classification:A Comprehensive Review&#xff08;20.04&#xff09;   A Survey on Text Class…

新闻个性化推荐综述

MIND: A Large-scale Dataset for News Recommendation ACL 2020 0. 摘要 新闻推荐是实现个性化新闻服务的一项重要技术。与已经被广泛研究的产品推荐和电影推荐相比&#xff0c;新闻推荐的研究非常有限&#xff0c;主要是因为缺乏高质量的基准数据集。本文提出了一个名为MI…

新基建之数据中心

绪论 4月20日上午&#xff0c;国家发展改革委通过网上方式举行4月份新闻发布会。会上回答了彭博社记者关于新型基础设施建设的提问。内容如下&#xff1a; 目前来看&#xff0c;新型基础设施主要包括3个方面内容&#xff1a; 一是信息基础设施。主要是指基于新一代信息技术演…

机器学习案例实战:Python文本数据分析新闻分类任务

原创文章,如需转载请保留出处 本博客为唐宇迪老师python数据分析与机器学习实战课程学习笔记一. 文本分析与关键词提取 1.1 文本数据 1.2 停用词 语料中大量出现没啥大用留着过年吗 1.3 Tf-idf&#xff1a;关键词提取 《中国的蜜蜂养殖》&#xff1a;进行词频&#xff08;…

音视频融合综述

文章目录 前言摘要正文1介绍音视频特征提取和融合类型融合的技术挑战依赖问题同步问题数据问题 最近的进展和研究方法异步动态加权深度学习多模态融合学习&#xff1a;跨模式学习&#xff1a;共享学习DL使用经验多视图学习 总结 个人总结与思考 前言 最近需要加强相关领域的深…

从0到1构建新闻长文本分类系统

新闻分类系统概述 新闻分类系统&#xff0c;顾名思义&#xff0c;就是对于一片新闻或者是一片文章&#xff0c;进行自动的分类,例如政治&#xff0c;财经&#xff0c;娱乐等等 从技术角度讲&#xff0c;其实属于自然语言处理中比较经典的文本分类问题。当然在一个工业级别的分…

谈文本分类

本文来自对《文本分类研究综述》汪岿的阅读 文章目录 1. 为什么要进行文本分类2. 文本分类的分类、应用3. 当前文本分类面临的挑战4. 文本分类的前景 1. 为什么要进行文本分类 在大数据时代&#xff0c;网络上的文本数据日益增长。采用文本分类技术对海量数据进行科学地组织和…

多模态融合技术综述和应用

文章目录 多模态技术基础1&#xff0c;多模态融合架构&#xff08;神经网络模型的基本结构形式&#xff09;1.1联合架构1.2协同架构1.3编解码架构&#xff08;自监督&#xff09; 2&#xff0c;多模态融合方法2.1早期融合2.2 晚期融合2.3混合融合 3&#xff0c;模态对齐方法3.1…

大数据分析案例-基于随机森林算法构建新闻文本分类模型

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集…

【数据挖掘】天池挑战赛 新闻推荐

比赛网址&#xff1a;https://tianchi.aliyun.com/competition/entrance/531842/introduction 项目源码&#xff1a;Github 一、项目知识点 数据预处理&#xff1b; 数据可视化&#xff1b; 特征工程&#xff1b; 模型选择&#xff1b; 实验结果的评价&#xff1b; 二、…

python-新闻文本分类详细案例-(数据集见文末链接)

文章目录 分析思路所用数据集一、导入相关包二、数据分析1.读取数据2. jieba分词并去除停用词3. TF-IDF4. 网格搜索寻最优模型及最优参数5. 预测并评估预测效果 总结 分析思路 新闻文本数据包含四类新闻&#xff0c;分别用1&#xff0c;2&#xff0c;3&#xff0c;4 表示。 &a…

NetWORK ShortCuts 创建

很多时候我们创建了很多SHARE DRIVE的SHOT CUT&#xff1a; 但是我们不知道他们的路径在哪里&#xff0c;在下一台新电脑的时候&#xff0c;我们又要重新创建&#xff1f;NONONO&#xff0c; 我们打开其中一个SHORT CUT 我们点一下 "Proposal_Content_RPA" 右边的空…

shortcuts实现

1.使用条件 android 7.1以上 2.功能说明 长按桌面app图标出现快捷方式列表&#xff0c;点击可跳转到app的指定界面&#xff0c;用户也可以将其作为一个单独的快捷方式 3.效果截图 3.技术实现 分为两种方式&#xff0c;静态xml配置和动态代码配置&#xff0c;二者各有优劣&#…

Android ShortCuts使用

ShortCuts是什么&#xff1f; Shortcuts是指在桌面长按app图标而出现的快捷方式&#xff0c;可以为你的app的关键功能添加更加快速的入口而不是先打开app 点击快捷方式可以访问应用功能&#xff0c;而且这种快捷方式也可以被拖拽到桌面的单独位置&#xff0c;变成单独的左面快…

Android App Shortcuts

周五了&#xff0c;周末还远吗&#xff1f;~ 加入我知识星球的人都得到了提升&#xff0c;可不要错过哦~ 点击阅读原文即可。 本文较长&#xff0c;阅读大约十分钟 ~ 我们都知道iPhone6S推出了3D Touch的功能&#xff0c;也算是一个大卖点&#xff0c;Google也后来居上&#xf…