|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
booby ВсеРазумный ... код - говнокод без логики зачем же делать глупость , компилируя его? Что бы показать что он делает на данный момент. А делает он это, как раз таки не с проста. Прошу обратить внимания на Код: plaintext 1.
А мы помним что Код: plaintext 1.
И компилятор это знает. А значит он просто берёт, вырезает всё до - того, что будет использовано вообще в коде.. Таким образом, мы должны обмануть компилятор, и сказать что ты ничего не знаешь, вот таким образом Код: plaintext 1.
И переписать код, вот таким образом Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
И тогда мы увидим наш asm в виде switch else - if Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 14:00 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
ВсеРазумный То есть теперь, глядя на это... Можно смело покрутить у виска человеку, который говорит что расположение DEFAULT в коде влияет на что - то. ну вообще default то можно всегда в конец ставить, его место там. но вот то что перемещение case никак не меняет асм - это странно конечно... Может потому что мало значений и они типа в кеше помещаются? Реально пробегать по всему циклу из миллиона значений это какая-то дичь А если if/elseif/else ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 14:24 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Алексей Роза Может потому что мало значений и они типа в кеше помещаются? Неа..Как Я говорил раньше, компилятор не глупый... Так что да, он их сам сортирует как ему лучше будет использовать код. Это в 2020г называется - оптимизацией. Алексей Роза Реально пробегать по всему циклу из миллиона значений это какая-то дичь А если if/elseif/else ? Если ты напишешь elseif конструкцию. То она будет аналогично со switch и это во всех компиляторах так... Включая Delphi и так далее. Что бы реально избавиться от этой конструкции, надо использовать goto array pointer ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 14:36 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
booby Если у кого-то есть ссылки на актуальные исходники, например для 8-ки, бросьте пожалуйста ссылку в этот топик. Глянуть может быть и интересно было бы. Я поищу в том-же OpenJDK бранч или тег с которого релизилась восьмерка. И можно даже посмотреть какие были сделаны изменения в HEAD ревизии за прошедшие лет 6. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 14:36 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Алексей Роза, Компилятор создал дубликат функции https://godbolt.org/z/zGEb7q Он понял что ничем не отличается код ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 14:43 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Код: plaintext 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.
Чёт прожал и не заметил Там везде по = ровно было ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:27 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
ВсеРазумный Неа..Как Я говорил раньше, компилятор не глупый... Так что да, он их сам сортирует как ему лучше будет использовать код. Это в 2020г называется - оптимизацией. ок, спрошу по-другому: а почему он ЭТО считает оптимизированным кодом? Почему перебирать миллион значений каждый раз - это оптимально? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:28 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Алексей Роза, Потому что это универсально. К примеру у тебя есть "1, 2, 3, 8343, 9453, 88667" (Уже отсортированный компилятором) И как ты хочешь, что бы он оптимизировал код, не перебирая ? Ну допустим он возьмёт "1,2,3" и запишет их как goto array pointer А остальные "8343, 9453, 88667" ему всё равно придётся перепроверить через else-if] Вот так и выходит, что изначально так и было сделано. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:35 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Алексей Роза, Вот кстати подтверждения, если раньше мы получали извлечение из массива Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Но если нарушить порядок, и сделать большие цифры. То мы получим Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:39 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
блин, а что это у вас такое авторif (i = 1) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:39 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
ВсеРазумный К примеру у тебя есть "1, 2, 3, 8343, 9453, 88667" (Уже отсортированный компилятором) да не надо мне их сортировать я знаю, что 8343 случается в 10 раз чаще, и поставил его вперёд. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:40 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Алексей Роза, При этом, если радиус небольшой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
после 2 сразу 4 и потом 8 то он увеличивает табоицу массива Код: plaintext 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.
И вот это как раз тот самый случай Goto array to pointer В таком случае оно работает ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:41 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Алексей Роза ВсеРазумный К примеру у тебя есть "1, 2, 3, 8343, 9453, 88667" (Уже отсортированный компилятором) да не надо мне их сортировать я знаю, что 8343 случается в 10 раз чаще, и поставил его вперёд. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Компилятор сам знает. ASM не поменялся, от того что ты поставил выше Ручками. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:43 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
вот норм порядок и безо всякой компиляторской отсебятины https://godbolt.org/z/P1Mzxn ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:43 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
и странно, что "умный компилятор" просто 52 не оставил, ведь там константа в compile-time ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:46 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Алексей Роза и странно, что "умный компилятор" просто 52 не оставил, ведь там константа в compile-time Она же не inline функция, что бы таким баловаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:48 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Алексей Роза, Глянул что там у тебя. Кстати, умный компилятор Пошёл дальше. И увидел что функция никак не используется. Ничего полезного не делает. И по этому Код: plaintext 1. 2. 3.
Пустая процедура main Код: plaintext 1. 2. 3. 4. 5.
Код: plaintext 1. 2.
Однако сё работает. Код: plaintext 1.
Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 16:20 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
booby У Кернигана можно найти упоминание о том, произвольность местоположения default была выбрана сознательно , в расчете на то, что при возникновении необходимости дописывать что-то в существующий switch, корпоративные программисты хотели бы и будут размещать новые ветки ниже уже существующих, а не произвольным образом втыкивать их между старыми, превращая старый код в неузнаваемый. А куда втискивать новые CASE программистам, которые кодят после программистов, которые уже втыкнули свой код после default? Мне кажется, что вы просто глумитесь ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 16:47 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Может быть проще для логики кодо-генерации. Открыть оператор switch() и сразу бросить дефолтную секцию и потом уже дописывать кейсы по мере поступления фактов. Как опциональные аргументы. Минус 1 переменная в генераторе. И по поводу количественных limitations. Тоже ведь никто не гарантирует что код на "C" писал человек. Вполне может быть продукт biacc/byzon/antlr/Zubr генерации. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 19:01 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Тупанул. Зачем качать когда и так онлайн доступно. Вобщем вот так лучше Актуальная версия. https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/String.java Версия примерно по релизному тегу JDK-8-b120 https://github.com/openjdk/jdk/blob/9a9add8825a040565051a09010b29b099c2e7d49/jdk/src/share/classes/java/lang/String.java ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2020, 11:18 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
исходник Код: plaintext 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.
(g++.exe (Rev2, Built by MSYS2 project) 9.2.0) Судя по генерируемому коду, оптимизатор C++ пытается уменьшить количество инструкций перехода. Поэтому в результате получается откровенный маразм, больше похожий на работу какого-нибудь обфускатора. результат Код: asm 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2020, 13:19 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
rdb_devСудя по генерируемому коду, оптимизатор C++ пытается уменьшить количество инструкций перехода. Ну ты же сам ему сказал оптимизировать на скорость, а переходы плохо сочетаются со спекулятивным выполнением в процессорах. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2020, 13:31 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
rdb_dev, Давно известно, что машинные оптимизаторы/генераторы далеки от совершенства. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2020, 13:33 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
mayton, спасибо за ссылки. Я так понимаю, что кишки у новой версии от 9ки тянутся. В 8ке, в более поздних релизах, возможно, она тоже подтянута. Актуальная версия, как база, годится для реализации любого типа кодировки и представления строки. Впечатление у меня такое: Понятно, что когда-то начиналось с того, что сейчас называют UCS-2. Потом долепились составные символы и получился UTF-16. Так как составные символы "практически никому не нужны" и "интерфейс charAt трогать нельзя", то работа с кодепойнтами прилепилась нашлепкой - "если кому надо, за практическую константу со всем разберутся". Встретил упоминание занятного документационного бага - исходный код обманка, показывающая "как оно было бы", если бы на самом деле реализовывалось на java. Кто-то раскопал, что в каких-то местах исходный код не соответствует работе фактически используемых интризиков, и "хорошо бы поправить". Не знаю, стали исправлять исходник или нет, лень искать регистрацию этого бага... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2020, 13:38 |
|
|
start [/forum/topic.php?fid=57&msg=39984686&tid=2017371]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 411ms |
0 / 0 |