Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Можно ускорить StringBuilder? / 19 сообщений из 19, страница 1 из 1
23.07.2014, 21:02
    #38704319
Foror
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ускорить StringBuilder?
Сейчас делаю парсер и ради интереса попробовал сделать простенькую реализацию своего 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
24.07.2014, 08:07
    #38704464
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ускорить StringBuilder?
FororСейчас делаю парсер и ради интереса попробовал сделать простенькую реализацию своего StringBuilder'а, конечно это очень уж черновой вариант, но тем не менее на Core2Duo, Linux, JDK8 получаю в 2-5 быстрее.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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