Java 从字符串中检索值的最快方法是什么?
在我的应用程序开发过程中,我想到了一个性能问题: 我有很多行数据,看起来像这样:Java 从字符串中检索值的最快方法是什么?,java,performance,Java,Performance,在我的应用程序开发过程中,我想到了一个性能问题: 我有很多行数据,看起来像这样: !!ANG:-0.03,0.14,55.31 !!ANG:-0.03,-0.14305.31 !!ANG:-234.03,-0.14,55.31 总的来说:!昂:浮子,浮子,浮子 在这些线之间也有“损坏”的线-它们不是以!或者太短/有额外的标志等等 要检测在开始时损坏的线路,我只需使用 if(myString.charAt(0) != '!')//wrong string 我能做些什么来检测最后损坏的线路?非
- !!ANG:-0.03,0.14,55.31
- !!ANG:-0.03,-0.14305.31
- !!ANG:-234.03,-0.14,55.31
- 总的来说:!昂:浮子,浮子,浮子
if(myString.charAt(0) != '!')//wrong string
我能做些什么来检测最后损坏的线路?非常重要的一点是,我不仅需要检查行是否正确,还需要让这3个浮点数稍后使用
我找到了三种选择:
- 使用regexp
- 拆分两次(第一个“:”和第二个“,”)并计数元素
- 使用Scanner类
- NG:-0.03,0.14,55.31
- .14,55.31
- !!ANG:-0.03,0.14
- !!A、 -0.02,-0.14554,-0.12,55
到目前为止,我发现使用扫描器的一个大缺点是,对于每一行我都需要创建新对象,过了一段时间,我的设备开始缺乏资源。对它们进行基准测试,然后你就会知道
最快的方法可能是编写自己的微型状态机以匹配格式并找到浮点边界。从理论上讲,正则表达式将具有相同的性能,但可能会有额外的开销。作为中间解决方案,我会这样做:
private static class LineObject {
private float f1, f2, f3;
}
private LineObject parseLine(String line) {
LineObject obj = null;
if (line.startsWith("!ANG:")) {
int i = line.indexOf(',', 5);
if (i != -1) {
int j = line.indexOf(',', i+1);
if (j != -1) {
try {
obj = new LineObject();
obj.f1 = Float.parseFloat(line.substring(5, i));
obj.f2 = Float.parseFloat(line.substring(i+1, j));
obj.f3 = Float.parseFloat(line.substring(++j));
} catch (NumberFormatException e) {
return null;
}
}
}
}
return obj;
}
在您可以在自己的状态机中复制/粘贴StartWith、indexOf和parseFloat的全部jdk代码后…尝试三种选择,找出哪一种是最好的,您认为最后的损坏是什么意思??给出一个损坏字符串示例所有这些选项都有效,但这里的答案也取决于你的“未损坏”行,所以你能发布一些吗?多少是很多?除非您有数十亿行,否则使用哪种技术都不太重要。这些损坏的行看起来像是从多个线程/进程同时写入文件,而没有进行适当的同步。你应该先修改你的制作程序。同意。理论上,正则表达式将具有与状态机相同的性能,但是。还请注意,“与格式匹配的状态机”通常称为。