|
|
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima T, еще быстрее Нет. Медленнее. 1,55 сек. Тут k надо перечитывать. У меня не надо. Она в регистре живет. Можно еще подобным образом пошаманить над циклом заполнения Код: plaintext 1. 2. 3. 4. 5. сделать обращение к биткарте 4хбайтным и v >> 3 как-то оптимизировать, т.к. в 32 бита по несколько раз много счетчиков попадает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:32 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Это шаманство дает копеечное ускорение. Я бы все-таки копал в сторону уменьшения количества счетчиков. Сейчас их 25. Шаг Код: sql 1. хотя бы как-то убрать самые частые: 4 6 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:39 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, Ясно. С заполнением бит-карты вряд ли быстрее удастся. Можно, конечно, немного поиграть с разворачиванием цикла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:40 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Посчитал сколько бит сбрасывается из 1 в ноль Код: plaintext 1. 2. 3. 4. Код: sql 1. потенциальная возможность для ускорения совершенствованием алгоритма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:52 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TЭто шаманство дает копеечное ускорение. Я бы все-таки копал в сторону уменьшения количества счетчиков. Сейчас их 25. Шаг Код: sql 1. хотя бы как-то убрать самые частые: 4 6 10 счетчики 4, 16, 32, 34, 36, 40, 48 можно сделать двумя битовыми масками при подсчете результата, если цикл развернуть еще вдвое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:56 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, ошибочка только счетчики 4, 16, 32 можно сделать одной битовой маской при подсчете результата ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:04 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovсчетчики 4, 16, 32, 34, 36, 40, 48 можно сделать двумя битовыми масками при подсчете результата, если цикл развернуть еще вдвое. не понял о чем речь, давай поподробнее. только не забывай что мы их уже один раз модифицировали 18815259 : 4 это 2+4k, т.е. с 2 шаг 4 16 это 8+16k и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:05 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, по всем счетчикам, на которые делится 32 (они дают повторы битов через 32) один раз формируем маску mask, и далее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. естественно, эти счетчики не участвуют в заполнении бит-карты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:11 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
последействие паскаля, вместо xor надо было ^ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:15 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima T, по всем счетчикам, на которые делится 32 (они дают повторы битов через 32) один раз формируем маску mask, и далее понял, сегодня уже плохо соображаю, завтра затестю. Я еще голову ломаю как бы счетчики с отношением 3 склеить. Там шаг должен быть 1,2,1,2 т.е. можно менять шаг битовым сдвигом туда-обратно после каждого шага. Это в мыслях пока. текущий вариант исходника Код: 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. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:20 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T Я еще голову ломаю как бы счетчики с отношением 3 склеить. Там шаг должен быть 1,2,1,2 т.е. можно менять шаг битовым сдвигом туда-обратно после каждого шага. Это просто: step=3-step. Придется хранить не 2, а 3 описателя для каждого счетчика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:25 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Кстати, не будет так быстрее? Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:29 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovКстати, не будет так быстрее? Код: plaintext 1. 2. 3. 4. так еще медленнее. Что-то у меня 1,15 сек 18815517 опять вырасли до 1,4. хз чего направил завтра перепроверю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:39 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima Tпонял, сегодня уже плохо соображаю, завтра затестю. Там есть пара тонких мест: 1) кратность размера окна 4 байтам (32 битам) - ну это и так есть, 2) кратность общего количества лампочек 32 - если ее нет, то придется вычесть лишние висячие биты маски. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:42 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima Tпонял, сегодня уже плохо соображаю, завтра затестю. Там есть пара тонких мест: 1) кратность размера окна 4 байтам (32 битам) - ну это и так есть, 2) кратность общего количества лампочек 32 - если ее нет, то придется вычесть лишние висячие биты маски. 1. есть 2. есть. Заполнение биткарты счетчиками заканчивается на N, а вот с масками на 4,16,32 это надо будет учесть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:54 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Ого тут букв! А пробовали учесть повторы делителей 3,4,5 ? Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 21:59 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
mayton, пока что ясно: 1) шаги 2, 4, 8, 16, 32 учитываются одной общей маской при подсчете суммы, 2) шаги X и 2X заменяются одним сдвинутым шагом 2X, 3) шаги X и 3X заменяются одним переменным сдвинутым шагом 2X/2 остальное пока неясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 22:31 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
опечатка 3) шаги X и 3X заменяются одним переменным сдвинутым шагом 2X/X ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 22:42 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Восстановил исходник, который работал 1,15 сек. ИМХУ склеивание счетчиков тупиковый путь. Для того что очевидно как клеить (типа кратных двум) скорее всего сделали тесты так чтобы клеить было нечего. Переделал наихудшие тесты с учетом нашей оптимизации по склеиванию кратных двум. это считается 1,75 сек Код: sql 1. 2. это считается 1,4 сек и никак не склеится Код: sql 1. 2. Мне кажется надо в первую очередь оптимизировать малые счетчики, т.к. там проходов больше всего СчетчикИтерацийДоля250000000014.3%33333333339.5%42500000007.1%52000000005.7%61666666664.8%71428571424.1%81250000003.6% Счетчики 2,4,8,16,32 суммарно 27,7% итераций. Оптимизация масками должна заметно их ускорить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 08:55 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Любые малые счетчики можно масками наносить, просто надо сдвиг дополнительный, например для 3x: Код: sql 1. 2. 3. 4. 5. для 5 уже таблица сдвигов [3,1,4,2 ...] Думаю можно развить эту идею: 18815352 заготовить каждому счетчику биткарту выравненную по 4 байтам и наносить счетчики биткартами. В каждой биткарте байт будет не более значение счетчика * 4. Для 2,4,8,16,32 можно одну общую биткарту использовать. Для счетчиков кратных 2,4,8,16 тоже общие биткарты можно. Например 5, 20, 40 должны объединиться на биткарте 40, если не напутал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 09:14 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, думаю, ощутимый выигрыш даст только маска для степеней двойки. Для других сдвигов маска малопригодна, т.к. придется работу переносить в подсчет, а там будет довольно накладно запоминать состояния переменного числа шагов. Ну, может быть, стоит шаг=3 отдельно учесть. Т.е. делаем размер окна кратным 12 байт, и если тройка есть среди множителей, то подсчет идет другим циклом, развернутым в 3 раза. Можно и подсчет без тройки тоже развернуть. И, думаю, от склейки по 2 не стоит отказываться, т.к. она дается даром. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 09:38 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Склейка 1 к 3 или 2 к 3 тоже достаточно дешева: для всех таких (1 к 3 или 2 к 3) заполнение окна делаем в другом цикле, который отличается от твоего одним лишним вычитанием в теле цикла step=m-step ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 09:46 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Ты не понял, для счетчика один раз инициализируется биткарта, примеры на 8-битовых (биты в обратном порядке 0-7 для наглядности): Код: sql 1. 2. 3. дальше просто зацикливаем маску и по кругу. Предыдущая оптимизация с двойками не теряется, но и добавляются новые. Например маска для 3 дважды ложится в 6, т.е. их склеиваем при инициализации. То же самое с 12, туда лезут 3,6. В 48 влезут 2,3,4,6,8,12,16,24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 09:55 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
В общем вся математика на этапе инициализации, во время расчета тупо XOR двойными словами( по 32 бита) и подсчет результатов. Даже изврата с единицей не надо, ее в любую маску можно добавить. Должно сработать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 10:00 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Я понял, потому что думал над этим раньше ) Тут очень большая проблема, которая почти наверняка потребует создание внутреннего цикла внутри подсчета и работы с памятью. Тройку (и если хочешь простыню - пятерку) можно учесть масками без доп. работы, если развернуть цикл. Но не более. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 10:03 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39170901&tid=1340780]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
153ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
82ms |
get tp. blocked users: |
2ms |
| others: | 211ms |
| total: | 490ms |

| 0 / 0 |
