|
|
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUНо порой не получается обойтись без Move. Это и операции со строками, и динамическими массивами, и в моём случае запись/чтение данных в "стрим" Чтобы Move имело смысл как-то существенно ускорять, копировать нужно именно большие объёмы, на малых объёмах разницы, видимой глазу, не будет, разве что эффект плацебо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 11:36:25 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
defecatorЧтобы Move имело смысл как-то существенно ускорять, копировать нужно именно большие объёмы, на малых объёмах разницы, видимой глазу, не будет, разве что эффект плацебо. Чтобы Move имело смысл ускорять - нужно чтобы Move использовался часто. Это мой случай И наверняка не только мой :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 11:49:58 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Src: https://yadi.sk/d/7ayPhNkoc6fEF Код: pascal 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. binXE4: https://yadi.sk/d/E3FCMpKLc6exQ binXE7: https://yadi.sk/d/wqThCXNsc6esT CPU E5-2670 Код: 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. Код: 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. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 22:55:30 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Честно говоря я не совсем понял, как работает тест и какой именно "стандартный Move" фигурирует (похоже самый быстрый x86)... Но судя по результатам я бог оптимизаций :). Хотя по большому счёту увеличение производительности в полтора-два раза вполне ожидаемо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2014, 00:51:55 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
asviridenkovСлабо улучшить? Сначала подправим логику 1) неправильный результат выдают "x32" версии PStrScan для параметров (NotNil, '1', 0) 2) неплохо бы защититься от отрицательного size: Код: plaintext 1. 2. Теперь о производительности. Думаю, что результаты сильно зависят от железа, но у меня следующий пример быстрее. Чем короче строка, тем больше разница (до 6 раз). На длинных строках - паритет. Код: pascal 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2014, 07:07:45 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Корбенно у меня следующий пример быстрее. Чем короче строка, тем больше разница (до 6 раз). На длинных строках - паритет. Код: pascal 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. Это же код из библиотеки QStrings, так нечестно )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2014, 09:41:37 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Ну очень быстрый Move - самый простой Вот этот, без использования SSE будет быстрее стандартного Move и NonCollisionMove Код: pascal 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. Сам тестер Код: pascal 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. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433. 434. 435. 436. 437. 438. 439. 440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. 485. 486. 487. 488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. Результат Debug 32Bit -- 9 -- MyMove:: 3.631395 Move:: 9.564001 NonCollisionMove:: 9.057227 -- 0 -- MyMove:: 3.415018 Move:: 5.097708 NonCollisionMove:: 4.003383 -- 3 -- MyMove:: 6.619108 Move:: 9.994631 NonCollisionMove:: 7.615205 Собственно написать этот Move послужило - то, что стандартный Move меняет адрес исходного адреса (Жутко бесила) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 16:45:50 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Няшик, @@Move16 Копируешь 8 байт вместо 16 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 16:54:06 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Инструкции REP MOVSx начиная с архитектуры Nehalem, и далее в Ivy Bridge заоптимизированы микрокодом по немогу и по скорости не уступают SSE. Пруф на странице 160. http://www.cs.utexas.edu/~hunt/class/2017-spring/cs350c/documents/Intel-x86-Docs/64-ia-32-architectures-optimization-manual.pdf ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2017, 17:10:08 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUНяшик, @@Move16 Копируешь 8 байт вместо 16 И в @@Move8 - 4, вместо 8. Оптимизация-с :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2017, 10:58:12 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
КвейдИнструкции REP MOVSx начиная с архитектуры Nehalem, и далее в Ivy Bridge заоптимизированы микрокодом по немогу и по скорости не уступают SSE. Пруф на странице 160. http://www.cs.utexas.edu/~hunt/class/2017-spring/cs350c/documents/Intel-x86-Docs/64-ia-32-architectures-optimization-manual.pdf Говорят, сейчас на некоторых архитектурах заруливает REP MOVSB Но мы же тут не для конкретной архитектуры пишем, а в общем, для многих :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2017, 12:07:28 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Оптимизировали только MOVSB (не SD), т.е. Move от старых Дельфей сам по себе не ускоряется. Получается, нужно делать отдельную версию Move специально для Ivy Bridge+, проверять процессор и т.д. - слишком муторно. И на мелких блоках (проверял 256 и 1024 байт с выравниваем 4) SIMD всё равно быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2017, 13:21:16 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SaperskyПолучается, нужно делать отдельную версию Move специально для Ivy Bridge+, проверять процессор и т.д.а так оно и делается. на старте детектится камень и подтыкается оптимальная для него версия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2017, 13:26:04 |
|
||
|
|

start [/forum/topic.php?fid=58&startmsg=38779617&tid=2041659]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
184ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 456ms |

| 0 / 0 |
