Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Java 7 syncronized / 25 сообщений из 29, страница 1 из 2
26.04.2013, 12:06:06
    #38241243
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Решил все-таки проверить утверждение, что в 7 syncronized в 1 потоке ничего не стоит.
Код: 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.
public class TestSynchronized {
	private long counter;
	private void inc() {
		counter++;
	}
	private synchronized void incSynchronized() {
		counter++;
	}
	public void test(long count, boolean isSync) {
		counter = 100000;
		long startTime = System.currentTimeMillis();
		for (long i=0;i<count;i++) {
			if (isSync)
				incSynchronized();
			else
				inc();
		}
		long finalTime = System.currentTimeMillis();
		System.out.println("synchronized:"+isSync+" time:"+(finalTime-startTime));
		System.out.println(counter);
	}

	public static void main(String[] args) {
		TestSynchronized test = new TestSynchronized();
		test.test(10000000, true);
		test.test(10000000, false);
	}
}


В jdk 1.6.33
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
synchronized:true time:249
10100000
synchronized:false time:47
10100000

для 100000000:
synchronized:true time:2465
100100000
synchronized:false time:438
100100000



в jdk 1.7.17 (и скомпилировано там же):
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
synchronized:true time:250
10100000
synchronized:false time:47
10100000

для 100000000:
synchronized:true time:2418
100100000
synchronized:false time:438
100100000


ну иногда +- 1 мс.
По-моему, никакой разницы
...
Рейтинг: 0 / 0
26.04.2013, 12:08:01
    #38241248
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
ivanra,

есть вероятность, что вы измерили ничто, так как за пределеами цикла использования counter я не нашел, то и jvm могла решить, раз не использую, то и код вызывать не буду. Почитайте про java тесты.
...
Рейтинг: 0 / 0
26.04.2013, 12:08:40
    #38241251
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
ivanra,

а не, нашел ;) извиняюсь.
...
Рейтинг: 0 / 0
26.04.2013, 12:09:32
    #38241253
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
counter за пределами цикла используется, смотрите на результат печати
...
Рейтинг: 0 / 0
26.04.2013, 12:18:53
    #38241268
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
ivanra,

тем не менее, можете дать ссылку на
ivanraРешил все-таки проверить утверждение, что в 7 syncronized в 1 потоке ничего не стоит.


И до кучи:
http://stackoverflow.com/questions/1503479/how-to-see-jit-compiled-code-in-jvm
http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java
...
Рейтинг: 0 / 0
26.04.2013, 12:20:59
    #38241270
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Я прогнал про Java 7:
http://www.oracle.com/technetwork/java/6-performance-137236.html#2.1.1
Вы бы сначала разобрались в вопросе, а потом тестировали.
Ну, и 2 секунды на 100 000 000 вызовов - это ничто. synchronized методы они, обычно, толще простого инкремента.
...
Рейтинг: 0 / 0
26.04.2013, 12:28:08
    #38241281
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
сюда б еще добавить второй поток чисто "для вида" и сравнить результат.
...
Рейтинг: 0 / 0
26.04.2013, 12:38:15
    #38241298
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Добрый день, ivanra!

> По-моему, никакой разницы

В таком простом коде JIT и в 6ке мог всё заинлайнить и удалить
синхронизацию. Нативный код смотрели?

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.04.2013, 12:42:16
    #38241308
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Зачем эти синтетические тесты не понятно чего? Была же речь про StringBuffer vs StringBuilder:
http://www.avajava.com/tutorials/lessons/stringbuffer-versus-stringbuilder.html
Обратите внимание как к последним итерациям производительность выровнялась.
...
Рейтинг: 0 / 0
26.04.2013, 12:49:58
    #38241328
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Данная конкретная задача разделяемых счётчиков IMHO эффективнее решалась бы через AtomicInteger::incrementAndGet
и интересно было бы сравнить с synchronized.
...
Рейтинг: 0 / 0
26.04.2013, 12:55:20
    #38241341
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Тут дело не в счетчиках, а в том времени, которое требуется для синхронизации, даже в 1 потоке. Фактически, можно вычесть вторую строку из первой - получим чистое время, ушедшее на synchronized.
до кучи на другой машине: jdk 1.5.22:
Код: powershell
1.
2.
3.
4.
synchronized:true time:2372
100100000
synchronized:false time:297
100100000


jdk 1.6.33
Код: powershell
1.
2.
3.
4.
synchronized:true time:2434
100100000
synchronized:false time:438
100100000


jdk 1.7.17
Код: powershell
1.
2.
3.
4.
synchronized:true time:2434
100100000
synchronized:false time:437
100100000


лучшая производительность в 1.5!
И кстати, по тестам. Для synchronized это очень облегченный тест, фактически это одноразовое создание монитора и дальше только проверка. В реальных условиях, когда, например, тот же StringBuffer будет многократно создаваться внутри циклов программы, будет гораздо хуже.
Не знаю, может это кажется и не так важно, но я начитался в учебниках, что обращение к монитору ОС - это всегда сотни циклов процессора, и ничего тут явой уже не поделаешь, да и ОС врядли поможет - проблема в железе. Поэтому гернерируете большой текст - не используйте StringBuffer, если не требуется синхронизация потоков.
...
Рейтинг: 0 / 0
26.04.2013, 13:08:56
    #38241380
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
ivanra,
Ну, что вы за человек такой. Говорю же. Разберитесь в вопросе прежде чем кому-то что-то доказывать.
Например:
http://blog.javabenchmark.org/2013/04/jvm-biased-locking-and-micro-benchmark.html
Добавляем
-XX:BiasedLockingStartupDelay=0
удивляемся новым числам.
...
Рейтинг: 0 / 0
26.04.2013, 13:40:37
    #38241450
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Другое дело. Я, в принципе, ссылку сразу и просил. Еще бы в официальной документации писали, ну, хоть в блогах нашлось.
На всякий случай вот еще: http://habrahabr.ru/post/160049/
...
Рейтинг: 0 / 0
26.04.2013, 13:43:33
    #38241460
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
ivanraЯ, в принципе, ссылку сразу и просил. Еще бы в официальной документации писали, ну, хоть в блогах нашлось.

14234477
...
Рейтинг: 0 / 0
26.04.2013, 13:48:39
    #38241474
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
В том то и дело, что о UseBiasedLocking сообщают, а что оно начинает работать с 4 секунды (BiasedLockingStartupDelay)- умалчивают
...
Рейтинг: 0 / 0
26.04.2013, 14:02:11
    #38241522
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Для любопытных помещаю результаты с нулевой задержкой BiasedLockingStartupDelay
Код: powershell
1.
2.
3.
4.
synchronized:true time:593
100100000
synchronized:false time:437
100100000
...
Рейтинг: 0 / 0
26.04.2013, 14:29:18
    #38241584
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
ivanra, и кстати, чувак некоторые проверки на константу можно выносить из цикла.
...
Рейтинг: 0 / 0
26.04.2013, 17:02:44
    #38241927
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
maytonivanra, и кстати, чувак некоторые проверки на константу можно выносить из цикла.
Код не оптимальный, но это и неважно. главное, действия идентичные. Отнимаем вторую строчку от первой, получаем чистое время на синхронизацию.
У меня core I5 3.1 GHz. Будем считать, что за время теста частота не менялась.
Итого, на 10^8 итераций было израсходовано 2*3*10^9 тактовых циклов процессора.
Получаем ~60 тактов на честный synchronized (в однопоточном приложении, с несколькими потоками и конкуренцией, думаю, увеличится на порядок).
Предлагаемая оптимизация - вынос условного перехода за цикл. Да еще со стековой переменной. Скорее всего, ее стоимость не более 1 такта, а то и меньше, учитывая алгоритмы предсказания.
Для интереса сделал многопоточный тест "из жизни StringBuilder и StringBuffer" с прогревом.
Код: 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.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class TestSynchronized {

	private static final int buffSize = 100000;
	private int bufferTest(long count) {
		StringBuffer buffer = new StringBuffer();
		for (long i=0;i<count;i++) {
			if (buffer.length()>=buffSize)
				buffer = new StringBuffer();
			buffer.append("a");
		}
		return buffer.length();
	}
	private int builderTest(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();
	}
	public void test(long count, boolean isSync) {
		long startTime = System.currentTimeMillis();
		if (isSync) 
			bufferTest(count);
		else
			builderTest(count);
		long finalTime = System.currentTimeMillis();
		System.out.println("synchronized:"+isSync+" time:"+(finalTime-startTime));
	}

	private static class RunnableTest implements Runnable {
		@Override
		public void run() {
			TestSynchronized test = new TestSynchronized();
			long count = 100000000;
			test.test(count, true);
			test.test(count, false);
		}
	}
	public static void main(String[] args) {
		System.out.println("************* warmUp *******************");
		new RunnableTest().run();
		System.out.println("************* warmUp end ***************");

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


вот такие результаты:
с настройками по умолчанию
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
************* warmUp *******************
synchronized:true time:5179
synchronized:false time:1608
************* warmUp end ***************
synchronized:true time:3589
synchronized:true time:3699
synchronized:true time:3699
synchronized:true time:3730
synchronized:true time:3777
synchronized:false time:2996
synchronized:false time:2871
synchronized:false time:2949
synchronized:false time:2965
synchronized:false time:3043


с нулевой задержкой -XX:BiasedLockingStartupDelay=0
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
************* warmUp *******************
synchronized:true time:1996
synchronized:false time:1593
************* warmUp end ***************
synchronized:true time:3448
synchronized:true time:3590
synchronized:true time:3605
synchronized:true time:3917
synchronized:true time:3916
synchronized:false time:2917
synchronized:false time:3122
synchronized:false time:2965
synchronized:false time:2856
synchronized:false time:2981


И действительно...
...
Рейтинг: 0 / 0
26.04.2013, 17:15:13
    #38241947
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
ivanra, я где-то читал что Java (JIT) имеет право переходить от интерпретации
байткода к компилляции. И этот момент - недетерминирован точно.

Чтобы точно судить о таймингах ты должен сделать 3-4 независимых теста
со сборкой isSync={true|false} статично. О оттестировать на разных
запусках всего процесса.

В противном случае ты получешь всё время замедление для test.test(10000000, true)
не потому что синхронность а потому-что JIT решил вмешаться в процесс.

Покури также опции -client|server для java аrguments.
...
Рейтинг: 0 / 0
26.04.2013, 17:26:10
    #38241967
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Добавьте -XX:CompileThreshold=1. чтобы сразу все методы компилировались.
...
Рейтинг: 0 / 0
26.04.2013, 17:28:17
    #38241974
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Кажется так. Вот есть статья на тему "прогрева кода"

http://dev-things.blogspot.com/2010/06/blog-post.html
...
Рейтинг: 0 / 0
26.04.2013, 17:31:04
    #38241978
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Добрый день, mayton!

> ivanra, я где-то читал что Java (JIT) имеет право переходить от
> интерпретации байткода к компилляции. И этот момент - недетерминирован точно.


Да, переходят.
Так что почитайте про тестирование производительности- много смешного
узнаете.
Ещё есть client/server VM. Клиентская машина быстрее (т.е. после
меньшего числа вызовов и менее оптимизировано) компилит код, серверная
позже и тщательнее (что-то порядка после 10000 вызов метода).
В 32-битной винде по-умолчанию клиенская VM, в других- серверная. Можно
смешивать.

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

Про выкидывание ненужного кода, засовывание переменной в регистр- да
легко. А ещё escape-анализ

> Чтобы точно судить о таймингах ты должен сделать 3-4 независимых теста
> со сборкой isSync={true|false} статично. О оттестировать на разных
> запусках всего процесса.

Надо ещё при тесте первые 10000 итераций не учитывать ("прогрев").

В целом- тестирование производительности java настолько сложна, что
делать её не представляя работу JIT и т.п. не стоит- результат будет
очень далёк от истины и ты посмешишь старших товарищей.

Почитай, например, статьи
Шипилёва - пожалуй самые
толковые на эту тему на русском языке.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.04.2013, 17:32:13
    #38241981
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
GKS_Samara, ты не мне, а автору скажи!
...
Рейтинг: 0 / 0
26.04.2013, 19:28:37
    #38242121
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
Ну вы даете. Хоть прочитали бы о чем речь. Все эти прогревы учтены, не зря же метод вызывается 100000000 раз, я не стал просто заострять внимание, думал и так понятно.
Все дело в этом пресловутом -XX:BiasedLockingStartupDelay, значение по умолчанию которого 4 секунды.
1 тест - прогрев был более 4 секунд, поэтому и получили после прогрева результаты такие же, как с -XX:BiasedLockingStartupDelay=0.
Отключаем новый алгоритм -XX:-UseBiasedLocking - и никакая компиляция не спасает
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
************* warmUp *******************
synchronized:true time:5697
synchronized:false time:2165
************* warmUp end ***************
synchronized:true time:15488
synchronized:true time:15819
synchronized:true time:15844
synchronized:true time:16232
synchronized:true time:16575
synchronized:false time:5978
synchronized:false time:5883
synchronized:false time:6036
synchronized:false time:5849
synchronized:false time:5652


Это друга машина, ноутбук, тут с многопоточностью напряги, но соотношение понятно
По умолчанию: -XX:BiasedLockingStartupDelay=4000 -XX:+UseBiasedLocking
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
************* warmUp *******************
synchronized:true time:5026
synchronized:false time:2180
************* warmUp end ***************
synchronized:true time:6267
synchronized:true time:6361
synchronized:true time:6615
synchronized:true time:6711
synchronized:true time:7315
synchronized:false time:5278
synchronized:false time:5338
synchronized:false time:5345
synchronized:false time:5352
synchronized:false time:5047


"как на сервере": -XX:BiasedLockingStartupDelay=400
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
************* warmUp *******************
synchronized:true time:2885
synchronized:false time:2175
************* warmUp end ***************
synchronized:true time:6491
synchronized:true time:6399
synchronized:true time:6602
synchronized:true time:6802
synchronized:true time:6831
synchronized:false time:5396
synchronized:false time:5446
synchronized:false time:5351
synchronized:false time:5350
synchronized:false time:5376


И для разнообразия
64-битная jvm (1.6), параметры по умолчанию
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
************* warmUp *******************
synchronized:true time:4635
synchronized:false time:1613
************* warmUp end ***************
synchronized:true time:3631
synchronized:true time:3772
synchronized:true time:4247
synchronized:true time:4235
synchronized:true time:5119
synchronized:false time:3438
synchronized:false time:3914
synchronized:false time:3409
synchronized:false time:3471
synchronized:false time:2966


jdk 1.5 32-битная (UseBiasedLocking отсутствует)
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
************* warmUp *******************
synchronized:true time:6591
synchronized:false time:3026
************* warmUp end ***************
synchronized:true time:33973
synchronized:true time:34696
synchronized:true time:35286
synchronized:true time:35384
synchronized:true time:36354
synchronized:false time:18357
synchronized:false time:18837
synchronized:false time:17528
synchronized:false time:19462
synchronized:false time:19846
...
Рейтинг: 0 / 0
26.04.2013, 19:37:31
    #38242132
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java 7 syncronized
ivanra, ты умник, так и не внял моей просьбе. Ну нравиться тебе в цикле константу проверять.
Ну сделай хотя-бы из принципа оптимизацию. Чтоб к тебе уж не придрались за системную
погрешность.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Java 7 syncronized / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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