2016-02-24 4 views
0

Мне нужно проверить, если одна строка содержит символ $, прежде чем заменить этот.Равенство валидации и проверка индекса?

Я сделал две реализации для этого предложения.

Первая реализация всегда выполняет replace(char oldChar, char newChar) и equals(Object anObject) как подтверждение.

String getImportLine(Class<?> clazz) { 
    String importLine = toSanitizedClassName(clazz.getName()); 
    String importStaticLine = importLine.replace('$', '.'); 
    if (importLine.equals(importStaticLine)) { 
     return String.format("import %s;", importLine); 
    } 
    return String.format("import static %s;", importStaticLine); 
} 

Эта реализация анализирует строку два раза:

  • importLine.replace('$', '.')
  • importLine.equals(importStaticLine)

Вторая реализация использует indexOf(int ch) в качестве проверки и replace(char oldChar, char newChar) в худшем случае.

String getImportLine(Class<?> clazz) { 
    String importLine = toSanitizedClassName(clazz.getName()); 
    if (importLine.indexOf('$') == -1) { 
     return String.format("import %s;", importLine); 
    } 
    importLine = importLine.replace('$', '.'); 
    return String.format("import static %s;", importLine); 
} 

Вторая реализация, в худшем случае, разобрать строку два раза:

  • importLine.indexOf('$') == -1
  • importLine.replace('$', '.')

Есть ли какая-то разница с точки зрения производительности между использование equals vs indexOf как подтверждение?

+1

Оценить их :) – epoch

+3

У них такой же Big-O, что я могу сказать, длина строки. Но то, что вы на самом деле пытаетесь выяснить здесь, - это что-то занимает 5 наносекунд или 7. Почему это важно? – Tobb

+0

@Tobb Я просто хочу подтвердить, что между этими двумя реализациями нет существенного различия в эффективности. Я не понимаю, почему мой вопрос так ошибается. Хорошо, когда downvoter дает причину ... –

ответ

6

Что вы спрашиваете, это разница во времени выполнения между String.indexOf и String.equals. С нотами Big-O они одинаковы, так как оба (наихудший случай) будут перебирать весь String перед возвратом.

На практике это действительно зависит от ввода.

Например:

  • equals вернется в значительной степени немедленно, если две строки сравниваемых разной длины
  • equals вернется раньше, если разница в строках происходит рано ("abcdef".equals("aXcdef") быстрее, чем "abcdef".equals("abcdeX"))
  • indexOf('$') будет быстрее, если $ встречается на ранней стадии ("a$cdef".indexOf('$') быстрее, чем "abcde$".indexOf('$'))
  • indexOf будет медленнее, если входной символ является специальным символом

На современных компьютерах это не имеет значения, так как они так быстро, что какая-то разница будет unnoticable, если не будет вызван метод сотни тысяч раз (или с действительно большими входными строками). При оптимизации кода нужно сосредоточиться на экономии секунд, а не на наносекундах. С вашей текущей проблемой вы должны быть гораздо более обеспокоены тем, что ваш код читабелен и понятен другим, чем вы должны беспокоиться о том, что использует большинство циклов процессора.

+0

Ничего себе спасибо. Я подожду, пока другие ответят, прежде чем ответить на ваш вопрос. Я обновил заголовок моего вопроса. –

Смежные вопросы