Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Интерфейсы и быстродействие / 9 сообщений из 9, страница 1 из 1
29.04.2013, 12:00:50
    #38243709
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсы и быстродействие
Не собираюсь тут обсуждать уместность применения интерфейсов, а просто решил рассказать об одном наблюдении.
А именно: было подозрение, что применение интерфейсов в критических местах сказывается на быстродействии. В связи с приближающимися праздниками появилось время провести небольшой синтетический тест, вот его результаты. Тестируется быстродействие при использовании конкретного типа объекта, интерфейса и приведения типа. Тестировался простейший метод StringBuilder.length()
исходный код
Код: 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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestInterface {

	private static final int buffSize = 100000;
	static enum TestKind {NATIVE,INTERFACE,CAST}

	private int nativeTest(long count) {
		StringBuilder builder = new StringBuilder();
		for (long i=0;i<count;i++) {
			if (builder.length()>=buffSize)
				builder = new StringBuilder();
			builder.append("a");
		}
		return builder.length();
	}

	private int interfaceTest(long count) {
		StringBuilder builder = new StringBuilder();
		CharSequence sequence = builder;
		for (long i=0;i<count;i++) {
			if (sequence.length()>=buffSize) {
				builder = new StringBuilder();
				sequence = builder;
			}
			builder.append("a");
		}
		return sequence.length();
	}

	private Object createBuilder() {
		return new StringBuilder(); 
	}
	private int castTest(long count) {
		Object test = createBuilder();
		for (long i=0;i<count;i++) {
			if (((CharSequence)test).length()>=buffSize) {
				test = createBuilder();
			}
			((StringBuilder)test).append("a");
		}
		return ((CharSequence)test).length();
	}

	public void test(long count, TestKind testKind) {
		long startTime = System.currentTimeMillis();
		switch (testKind) {
		case NATIVE:nativeTest(count);break;
		case INTERFACE:interfaceTest(count);
		case CAST:castTest(count);
		}
		long finalTime = System.currentTimeMillis();
		System.out.println("testKind:"+testKind+" time:"+(finalTime-startTime));
	}

	private static class RunnableTest implements Runnable {
		@Override
		public void run() {
			TestInterface test = new TestInterface();
			long count = 100000000;
			test.test(count,TestKind.NATIVE);
			test.test(count,TestKind.INTERFACE);
			test.test(count,TestKind.CAST);
		}
	}

	public static void main(String[] args) {
		System.out.println("************* warmUp *******************");
		new RunnableTest().run();
		System.out.println("************* warmUp end ***************");
		//new RunnableTest().run();

		int threadCount = 5;
		ExecutorService s = Executors.newFixedThreadPool(threadCount);
		for (int i=0;i<threadCount;i++) {
			s.execute(new RunnableTest());
		}
	}
}


Не очень уверен насчет castTest, возможно тут работа оптимизатора, но результаты не в пользу интерфейсов:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
************* warmUp *******************
testKind:NATIVE time:1606
testKind:INTERFACE time:3824
testKind:CAST time:1966
************* warmUp end ***************
testKind:NATIVE time:2809
testKind:NATIVE time:2904
testKind:NATIVE time:3029
testKind:NATIVE time:3090
testKind:NATIVE time:3341
testKind:INTERFACE time:6755
testKind:INTERFACE time:6990
testKind:INTERFACE time:7099
testKind:INTERFACE time:7506
testKind:INTERFACE time:7223
testKind:CAST time:3433
testKind:CAST time:3323
testKind:CAST time:3386
testKind:CAST time:3386
testKind:CAST time:3449


Что скажете?
...
Рейтинг: 0 / 0
29.04.2013, 12:07:33
    #38243729
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсы и быстродействие
Моя ошибка.
Такие результаты после исправления
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
************* warmUp *******************
testKind:NATIVE time:1607
testKind:INTERFACE time:1857
testKind:CAST time:1951
************* warmUp end ***************
testKind:NATIVE time:2731
testKind:NATIVE time:2841
testKind:NATIVE time:3029
testKind:NATIVE time:3232
testKind:NATIVE time:3450
testKind:INTERFACE time:3416
testKind:INTERFACE time:3590
testKind:INTERFACE time:3308
testKind:INTERFACE time:3433
testKind:INTERFACE time:3511
testKind:CAST time:3526
testKind:CAST time:3605
testKind:CAST time:3668
testKind:CAST time:3511
testKind:CAST time:3417
...
Рейтинг: 0 / 0
29.04.2013, 12:17:53
    #38243759
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсы и быстродействие
Добрый день, ivanra!

> А именно: было подозрение, что применение интерфейсов в критических
> местах сказывается на быстродействии.

Есть такое. Зависит числа возможных вызовов.
См. http://shipilev.net/pub/talks/j1-April2013-quantum-performance.pdf
слайды 33 и 34. Видео с пояснениями наверное будет, но позже...

> Что скажете?

Если ты доказал, что для тебя эти задержки критичны- то да, разворачивай
вызовы.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.04.2013, 13:05:41
    #38243860
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсы и быстродействие
GKS_Samara,
а доклады чтоли записывались на видео? А то были, которые пришлось пропустить из-за параллельных сессий...
...
Рейтинг: 0 / 0
29.04.2013, 14:51:03
    #38244002
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсы и быстродействие
Добрый день, just_vladimir!

> а доклады чтоли записывались на видео? А то были, которые пришлось
> пропустить из-за параллельных сессий...

Часть писалась.
"Похудание java" писали авторы, обещали выложить, если смотрибельно
(слайды уже есть).
Думаю, что Лёшу и Сергея 100% кто-нибудь писал- оно того стоит.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.04.2013, 16:30:01
    #38244150
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсы и быстродействие
На реальных проектах разница настолько ничтожна, что вы больше потратитесь на подсчет - какова же разница. Более того, пока количество классов в иерархии не более 2 - jit вообще нивелирует разницу
...
Рейтинг: 0 / 0
29.04.2013, 16:37:51
    #38244164
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсы и быстродействие
Это полезно каких-нибудь для научных расчетов, когда вам дают терабайтный набор данных, описывающий состояние какой-то системы, и и это набор данных нужно пропустить через тысячи дифуров и прочих урчп. и расчет после этого будет занимать не 12 часов, а 11 часов 30 минут.
...
Рейтинг: 0 / 0
29.04.2013, 16:40:21
    #38244166
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсы и быстродействие
Т.е. это имеет значение только для задач, которые не делают никакого i/o.
...
Рейтинг: 0 / 0
29.04.2013, 16:56:57
    #38244190
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсы и быстродействие
в 3D увеличение fps в 2-3 раза например, не так уж ничтожно)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Интерфейсы и быстродействие / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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