番石榴的CharMatcher removeFrom

时间:2014-02-25 12:44:36

标签: java performance algorithm jvm guava

实际上这里有两个问题。第一个:

1)Java是否足够聪明,不能将一个数组元素复制到自身中?

我的意思是:

 int i = 1;
 char [] chars=... //some chars
 char[1] = char[i]; // first element into itself

2)番石榴的基准测试是否向公众开放?

我的意思是:我正在查看CharMatcher removeFrom方法的源代码并看到了这个:

        // This unusual loop comes from extensive benchmarking
    OUT: while (true) {
            pos++;
            while (true) {
                if (pos == chars.length) {
                    break OUT;
                }
                if (isLetter(chars[pos])) {
                    break;
                }
                chars[pos - spread] = chars[pos];
                pos++;
            }
            spread++;
        }
    return new String(chars, 0, pos - spread);

我真的很喜欢这个主意,但编码了我自己的方法:

    public static String removeMine(String input){
    char [] chars = input.toCharArray();
    int howManyLetters = 0;
    for(int i=0;i<chars.length;++i){
        if(isLetter(chars[i])) {
            chars[howManyLetters++] = chars[i];
        }
        else {
            if(i == (chars.length - 1)) break;
            chars[i] = chars[i+1];
        }
    }
    return new String(chars, 0, howManyLetters);
}

然后我添加了一些基准测试(如果需要,我会将它们放在github上),结果如下:

https://microbenchmarks.appspot.com/runs/61e76bdc-b0d6-4145-8b8b-c1683287f038#r:scenario.benchmarkSpec.parameters.input,scenario.benchmarkSpec.methodName

我(严重?)怀疑番石榴的创造者没有这样的版本,我认为有理由放弃它(评论更明显)。我希望看到的是他们所做的实际基准测试,或者是采用这种方法的一些严肃理由。我假设它与您运行代码的JVM类型有关,但实际的证据将不胜感激。

P.S。我仍然要用jmh测试这个,一旦我完成就会提供结果。

0 个答案:

没有答案