java - 从字符列表中创建字符串然后清除它的最有效方法
问题描述
我正在尝试创建一种类似 JSON 的格式来从文件中加载组件,并且在编写解析器时遇到了一个有趣的性能问题。
解析器逐字符读取文件,所以我有一个 LinkedList 作为缓冲区。在到达键 ( :
) 或值 ( ,
) 的末尾后,缓冲区必须被清空并由它构造一个字符串。
我的问题是最有效的方法是什么。
我最好的两个选择是:
for (int i = 0; i < buff.size(); i++)
value += buff.removeFirst().toString();
和
value = new String((char[]) buff.toArray(new char[buff.size()]));
解决方案
而不是猜测这个你应该写一个基准。看一下How do I write a correct micro-benchmark in Java了解如何使用JMH编写基准。
当您使用运算符连接 1 个字母时,您for
的循环将效率低下。这会导致创建并立即丢弃中间对象。如果您打算在循环中连接,则应该使用。String
+
String
StringBuilder
根据Arrays of Wisdom of the Ancients文章,第二个选项应该使用零长度数组,该文章深入探讨了 JVM 的内部细节:
value = new String((char[]) buff.toArray(new char[0]));
推荐阅读
- charts - 带有饼图的 Highchart 流体顶部/底部边距
- android - 如何更新房间中的一行?(请先阅读)
- javascript - 在 JavaScript 中计算 TypedArray 中的元素数
- reactjs - 无法在 Redux Reducer 中过滤数据
- javascript - 生成 .prettierrc 文件
- java - 我应该如何将函数映射到java中的字符串数组?
- python - Python Selenium 从 div 复制文本,3
- javascript - 如何使用依赖于两个按钮启动和停止的 React Hooks 制作计数器?
- python - discord.py 中的提醒命令问题
- sql - 根据 SQL 查询 (SQL Server) 中的其他列创建自定义列