avva: (Default)
[personal profile] avva

Все-таки забавно, насколько использование виртуальных методов убивает скорость. Prefetch queue - наше все.

Скажем, алгоритм обрабатывает большие массивы памяти в цикле, который делает относительно мало работы, а вызывается очень много раз. Итератор цикла - виртуальный метод вспомогательного класса, который вызывает еще пару виртуальных методов, и все они делают очень мало работы. Ничего остального не меняя, делаем эти методы невиртуальными, и алгоритм бежит в пять раз быстрее.

Date: 2007-05-16 09:40 pm (UTC)
From: [identity profile] fima.livejournal.com
До меня дошло: имеется ввиду затыкание конвейера из-за невозможности понять где находится следующая команда при вызове виртульной функции? Интересно, какой длины должен быть конвейер, чтобы его сбрасывание приводило к замедлению в 100 раз (чтобы программа целиком замедлилась в 5)?

Date: 2007-05-16 10:11 pm (UTC)
From: [identity profile] s1m.livejournal.com
проблема не столько в длине конвейера, сколько в том, что если невозможно предсказать переход или чтение из памяти, то процессор вынужден курить и ждать данные на момент исполнения операции.

в лучшем случае код или данные окажутся в кэше процессора и тогда задержка сводится к перенаполнению контейнера. в случае промаха по кэшу процессор идет в память, т.е. курит 200-300 тиков. на некоторых алгоритмах разницы не будет, на некоторых разница может быть больше чем в 5 раз.

Date: 2007-05-17 05:56 am (UTC)
From: [identity profile] fima.livejournal.com
Хм, а если бы это был предсказанный переход, то все равно пришлось бы ждать 200-300 тиков пока новый код найдется в памяти, ну может, на пару тиков меньше из-за конвейера. Так что разница в 5 раз все еще сомнительна.

При этом, если программа "делает относительно мало работы, а вызывается очень много раз", то после первого раза весь нужный код и виртуальные таблицы должны оказаться в кэше и там торчать из-за частого использования, т.е. сильно большего доступа в память для извлечения всего этого быть не должно.

Date: 2007-05-17 06:33 pm (UTC)
From: [identity profile] s1m.livejournal.com
prefetcher это обнаружит и закажет чтение до того, как команда реально начнет исполнятся.

зависит от объема данных и размера кэша, но даже 20-30 циклов задержки на каждый непредсказанный переход к кэше могут достатчно сильно сказаться на производительности.

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 04:30 pm
Powered by Dreamwidth Studios