从字符串中检索值的最快方法是什么?

4
在我的应用开发中,出现了一个性能问题:我有许多数据行,看起来像这样:
- !ANG:-0.03,0.14,55.31 - !ANG:-0.03,-0.14,305.31 - !ANG:-234.03,-0.14,55.31 - 一般情况下:!ANG:float,float,float
在这些行之间也有“损坏”的行——它们不以感叹号开头或太短/有额外的符号等。
为了检测到开头损坏的行,我简单地使用
if(myString.charAt(0) != '!')//wrong string

我可以检测末尾是否损坏的行,但需要注意的是,我不仅需要检查行是否正确,还需要获取这些3个浮点数以便后续使用。我找到了三种方法:
- 使用正则表达式 - 分两次拆分(先用“:”再用“,”),并计算元素数 - 使用Scanner类
我不确定哪种方法(或可能还有其他方法)从性能角度来看最好。你能给我一些建议吗?
编辑:根据一些评论,我发现值得说明损坏的行如何看:
- NG:-0.03,0.14,55.31 - .14,55.31 - !ANG:-0.03,0.14, - !A,-0.02,-0.14,554,-0.12,55
关于行数很难说,因为我从其他设备的读数中获得它们,所以每次以50Hz的频率获得大约20行数据包。到目前为止,我发现使用Scanner的一个很大的缺陷是,对于每行,我需要创建新对象,而过一段时间后,我的设备开始资源不足。

1
尝试三个选项,找出最佳的一个。 - Shar1er80
1
你说的“damage at the end”是什么意思?可以给一些损坏字符串的示例吗? - Rod_Algonquin
所有这些选项都可以起到作用,但这里的答案还取决于你“未损坏”的代码行,所以你能贴出一些吗? - DoubleMa
3
很多是多少?除非你拥有数十亿条这样的线,否则使用哪种技术都不太重要。 - user207421
1
这些损坏的行看起来像是您正在使用多个线程/进程并发地写入文件,但没有进行适当的同步。您应该先修复您的生产程序。 - Lie Ryan
2个回答

1

进行基准测试,然后你就会知道。

最快的方法可能是编写自己的小型状态机来匹配格式并找到浮点边界。理论上,正则表达式的性能将相同,但很可能会有额外的开销。


同意。从理论上讲,正则表达式与状态机的性能应该是相同的,但是实际上大多数正则表达式实现并不是这样的(参见https://swtch.com/~rsc/regexp/regexp1.html)。同时请注意,“用于匹配格式的状态机”通常被称为词法分析器(参见http://en.wikipedia.org/wiki/Lexical_analysis)。 - Daniel Pryden

0
作为一种中间解决方案,我会做类似这样的事情:
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;
}

在你自己的状态机中,只需复制/粘贴startsWith、indexOf和parseFloat的有用JDK代码即可...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接