powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Интерфейсы и быстродействие
9 сообщений из 9, страница 1 из 1
Интерфейсы и быстродействие
    #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
Интерфейсы и быстродействие
    #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
Интерфейсы и быстродействие
    #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
Интерфейсы и быстродействие
    #38243860
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_Samara,
а доклады чтоли записывались на видео? А то были, которые пришлось пропустить из-за параллельных сессий...
...
Рейтинг: 0 / 0
Интерфейсы и быстродействие
    #38244002
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, just_vladimir!

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

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

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


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