データがすでにデータベースにある場合は、単語の文字列を解析する必要がある場合は、indexOfを繰り返し使用することをお勧めします。どちらのソリューションよりも何倍も高速です。
ただし、データベースからデータを取得することは、依然としてはるかに費用がかかる可能性があります。
StringBuilder sb = new StringBuilder();
for (int i = 100000; i < 100000 + 60; i++)
sb.append(i).append(' ');
String sample = sb.toString();
int runs = 100000;
for (int i = 0; i < 5; i++) {
{
long start = System.nanoTime();
for (int r = 0; r < runs; r++) {
StringTokenizer st = new StringTokenizer(sample);
List<String> list = new ArrayList<String>();
while (st.hasMoreTokens())
list.add(st.nextToken());
}
long time = System.nanoTime() - start;
System.out.printf("StringTokenizer took an average of %.1f us%n", time / runs / 1000.0);
}
{
long start = System.nanoTime();
Pattern spacePattern = Pattern.compile(" ");
for (int r = 0; r < runs; r++) {
List<String> list = Arrays.asList(spacePattern.split(sample, 0));
}
long time = System.nanoTime() - start;
System.out.printf("Pattern.split took an average of %.1f us%n", time / runs / 1000.0);
}
{
long start = System.nanoTime();
for (int r = 0; r < runs; r++) {
List<String> list = new ArrayList<String>();
int pos = 0, end;
while ((end = sample.indexOf(' ', pos)) >= 0) {
list.add(sample.substring(pos, end));
pos = end + 1;
}
}
long time = System.nanoTime() - start;
System.out.printf("indexOf loop took an average of %.1f us%n", time / runs / 1000.0);
}
}
プリント
StringTokenizer took an average of 5.8 us
Pattern.split took an average of 4.8 us
indexOf loop took an average of 1.8 us
StringTokenizer took an average of 4.9 us
Pattern.split took an average of 3.7 us
indexOf loop took an average of 1.7 us
StringTokenizer took an average of 5.2 us
Pattern.split took an average of 3.9 us
indexOf loop took an average of 1.8 us
StringTokenizer took an average of 5.1 us
Pattern.split took an average of 4.1 us
indexOf loop took an average of 1.6 us
StringTokenizer took an average of 5.0 us
Pattern.split took an average of 3.8 us
indexOf loop took an average of 1.6 us
ファイルを開くためのコストは約8ミリ秒になります。ファイルが非常に小さいため、キャッシュによってパフォーマンスが2〜5倍向上する場合があります。それでも、ファイルを開くのに最大10時間かかります。split vs StringTokenizerを使用するコストは、それぞれ0.01ミリ秒よりはるかに少ないです。1,900万x30ワードを解析するには*ワードあたり8文字は約10秒かかります(2秒あたり約1 GB)
パフォーマンスを向上させたい場合は、ファイルをはるかに少なくすることをお勧めします。たとえば、データベースを使用します。SQLデータベースを使用したくない場合は、これらのhttp://nosql-database.org/のいずれかを使用することをお勧めします。