Использование методов StringUtils выполняется быстрее, чем методы Java? - PullRequest
5 голосов
/ 26 октября 2011

Я хочу знать, работают ли методы из StringUtils из библиотеки Apache Commons Lang быстрее, чем методы Java String.

Я знаю, что это микрооптимизация, но это необходимо, потому что методы будут выполняться миллионы раз.

Методы, использующие регулярное выражение в Java, такие как split() или сравнение строк с equals().

Ответы [ 7 ]

3 голосов
/ 26 октября 2011

Как методы в классе Java String, так и методы в StringUtils высоко оптимизированы для конкретных задач, для решения которых они предназначены.Различные методы предназначены для решения слегка разных задач.Попробуйте выбрать метод, который наиболее точно соответствует задаче, которую вы пытаетесь решить, и, скорее всего, вы получите очень хорошую производительность.

Если есть два возможных подхода, которые выглядят одинаково хорошо, и важно, чтобы каждыйпоследний бит производительности, а затем измерить его!Оцените производительность обоих подходов в соответствии с вашими фактическими данными.

Но также помните, что зачастую дешевле купить более быстрый компьютер вместо того, чтобы тратить часы на разработку кода на микрооптимизацию своего кода, чтобы он работал быстро и медленномашина.

1 голос
/ 26 октября 2011

Я не думаю, что он каким-то образом оптимизирован, Apache Commons содержит «вспомогательные утилиты», то есть он более эффективен для разработки , а не для повышения производительности во время выполнения .

Производительностьможет также измениться с используемой JVM .

Я понимаю, что вы беспокоитесь о производительности при большом количестве выполнений или больших данных.Но это не означает, что ошибка микрооптимизации не относится к этому.Конечно, эффективнее гораздо больше времени уделять размышлениям и попыткам найти другие способы повышения производительности таких элементарных задач (выполнение не в одном, а в таком количестве потоков, как есть процессоры на машине и т. Д.),Разумнее оставить такой низкий уровень для JVM.Компилятор "точно в срок", как правило, намного умнее любого разработчика в моем опыте.

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

1 голос
/ 26 октября 2011

Ну, это, вероятно, зависит от каждого отдельного метода.Большинство методов представляют собой очень простой код, который людям часто приходится писать вручную, например,

return s1 == s2 || (s1 == null && s2 == null) || (s1 != null && s1.equals( s2 ) );

Этот код, скорее всего, будет оптимизирован до того же уровня компилятором горячей точки, удаляющим даже вызов метода.Я предполагаю, что единственная экономия времени, которую вы найдете, заключается в письменной форме.

Как было предложено в другом месте, я бы просто порекомендовал сравнить интересующие вас методы с использованием System.currentTimeMillis() вокруг цикла, который вызывает метод для некоторых random строк;случайный, потому что вы не хотите, чтобы он был оптимизирован.

0 голосов
/ 30 октября 2011

StringUtils#split быстрее String#split.

String#equals быстрее StringUtils#equals.

0 голосов
/ 27 октября 2011

Они не в соревновании. StringUtils не является заменой для методов в классе String, это набор общих идиом на следующем более высоком уровне. StringUtils звонки String в большинстве случаев. Он больше ничего не может сделать, если не использует отражение, чего не делает.

0 голосов
/ 26 октября 2011

Почему ты ищешь быстрее? У вас нет требований к производительности? Это определит, достаточно ли вы достаточно . Если вы соответствуете требованиям, переходите к следующей проблеме. Вопрос "Что быстрее?" подразумевает, что вы тоже не пробовали. Выберите один, убедитесь, что ваше требование к производительности выполнено, и только другое, если требование не выполнено.

0 голосов
/ 26 октября 2011

Во-первых, вы установили критерии производительности? Какую производительность вы хотите получить?

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

Несмотря на это, ваш вопрос слишком расплывчатый, чтобы на него можно было ответить. Вам необходимо предоставить больше информации о наборе данных, с которым вы работаете, а также об операциях, которые вы фактически делаете с данными. Например, одним из способов оптимизации String.equals является интернирование экземпляров String. Вы сначала заплатите довольно высокую первоначальную стоимость за создание экземпляров, но позже равные должны вернуть значение true, основанное на ==, прежде чем он потрудится провести полное сравнение. Вам нужно будет решить, применять ли эту оптимизацию на основе рассматриваемого набора данных и того, что вы делаете с данными.

...