RTrim最速っぽいのを簡単に調べてみた

自宅の環境(CPU:Core2 Duo E6750 メモリ4G)ではStringUtils#stripEndが最速らしい。 しかし、会社のPCではguavaが最速でした。

検証したのは、

  • 処理時に(メソッド呼ばれる毎に)で毎回Patternのインスタンス生成からやる
  • Patternの変数をstaticで持たせてインスタンス生成のコストを減らしたもの
  • StringUtils#stripEnd
  • CharMatcher#trimTrailingFrom

のどれが一番早いか!です。

結果はこちら。

検証コード

package speedcheck;

import com.google.common.base.CharMatcher;

import org.apache.commons.lang.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author yushi.koga
 */
public class SpeedCheck {

    static Pattern staticPatternForRtrim = Pattern.compile("\\s+$");
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        String sampleText = "\"aaaaaa\"    ";
        int max = 25000000;

        String staticTrimedText = null;
        System.out.println("original text start from here ->" + "\"aaaaaa\"    " + "<-to end is here");
        System.out.println("loop times : " + max);
        System.out.println("=======================================");
        long staticStarted = System.currentTimeMillis();
        for (int i = 0; i < max; i++) {
            Matcher staticMatcher = staticPatternForRtrim.matcher(sampleText);
            staticTrimedText = staticMatcher.replaceAll("");
        }
        long staticFinished = System.currentTimeMillis();
        System.out.println("staticStarted      at " + staticStarted);
        System.out.println("staticfinished     at " + staticFinished);
        System.out.println("staticPassed time  is " + ((staticFinished - staticStarted)));
        System.out.println("staticTrimedText   is " + staticTrimedText + "<- end here");
        System.out.println("=======================================");


        String insideTrimedText = null;
        long insideStarted = System.currentTimeMillis();
        for (int i = 0; i < max; i++) {
            insideTrimedText = Pattern.compile("\\s+$").matcher(sampleText).replaceAll("");
        }
        long insideFinished = System.currentTimeMillis();
        System.out.println("insideStarted      at " + insideStarted);
        System.out.println("insidefinished     at " + insideFinished);
        System.out.println("insidePassed time  is " + ((insideFinished - insideStarted)));
        System.out.println("insideTrimedText   is " + insideTrimedText + "<- end here");
        System.out.println("=======================================");


        String commonsTrimedText = null;
        long commonsStarted = System.currentTimeMillis();
        for (int i = 0; i < max; i++) {
            commonsTrimedText = StringUtils.stripEnd(sampleText," ");
        }
        long commonsFinished = System.currentTimeMillis();
        System.out.println("commonsStarted     at " + commonsStarted);
        System.out.println("commonsFinished    at " + commonsFinished);
        System.out.println("commonsPassed time is " + ((commonsFinished - commonsStarted)));
        System.out.println("commonsTrimedText  is " + commonsTrimedText + "<- end here");
        System.out.println("=======================================");


        String charMatcherTrimedText = null;
        long charMatcherStarted = System.currentTimeMillis();
        for (int i = 0; i < max; i++) {
            charMatcherTrimedText = CharMatcher.is(' ').trimTrailingFrom(sampleText);
        }
        long charMatcherFinished = System.currentTimeMillis();
        System.out.println("quavaStarted       at " + charMatcherStarted);
        System.out.println("quavaFinished      at " + charMatcherFinished);
        System.out.println("quavaPassed time   is " + ((charMatcherFinished - charMatcherStarted)));
        System.out.println("quavaTrimedText    is " + charMatcherTrimedText + "<- end here");
        System.out.println("=======================================");
    }

}

結果

Executing: gradle :run
Arguments: [-PmainClass=speedcheck.SpeedCheck, -c, D:\workspaceForNetBeans\speedcheck\settings.gradle]

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
original text start from here ->"aaaaaa"    <-to end is here
loop times : 25000000
=======================================
staticStarted      at 1448538448194
staticfinished     at 1448538458284
staticPassed time  is 10090
staticTrimedText   is "aaaaaa"<- end here
=======================================
insideStarted      at 1448538458285
insidefinished     at 1448538479871
insidePassed time  is 21586
insideTrimedText   is "aaaaaa"<- end here
=======================================
commonsStarted     at 1448538479871
commonsFinished    at 1448538480760
commonsPassed time is 889
commonsTrimedText  is "aaaaaa"<- end here
=======================================
quavaStarted       at 1448538480760
quavaFinished      at 1448538483150
quavaPassed time   is 2390
quavaTrimedText    is "aaaaaa"<- end here
=======================================

BUILD SUCCESSFUL

Total time: 35.862 secs