String.lastIndexOf () есть ли разница между символом и строкой с одним символом? - PullRequest
4 голосов
/ 22 января 2009

Просто интересно, знал ли кто-нибудь на макушке головы, есть ли большая разница в выполнении следующего:

String wibble = "<blah> blah blah </blah>.... <wibble> blah wibble blah </wibble> some more test here";

int i = wibble.lastIndexOf(">");
int j = wibble.lastIndexOf('>');

Ответы [ 5 ]

12 голосов
/ 22 января 2009

Мнения отличные, но данные лучше. Я написал быстрый тест:

Тестовый код

public static void main(String[] args)
{
  System.out.println("Starting perfo test");

  final long NUM_TESTS = 100000000L;

  String wibble = "<blah> blah blah </blah>.... <wibble>"
                + " blah wibble blah </wibble> some more test here";
  int x = -1;
  Stopwatch sw = new Stopwatch();

  System.out.println("--perfo test with " + NUM_TESTS + " iterations--");

  sw.start();
  for(long i = 0; i < NUM_TESTS; i++)
    x = wibble.lastIndexOf(">");
  sw.stop();
  System.out.println("String first pass: " + sw + " seconds");

  sw.start();
  for(long i = 0; i < NUM_TESTS; i++)
    x = wibble.lastIndexOf('>');
  sw.stop();
  System.out.println("Char first pass: " + sw + " seconds");

  sw.start();
  for(long i = 0; i < NUM_TESTS; i++)
    x = wibble.lastIndexOf('>');
  sw.stop();
  System.out.println("Char second pass: " + sw + " seconds");

  sw.start();
  for(long i = 0; i < NUM_TESTS; i++)
    x = wibble.lastIndexOf(">");
  sw.stop();
  System.out.println("String second pass: " + sw + " seconds");

  //Compiler warning said x was never read locally.. this is to
  //ensure the compiler doesn't optimize "x" away..
  System.out.println(x); 
}

выход

Starting perfo test
--perfo test with 100000000 iterations--
String first pass: 8.750 seconds
Char first pass: 6.500 seconds
Char second pass: 6.437 seconds
String second pass: 8.610 seconds
63

Заключение

Версия с символом примерно на 25% быстрее, но обе версии выполняются очень быстро, поэтому, вероятно, она никогда не станет узким местом в вашем коде.

4 голосов
/ 22 января 2009

Вы можете посмотреть исходный код класса String. Кажется, что lastIndex (char) и lastIndex (String) были написаны отдельно. Также должны быть накладные расходы с классом String. Таким образом, версия char может быть немного быстрее, но я сомневаюсь, что будет существенная разница в производительности.

http://www.docjar.com/html/api/java/lang/String.java.html

3 голосов
/ 22 января 2009

С точки зрения производительности, может быть небольшая разница. Для поиска одного символа быстрее или равно использовать char вместо String.

2 голосов
/ 22 января 2009

Там, где нет разницы в читабельности (как в этом случае), лучше использовать версию, которая ищет только символ. LastIndexOf выполняет меньше работы - проще найти один элемент в списке, чем найти подсписок (что фактически делает поиск строки).

0 голосов
/ 22 января 2009

Строка имеет дополнительные издержки, которые требуются независимо от ее длины (если у вас нет действительно умного компилятора, который в любом случае оптимизирует односимвольные строковые литералы в символьные константы :)), поэтому вы должны предпочесть версию char, если вы только поиск отдельных символов. Это не злая оптимизация, так как она в любом случае эквивалентна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...