|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
Дано некоторая коллекция (допустим на миллион элементов). У каждого элемента коллекции приличное количество полей. При обработке данной коллекции в цикле, как выгоднее обращаться к полям каждой отдельной строки? Напрямую для каждого поля обращаясь к элементу коллекции (столько раз, сколько полей): Код: plsql 1. 2. 3. 4.
Или сделать копию строки, а потом обращаться уже к полям этой переменной? Код: plsql 1. 2. 3. 4. 5.
-------------------------------------------------------------- Запомните, товарищи офицеры, чтобы ничего не делать, надо уметь делать все. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 12:58 |
|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
anvano Дано некоторая коллекция (допустим на миллион элементов). У каждого элемента коллекции приличное количество полей. это плохая история. И, чем "свежее" версия системы, тем, по вероятности, хуже... anvanoИли сделать копию строки, а потом обращаться уже к полям этой переменной? Код: plsql 1. 2. 3. 4. 5.
здесь вы точно попадаете на "сделать копию". Вы не забыли, что у вас "У каждого элемента коллекции приличное количество полей."? В цикле вы гарантированно произведете копирование объемом, грубо, примерно в полный объем памяти, занимаемой коллекцией. anvanoНапрямую для каждого поля обращаясь к элементу коллекции (столько раз, сколько полей): Код: plsql 1. 2. 3. 4.
Здесь на копирование вы не попадаете, но попадаете на многократный косвенный доступ. Для широких коллекций это, по вероятности, всё-таки предпочтительней. Есть такого рода "третий вариант": Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Он точно удобнее множественный индексных обращений, для in-параметра обычно по скорости он не хуже прямого индексированного обращения. Для in out nocopy - без гарантий, но, как правило, работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 13:41 |
|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
booby Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 14:17 |
|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
anvano Или сделать копию строки, а потом обращаться уже к полям этой переменной? А что тебе мешает поставить эксперимент с замером времени? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 14:20 |
|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
booby здесь вы точно попадаете на "сделать копию". Вы не забыли, что у вас "У каждого элемента коллекции приличное количество полей."? В цикле вы гарантированно произведете копирование объемом, грубо, примерно в полный объем памяти, занимаемой коллекцией. Ну переменная r_row одна же. Прям при каждой итерации цикла будет заново память выделяться под r_row? А предыдущая память куда деваться будет? Я вот собственно поэтому и спрашиваю, что будет профитнее. Один раз скопировать элемент и потом обращаться к полям копии. Или лазить в коллекцию по индексу столько раз, сколько полей в коллекции. Мне почему-то не кажется, что при "копировании" после цикла мы получим две копии коллекции в памяти. Не может же настолько тупо работать с памятью оракл. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 14:23 |
|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
Elic anvano Или сделать копию строки, а потом обращаться уже к полям этой переменной? А что тебе мешает поставить эксперимент с замером времени? Попробую еще раз поэкспериментировать. Но у меня почему-то странные результаты получались, видимо из-за каких-то оптимизаций - время сильно зависело от того какой пример прогоняется "первым". С копированием или без. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 14:24 |
|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
anvano Прям при каждой итерации цикла будет заново память выделяться под r_row? Почему ему невдомёк, что то же объём прокачается и поэлементно, не берусь судить. anvano Но у меня почему-то странные результаты получались, видимо из-за каких-то оптимизаций - время сильно зависело от того какой пример прогоняется "первым". С копированием или без. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 14:36 |
|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
Ниже скрипт, который получится у меня для теста на пару миллионов записей Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
При перестановке тестов местами - время такое же, т.е. я был не прав, что зависит от этого. Получается, что без копирования быстрее, но не прям чтобы "ужас-ужас". Потребление памяти после цикла "с копированием" ожидаемо не выросло. В общем выберу наверное вариант с копированием в пользу "лаконичности и читаемости кода". Учитывая, что бывают иногда и вложенные коллекции, где "префикс" разрастается до неприличных размеров. Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 14:46 |
|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
Кстати вариант с вызовом процедуры: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Код: plaintext 1.
т.е. существенно медленнее - видать накладные расходы на обработку вызова подпрограммы ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 14:55 |
|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
anvano Получается, что без копирования быстрее, Эксперименты надо повторять много раз: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 15:06 |
|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
2anvano, с nocopy я намазал, зачеркнуть. И вообще на другой вопрос отвечал: на запись Код: plsql 1. 2. 3.
поэлементное формирование стабильно быстрее, чем Код: plsql 1. 2. 3. 4.
автоматически предположил это и для работы на чтение. причин несимметричности не знаю, визуально, "лишняя запись" должна проявлять себя в обоих случаях. В примере у тебя, кстати, не шибко широкий рекорд. Широкий - это на сотню полей, хотя бы несколько десятков. 2Elic ты прав, индюк напыщенный. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 16:44 |
|
Обращение к полям элемента коллекции большого размера, напрямую или через копию элемента?
|
|||
---|---|---|---|
#18+
Elic anvano Получается, что без копирования быстрее, Эксперименты надо повторять много раз Даже интересно с чего такой разброс. Я очевидно не раз и не два эксперименты повторял, а оставил в цикле минут на 10 Причем на трёх разных физических машинах (серверах) У меня результаты стабильно одинаковые. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2021, 17:43 |
|
|
start [/forum/topic.php?fid=52&msg=40049189&tid=1880406]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
145ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 269ms |
total: | 501ms |
0 / 0 |