
Zahar
27.07.2016
08:01:45
такс
кто шарит в плюсах
что долго работает ксоры или побитовый сдвиг?

Warlock90000
27.07.2016
08:02:11

Google

Zahar
27.07.2016
08:02:15
да

Warlock90000
27.07.2016
08:02:47
тогда не шарю :)

Aragaer
27.07.2016
08:05:24
в смысле без выделенной строки?
если ее удалить, то получаем пару пустых циклов
а, не, один пустой цикл

Danil
27.07.2016
08:06:23
который компилятор удалит

Aragaer
27.07.2016
08:06:41
... или все-таки два. Потому что дальше тоже ничего не относится к первому циклу

Alisa
27.07.2016
08:06:59
https://habrahabr.ru/post/241740/
????????????

Aragaer
27.07.2016
08:07:04
ну а так чо, 900 операций побитового сдвига... хотя конечно не, скорее 480

Danil
27.07.2016
08:08:02

Aragaer
27.07.2016
08:08:12
здесь дороже - 450 операций разыменования
я так понимаю, массив гигантского размера и мы дергаем очень разные его части

Danil
27.07.2016
08:09:14
типа в разных страницах могут лежать разные части массива?

Google

Aragaer
27.07.2016
08:09:15
внутренний цикл идет по j, которая больше, чем i, поэтому на каждой итерации внутреннего цикла у нас идет подгрузка соответствующего куска из памяти, потому что у нас cache miss
да не просто в разных страницах - там индексы различаются на 2^31
ну... 2^29
ок
а в одной странице (если страница 4к) всего-то 1024 интов помещается
если это массив интов такого размера, то он порядка гигабайта
и у нас 450 обращений в почти случайные места этого гигабайтного массива
не в ксорах вобщем дело, и не в сдвигах

Danil
27.07.2016
08:11:33
ща чот меня штырит и мне кажется что там меньше индексы

agic
27.07.2016
08:11:36

Aragaer
27.07.2016
08:12:24
i и j пробегают до 29, то есть наибольшее значение это 1 << 29 + 1 << 28

Paul
27.07.2016
08:12:26

Aragaer
27.07.2016
08:12:53
да, если что, у внешнего цикла можно сделать до < 29 8)

Artem
27.07.2016
08:12:58
http://www.theverge.com/circuitbreaker/2016/7/27/12294530/xiaomi-mi-notebook-air-macbook-competitor

Aragaer
27.07.2016
08:13:01
но я думаю компилятор это сможет понять

Danil
27.07.2016
08:13:39

Aragaer
27.07.2016
08:14:26
можно там пошаманить на тему переупорядочивания циклов, чтобы сгруппировать близкие индексы
но особо не получится

Danil
27.07.2016
08:14:51
да там всего 900 обращений
чо из-за этого париться то?

Google

Aragaer
27.07.2016
08:15:07
450

Danil
27.07.2016
08:15:10
ну 1.5с может для кого-то и беда

Aragaer
27.07.2016
08:16:12
вобщем ксоры и побитовый сдвиг это элементарная арифметика, которую процессор выполняет за очень небольшое число тактов

Danil
27.07.2016
08:16:18
435 ваще

Zahar
27.07.2016
08:16:20

Aragaer
27.07.2016
08:16:24
а подгрузка из оперативки в кэш - за большое
ща, поищу табличку

Zahar
27.07.2016
08:16:53
Там примерно 6 300 000 операций
Непонятно, почему долго так

Danil
27.07.2016
08:17:25
пффффффффф

Zahar
27.07.2016
08:17:33
Мэп протестирован - не в нем

Aragaer
27.07.2016
08:17:36
https://blog.codinghorror.com/the-infinite-space-between-words/

Danil
27.07.2016
08:17:42
тебе выше @aragaer всё норм пояснил

Aragaer
27.07.2016
08:18:28
обращение к незакешированной памяти это порядка 350 циклов процессора

Zahar
27.07.2016
08:18:50

Aragaer
27.07.2016
08:18:53
на каждой итерации цикла у тебя максимум два сдвига и два ксора, это ну 10 щиклов
ооо
ну значит это 450 вычислений хэш функции, а это еще медленнее

Google

Danil
27.07.2016
08:19:37
ну ты же ваще можешь просто проверить, сохранить эти индексы в массив
и сделать одинарный цикл

Zahar
27.07.2016
08:20:00
короче
ради вас
а если добавить ^x - то 1.5c

Aragaer
27.07.2016
08:21:24
а у тебя какие флаги оптимизации стоят?
неужели компилятор сам не догадался это сделать?

Zahar
27.07.2016
08:21:38
-O2

Admin
ERROR: S client not available

Zahar
27.07.2016
08:21:52
что не догадался?

Aragaer
27.07.2016
08:21:54
должен был
x ^ (1 << i) это инвариант в пределах второго цикла
вынесение инвариантов это на о2 должно делаться
а
у тебя же нету c во внутреннем
сделай внутри c ^ (1 << j)

Zahar
27.07.2016
08:23:20
1.6 c

Aragaer
27.07.2016
08:23:45
так что точно не в сдвигах дело и не в ксорах. А в кэш миссах
тьфу

Zahar
27.07.2016
08:23:51
лол

Google

Aragaer
27.07.2016
08:23:53
в вычислении

Danil
27.07.2016
08:24:03
ну она достаточно дерьмовая

Aragaer
27.07.2016
08:24:28
ну разницы между (1 << i) ^ (1 << j) и c ^ (1 << j) немного
ксоров столько же, сдвигов меньше
а работает медленнее

Zahar
27.07.2016
08:25:05
ну, примерно так же

Aragaer
27.07.2016
08:25:25
ты ж сказал 252 мс против 1.6с

Zahar
27.07.2016
08:25:32
а
а, ну, я про x ^ (1 « i) ^ (1 « j)
хз
ну, по крайней мере
стоп

Aragaer
27.07.2016
08:26:08
более того, как мы видим, он делает вынесение инварианта - c ^ (1 << j) работает так же, как x ^ (1 << i) ^ (1 << j)

Danil
27.07.2016
08:26:09
я говорю, пусть попробует брать эти индексы из массива, и увидит, что дело было не в бобине
а в мапе

Zahar
27.07.2016
08:27:44
я попробывал unordered_map заменить на обычный
там хэши не вычисляются, но есть лог из-за к/ч дерева
стало 2с работать
впрочем, это отличие этих структур

Danil
27.07.2016
08:28:51
пщщщ пщщщ попробуй индексы из массива пщщщ пщщщ дело не в ксоре пщщ пщщ