powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Можно ускорить StringBuilder?
19 сообщений из 19, страница 1 из 1
Можно ускорить StringBuilder?
    #38704319
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас делаю парсер и ради интереса попробовал сделать простенькую реализацию своего StringBuilder'а, конечно это очень уж черновой вариант, но тем не менее на Core2Duo, Linux, JDK8 получаю в 2-5 быстрее. Понятно, что в моём классе нет расширения буфера, но и для StringBuilder сразу задан нормальный буфер, который нет обходимости расширять.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
package ostov.markup.parser;

import static java.lang.System.nanoTime;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

public class StrBuilder {
	
	public static void main(String[] args) throws IOException {
		byte[] data = Files.readAllBytes(new File("/home/foror/Downloads/self-test.txt").toPath());
		char[] src = new String(data).toCharArray();
		
		long avg = 0;
		int count = 1000;
		
		StringBuilder std = new StringBuilder(src.length);
		StrBuilder custom = new StrBuilder(src.length);
		
		for (int k = 0; k < count; k++) {
			long start = nanoTime();
			int i = 0;
			
			while (++i < src.length) {
				std.append(src[i]);
				//custom.append(src[i], i);
			}
			
			avg += nanoTime() - start;
			std = new StringBuilder(src.length);
			custom = new StrBuilder(src.length);
		}
		
		System.out.print((src.length) + "b :" + (avg / count) + " nanosec");
	}
	
	char[] data;
	int length;
	
	int j = 0;
	
	public StrBuilder(int length) {
		data = new char[length];
		this.length = length;
	}
	
	void append(char c, int i) {
		if (i < data.length) {
			data[i] = c;
		} else {
			//System.out.print("ok"); -- увиличивает скорость в 2.5 раза, видимо из-за какого-то предсказания
			// выполняется new char[data.lenght] на всякий пожарный, но из-за этого проседает производ.
			//data2 = new char[data.length];				
		}
	}
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38704464
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FororСейчас делаю парсер и ради интереса попробовал сделать простенькую реализацию своего StringBuilder'а, конечно это очень уж черновой вариант, но тем не менее на Core2Duo, Linux, JDK8 получаю в 2-5 быстрее.

Чем мерил скорость? Правильными средствами , или лаптём по карте?
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38704501
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foror,

У StrBuilder.append(char c, int i) есть аналог StringBuilder.setChatAt(i,c) а не append(c), который будет работать не медленнее вашего.
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38704530
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Tomin, просто запустил программу, как обычные пользователи запускают в системе. К тому же там приличный цикл для прогрева, так что не вижу смысла какие-то доп. средства использовать.
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38704534
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FororК тому же там приличный цикл для прогрева
Где он?
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38704538
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0FD, да, действительно работает также, а иногда даже в 2 раза быстрее, это может быть из-за того, что после выделения буфер забивается \0?
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38704539
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, "for (int k = 0; k < count; k++)"
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38704542
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FororBlazkowicz, "for (int k = 0; k < count; k++)"
В этом цикле уже замеры идут. А прогрев-то где?
А ничего что на клиентской JVM по-умолчанию для активации JIT нужно выполнить 10К итераций?
А тут что считается? Среднее между интерпретацией, и работой скомпилированого кода? Включая время затраченое на саму компиляцию?
Почитайте любую статью по ключевым словам Java micro-benchmarking
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38704568
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, понятно, сделал следующее:

Код: java
1.
2.
3.
4.
5.
6.
int count = 100000;
...
			if (k > 20000)
				avg += nanoTime() - start;
...
System.out.print((src.length) + "b :" + (avg / (count - 20000)) + " nanosec");



В этот раз StringBuilder#append(char) медленнее в 7 раз, чем StrBuilder#append(int,char) и в 20 раз медленнее, чем StringBuilder#append(int, char).

Мне нужно будет отдавать контент юзерам, генерируя html через StringBuilder и то, что #append(int, char) работает в 20 раз быстрее, довольно интересное открытие :)
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38704571
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foror,

Не проще ли просто открыть код StringBuilder/AbstractStringBuilder и посмотреть методы? Там, например везде имеются проверки на границы или на размер буфера. Очевидно, что если их выкинуть, будет быстрее.
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38704575
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, это понятно, просто хотелось понять сколько я теряю в производительности, если 2-3 раза, то ладно, но когда в 20 раз быстрее, то гораздо интереснее. Не ожил, что могут быть такие результаты.
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38705303
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОчевидно, что если их выкинуть, будет быстрее.
Не факт.

Ряд реализаций JVM, проверки на попадание в array например не делает, если такая проверка уже была Выше по коду.

Мне особо нравится комментарий:
...увиличивает скорость в 2.5 раза, видимо из-за какого-то предсказания
Когда я пытался на таких тривиальных операциях мерить, у меня тоже получалось +/- лапоть. Т.к. введение пустого и тривиального кода или перестановка 2-3 строк местами могло сказаться на скорости от 2-3 до 10 раз.

Большая проблема производительности современных процов - предсказание перехода и промахи. К сожалению, в Java, как ни оптимизируй. данные критерии НИКАК не изменишь.

Я с учетом JIT компиляции и возможности JIT компилятора на лету перестраивать код (по статистике) - то, что можно намерить в тесте, может очень сильно отличаться от того, что будет в проде.
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38705312
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно если можно прогнать на реальных данных, или на данных близких к реальным - я такую прогонку делаю. И обычно, если на тестовых данных есть выигрыш, то он есть и на реальных.
Ествественно, такой прогон не должен быть микробенчмаркингом. Например, извлечение из базы и обработка особым образом 1млн записей. Прогнали тест - занимает 8сек, подсунул коннектор от mariadb вместо мускуловского - обработка тех же данных 20сек. Я таким тестам обычно доверяю, т.к. на больших обьемах там должно было уже все скомпилиться. А если оно не скомпилилось - то и в продакшене оно не скомпилится.
а ловить время одной команды - это конечно маразм...
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38705368
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не сторонник преждевременной оптимизации, но считаю есть проекты, где нужно изначально обдумывать узкие горлышки. В моём случае это веб-фреймворк, в котором 50% нагрузки это работа с текстом. А потому нужны шустрые методы.

Даже с этим тестом, мне в итоге пришлось намного дольше ждать (разница в перформансе 20x!), пока выполнится медленный метод. Соответственно в реальной ситуации, при нагрузке будет нужен не один, а 20 серверов. А это существенная разница.
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38705413
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой-то странный фрейм-ворк.

Скорее, проблемой должна быть передача текста "туда-сюда-обратно" между компонентами. Боюсь, скорость работы StringBuilder'а там будет на одном из предпоследних мест. Значительно менее важна, чем даже просто выделения/очистки памяти под объекты String

+получение-отдача запроса по сети +бизнес обработка.

Что бы бутылочным горлышком был именно StringBuilder, мне такого даже не представить.
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38705419
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FororЯ не сторонник преждевременной оптимизации, но считаю есть проекты, где нужно изначально обдумывать узкие горлышки. В моём случае это веб-фреймворк, в котором 50% нагрузки это работа с текстом. А потому нужны шустрые методы.

Даже с этим тестом, мне в итоге пришлось намного дольше ждать (разница в перформансе 20x!), пока выполнится медленный метод. Соответственно в реальной ситуации, при нагрузке будет нужен не один, а 20 серверов. А это существенная разница.

А зачем вам StringBuilder внутри Web Framework? Откажитесь от String полностью. CharSequence + Reader\Writer дадут бОльшую производительность чем множественные преобразования в String
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38705452
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FororBlazkowicz, это понятно, просто хотелось понять сколько я теряю в производительности, если 2-3 раза, то ладно, но когда в 20 раз быстрее, то гораздо интереснее. Не ожил, что могут быть такие результаты.

1. Таки замеры производительности в мелких кусках кода- очень сложная штука в java. послушайте лекции автора библиотеки, на которую я давал ссылку- Алексея Шипилёва. Он на понятном русском языка на эту (да и другие) тему говорит. Вы просто не понимаете всей сложности проблемы.

2. Пока это не узкое место-не партесь на тему скорости сбора строки. Если будет узким местом- перепишете хоть на заполнение массива вручную. Но правду говорят- серверный компилятор может очень сильно изменить реальную скорость кода. Т.е. всё же прислушайтесь к п.1.
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38705632
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczА зачем вам StringBuilder внутри Web Framework? Откажитесь от String полностью. CharSequence + Reader\Writer дадут бОльшую производительность чем множественные преобразования в String

Им собирается конечная страница из дерева компонетов. Парсер из char'ов делает String'и, поэтому в итоге SB будет собирать именно String'и. И тут пока не заморачиваюсь, что будет быстрее String'и или char[].

CharSequence это просто интерфейс, если не ошибаюсь к нему даже String можно привести. А вот, то, что отдавать сразу на Writer, я как-то не подумал :) Думаю потом оно конечно всплыло бы, рука-лицо :)
...
Рейтинг: 0 / 0
Можно ускорить StringBuilder?
    #38705647
Foror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, и про CharSequence понял, о чём вы :) Тут действительно можно попробовать всё в char[] и оставить, без преобразований в String'и на ридере.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Можно ускорить StringBuilder?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]