あるパスの一部を使用して、別のパスを生成したい!
という処理はたまに遭遇するかと思いますが、今回はsplitとindexOfを使用してどちらがコードとして見やすいか、また処理速度について検証したいと思います。
目次
splitとindexOfの比較
検証方法は、5階層あるパスから上位3階層を抜き出す という処理で比較します。
例)
c:/aaa/bbb/ccc/ddd/eee から c:/aaa/bbb/ccc
splitでの実装
splitは指定した正規表現で、文字列を分割する関数です。
splitを使うと以下のように実装できます。
1 2 3 4 |
final String path = "c:/aaa/bbb/ccc/ddd/eee"; String[] path_ary = path.split("/"); System.out.println(path_ary[0] + "/" + path_ary[1] + "/" + path_ary[2]); |
splitで返された配列の0〜2を結合しています。
特に複雑な処理はなく、後から見返しても何をしているか分かりやすいと思います。
indexOfでの実装
indexOfは、指定した文字列で、文字列を検索し最初に見つかった文字列のインデックスを返す関数です。
indexOfを使うと以下のように実装できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
final String path = "c:/aaa/bbb/ccc/ddd/eee"; int loop_cnt = 0; int path_idx = 0; int next_start_idx = 0; String result = ""; while(true){ path_idx = path.indexOf("/", next_start_idx); if( loop_cnt == 2){ result = path.substring(0, path_idx); break; } next_start_idx = path_idx + 1; loop_cnt++; } System.out.println(result); |
indexOfを使うと、先頭から順に検索する必要があるため、whileの中で繰り返し処理をしています。
splitに比べるとコードも長く、後から見返してもパッと何をしているか分かりずらいかもしれません。
それぞれの処理速度
さて、コードの可読性という意味合いでは、splitが一歩リードという感じでしょうか。
次は、同じ処理を10万回繰り返した際の処理速度(ms)です。
5回計測しています。
関数 | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
---|---|---|---|---|---|
split | 78 | 78 | 94 | 62 | 62 |
indexOf | 15 | 0 | 16 | 16 | 15 |
処理速度では、indexOfが圧倒的に早い結果になりました。
splitを使った方法では、splitの結果をString配列に格納しているので、都度メモリ上に配列を格納する領域を確保する処理で若干時間がかかっている感じでしょうか。
まとめ
splitとindexOfについて、可読性と処理速度について検証しました。
可読性はsplit、処理速度はindexOf という結果になりました。
ただ、処理速度に関しては10万回実行した結果なので、そこまで処理を繰り返さなければ、splitでも特に問題なる処理時間ではないと思います。
要件にもよるかと思いますが、個人的には、可読性が高いsplitがオススメです。
indexOfを使用する場合は、関数にした方が分かりやすいと思います。