Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NumberFormatException vs. regexp, странный результат теста 
:(
    Опции темы
val_vp
Дата 4.1.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 15.11.2006
Где: Днепродзержинск

Репутация: нет
Всего: нет



Всем привет, с прошедшими и наступающими.

Вот столкнулся с такой проблемой:
есть некий идентификатор (передаваемый как String) произвольной длины типа "0100023234", букв быть не должно, требуется перед его обработкой проверить валидный он или нет (т.е. только ли цифры там).

считаю, что валидацию необходимо делать через regexp, примерно так

Код

public boolean isValid(String number) {
    return number.matches("\\d*");
}


но я видел и довольно "экзотичесный" способ, правда нарушающий заветы г-на Блоха (поэтому я его закодил только ради теста)
Код

public boolean isValid(String number) {
    boolean result = true;
    try {
        final Long dummy = new Long(number);
    } catch (NumberFormatException nfe) {
        result = false;
    }
    return result;
}


я решил проверить, что быстрее и вот что получилось.
1) как тестил (вот тут возможно и накосячил) 
создал массив с тестовыми идентификаторами
Код

String[] numbers = new String[] {"0232111", "02321w1", "02321112", "Q0232111" ...} // 7 элентов

и в цикле его проверял
Код

long start = new Date().getTime();
for (int i=0; i<num; i++) {
    for(String str: numbers) {
        res = isValid(str);
    }
}
long finish = new Date().getTime();
long total = finish - start;

2) результат для различных значений num
> 100 000 
  regexp почти в 2 раза быстрее
~ 10 000
  примерно одинаково
~ 100 и < 100
  NumberFormatException почти в 2 раза быстрее

Интересно почему такой результат ведь по идее Exception-ы это самый ресурсоемкий механизм?
PM MAIL WWW   Вверх
nornad
Дата 4.1.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(val_vp @  4.1.2008,  16:04 Найти цитируемый пост)
считаю, что валидацию необходимо делать через regexp, примерно так

Скорее так:
Код

  number.matches("\\d+");

Цитата(val_vp @  4.1.2008,  16:04 Найти цитируемый пост)
Интересно почему такой результат ведь по идее Exception-ы это самый ресурсоемкий механизм?

Может, потому, что регулярные выражения - штука тоже не самая легковесная? smile 


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
shimopus
Дата 4.1.2008, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 25.8.2006

Репутация: 1
Всего: 1



Тогда очень интересно почему регэксп на больших количествах данных выигрывает... Неужели там есть механизм кеширования???
PM ICQ Skype GTalk   Вверх
val_vp
Дата 4.1.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 15.11.2006
Где: Днепродзержинск

Репутация: нет
Всего: нет



nornad, спасибо за \\d+, а то б и "" засчитало б за правильный ИД.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0421 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.