
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
26.04.2013, 12:06:06
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
Решил все-таки проверить утверждение, что в 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. В jdk 1.6.33 Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. в jdk 1.7.17 (и скомпилировано там же): Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ну иногда +- 1 мс. По-моему, никакой разницы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 12:08:01
|
|||
|---|---|---|---|
Java 7 syncronized |
|||
|
#18+
ivanra, есть вероятность, что вы измерили ничто, так как за пределеами цикла использования counter я не нашел, то и jvm могла решить, раз не использую, то и код вызывать не буду. Почитайте про java тесты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 12:08:40
|
|||
|---|---|---|---|
Java 7 syncronized |
|||
|
#18+
ivanra, а не, нашел ;) извиняюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 12:09:32
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
counter за пределами цикла используется, смотрите на результат печати ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 12:18:53
|
|||
|---|---|---|---|
Java 7 syncronized |
|||
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 12:20:59
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
Я прогнал про Java 7: http://www.oracle.com/technetwork/java/6-performance-137236.html#2.1.1 Вы бы сначала разобрались в вопросе, а потом тестировали. Ну, и 2 секунды на 100 000 000 вызовов - это ничто. synchronized методы они, обычно, толще простого инкремента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 12:28:08
|
|||
|---|---|---|---|
Java 7 syncronized |
|||
|
#18+
сюда б еще добавить второй поток чисто "для вида" и сравнить результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 12:38:15
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
Добрый день, ivanra! > По-моему, никакой разницы В таком простом коде JIT и в 6ке мог всё заинлайнить и удалить синхронизацию. Нативный код смотрели? -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 12:42:16
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
Зачем эти синтетические тесты не понятно чего? Была же речь про StringBuffer vs StringBuilder: http://www.avajava.com/tutorials/lessons/stringbuffer-versus-stringbuilder.html Обратите внимание как к последним итерациям производительность выровнялась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 12:49:58
|
|||
|---|---|---|---|
Java 7 syncronized |
|||
|
#18+
Данная конкретная задача разделяемых счётчиков IMHO эффективнее решалась бы через AtomicInteger::incrementAndGet и интересно было бы сравнить с synchronized. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 12:55:20
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
Тут дело не в счетчиках, а в том времени, которое требуется для синхронизации, даже в 1 потоке. Фактически, можно вычесть вторую строку из первой - получим чистое время, ушедшее на synchronized. до кучи на другой машине: jdk 1.5.22: Код: powershell 1. 2. 3. 4. jdk 1.6.33 Код: powershell 1. 2. 3. 4. jdk 1.7.17 Код: powershell 1. 2. 3. 4. лучшая производительность в 1.5! И кстати, по тестам. Для synchronized это очень облегченный тест, фактически это одноразовое создание монитора и дальше только проверка. В реальных условиях, когда, например, тот же StringBuffer будет многократно создаваться внутри циклов программы, будет гораздо хуже. Не знаю, может это кажется и не так важно, но я начитался в учебниках, что обращение к монитору ОС - это всегда сотни циклов процессора, и ничего тут явой уже не поделаешь, да и ОС врядли поможет - проблема в железе. Поэтому гернерируете большой текст - не используйте StringBuffer, если не требуется синхронизация потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 13:08:56
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
ivanra, Ну, что вы за человек такой. Говорю же. Разберитесь в вопросе прежде чем кому-то что-то доказывать. Например: http://blog.javabenchmark.org/2013/04/jvm-biased-locking-and-micro-benchmark.html Добавляем -XX:BiasedLockingStartupDelay=0 удивляемся новым числам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 13:40:37
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
Другое дело. Я, в принципе, ссылку сразу и просил. Еще бы в официальной документации писали, ну, хоть в блогах нашлось. На всякий случай вот еще: http://habrahabr.ru/post/160049/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 13:43:33
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
ivanraЯ, в принципе, ссылку сразу и просил. Еще бы в официальной документации писали, ну, хоть в блогах нашлось. 14234477 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 13:48:39
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
В том то и дело, что о UseBiasedLocking сообщают, а что оно начинает работать с 4 секунды (BiasedLockingStartupDelay)- умалчивают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 14:02:11
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
Для любопытных помещаю результаты с нулевой задержкой BiasedLockingStartupDelay Код: powershell 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 14:29:18
|
|||
|---|---|---|---|
Java 7 syncronized |
|||
|
#18+
ivanra, и кстати, чувак некоторые проверки на константу можно выносить из цикла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 17:02:44
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
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. вот такие результаты: с настройками по умолчанию Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. с нулевой задержкой -XX:BiasedLockingStartupDelay=0 Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. И действительно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 17:15:13
|
|||
|---|---|---|---|
Java 7 syncronized |
|||
|
#18+
ivanra, я где-то читал что Java (JIT) имеет право переходить от интерпретации байткода к компилляции. И этот момент - недетерминирован точно. Чтобы точно судить о таймингах ты должен сделать 3-4 независимых теста со сборкой isSync={true|false} статично. О оттестировать на разных запусках всего процесса. В противном случае ты получешь всё время замедление для test.test(10000000, true) не потому что синхронность а потому-что JIT решил вмешаться в процесс. Покури также опции -client|server для java аrguments. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 17:26:10
|
|||
|---|---|---|---|
Java 7 syncronized |
|||
|
#18+
Добавьте -XX:CompileThreshold=1. чтобы сразу все методы компилировались. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 17:28:17
|
|||
|---|---|---|---|
Java 7 syncronized |
|||
|
#18+
Кажется так. Вот есть статья на тему "прогрева кода" http://dev-things.blogspot.com/2010/06/blog-post.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 17:31:04
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
Добрый день, 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 17:32:13
|
|||
|---|---|---|---|
Java 7 syncronized |
|||
|
#18+
GKS_Samara, ты не мне, а автору скажи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.04.2013, 19:28:37
|
|||
|---|---|---|---|
|
|||
Java 7 syncronized |
|||
|
#18+
Ну вы даете. Хоть прочитали бы о чем речь. Все эти прогревы учтены, не зря же метод вызывается 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. Это друга машина, ноутбук, тут с многопоточностью напряги, но соотношение понятно По умолчанию: -XX:BiasedLockingStartupDelay=4000 -XX:+UseBiasedLocking Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. "как на сервере": -XX:BiasedLockingStartupDelay=400 Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. И для разнообразия 64-битная jvm (1.6), параметры по умолчанию Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. jdk 1.5 32-битная (UseBiasedLocking отсутствует) Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=59&tablet=1&tid=2129455]: |
0ms |
get settings: |
13ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 323ms |
| total: | 507ms |

| 0 / 0 |
