avva: (Default)
[personal profile] avva

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

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

Date: 2007-05-16 10:10 am (UTC)
From: [identity profile] fima.livejournal.com
Верится с трудом

Date: 2007-05-16 05:19 pm (UTC)

Date: 2007-05-16 05:56 pm (UTC)
From: [identity profile] avva.livejournal.com
А вот же.

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

Date: 2007-05-16 07:15 pm (UTC)
From: [identity profile] fima.livejournal.com
непредсказанные переходы куда?

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 циклов задержки на каждый непредсказанный переход к кэше могут достатчно сильно сказаться на производительности.

Date: 2007-05-17 12:29 pm (UTC)
From: [identity profile] e2pii1.livejournal.com
Неудивительно и совершенно естественно.
Вызов функции - это сохранение/восстановление регистров, параметры в стек, и возможно ломаются оптимизации.

невиртуальные методы компилятор сам превращает в inline

January 2026

S M T W T F S
    1 2 3
4 5678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 6th, 2026 02:01 am
Powered by Dreamwidth Studios