2012-02-23 4 views
3

Мне бы очень нужна альтернатива SimpleDateFormat, я конвертирую много-много строк Strig (> 100k) из JST в GMT. Проблема в том, что мой код генерирует путь ко многим char [], как я заметил при профилировании. Для дат 150 тыс. Я получаю постоянную 150 МБ используемой памяти, и это не вариант. Благодарю.Альтернативы SimpleDateFormat для синтаксического анализа даты

SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); 
    sdf.setTimeZone(tz); 
    try { 
     Date theResult = sdf.parse(dateToConvert); 
     SimpleDateFormat rdf = new SimpleDateFormat(resultDateFormat); 
     rdf.setTimeZone(resultTz); 
     return rdf.format(theResult); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

Я не могу использовать время Joda, так что это не вариант для меня. :(

+1

Где находится цикл? –

+1

Рассмотрите возможность использования времени JODA, оно может работать лучше. –

+3

Что делать, если вы кешируете SimpleDateFormats? Обратите внимание, что они не являются потокобезопасными, поэтому вам понадобится кеш на поток. –

ответ

1

У вас есть определенная причина предположить, что SimpleDateFormat неэффективен при датах синтаксического анализа? Если ваши даты не имеют для них определенной специфической характеристики, которая поддается определенной оптимизации, я бы подумал, что класс JDK сделает разумным от него.

При этом, исходя из предположения, что ваши даты не все различны (маловероятно с 100k), вы можете посмотреть в кеширование - заполнить карту с переданным String и выйти Date. Это, скорее всего, значительно сократит требуемый синтаксический анализ; это может или не может привести к заметному ускорению/увеличению памяти в зависимости от существующих характеристик.

В качестве альтернативы, создание двух новых SimpleDateFormats каждый раз, вероятно, будет очень неэффективно. Почему бы не создать эти экземпляры один раз, когда класс загружен (если формат не меняется по строке)? Это может решить вашу проблему само по себе, если внутренности SDF таковы, что во время первого запуска она включает в себя множество char[]. (Помните, что причудливые форматы даты не являются потокобезопасными, так что вам может понадобиться ThreadLocal<DateFormat>, если ваш парсинг-класс используется одновременно).

+0

Все даты отличаются, я попробую ваше второе предложение. Благодарю. – CristiL

4

В качестве отправной точки, я бы повторно использовать эти SimpleDateFormat экземпляры, а не воссоздавать пару из них для каждой даты, что вам нужно преобразовать.

+6

нужно делать это осторожно, так как SimpleDateFormat не является потокобезопасным (http://stackoverflow.com/questions/6840803/simpledateformat-thread-safety) –

9

использования Joda время

org.joda.time.format.DateTimeFormatter dtf = 
     org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd"); 
    org.joda.time.DateTime date = dtf.parseDateTime(yourDate); // String like 2000-12-12 
    date.withZone(yourZone); // org.joda.time.DateTimeZone 
3

Да, время Joda имеет действительно хороший API, но user1143825 забудьте установить время вводаZone. И я не могу сказать о производительности памяти, вы должны проверить ее и сравнить результаты.

Это должно работать:

DateTimeFormatter sdf = DateTimeFormat.forPattern(dateFormat).withZone(tz); 
try { 
    DateTime theResult = sdf.parseDateTime(dateToConvert).withZone(resultTz) 
    return theResult; 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
} 
2

с помощью Java

  sample time format //31/Mar/2013:16:59:30 -0700 
      Date date = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z").parse(yourTIME); 
      String time= new SimpleDateFormat("dd/MMM/yyyy, HH:mm").format(date); 

Использование времени преобразования Joda Библиотека

  org.joda.time.format.DateTimeFormatter tf=org.joda.time.format.DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z"); 
     org.joda.time.DateTime date = dtf.parseDateTime(time); 
     String time=date.toString("dd/MMM/yyyy, HH:mm")); 

эта библиотека улучшается моя производительность скорость кода

с использованием java-кода 14991 мс с использованием библиотеки joda 1668 мс

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