программистское
May. 16th, 2007 01:46 amВсе-таки забавно, насколько использование виртуальных методов убивает скорость. Prefetch queue - наше все.
Скажем, алгоритм обрабатывает большие массивы памяти в цикле, который делает относительно мало работы, а вызывается очень много раз. Итератор цикла - виртуальный метод вспомогательного класса, который вызывает еще пару виртуальных методов, и все они делают очень мало работы. Ничего остального не меняя, делаем эти методы невиртуальными, и алгоритм бежит в пять раз быстрее.
no subject
Date: 2007-05-16 09:40 pm (UTC)no subject
Date: 2007-05-16 10:11 pm (UTC)в лучшем случае код или данные окажутся в кэше процессора и тогда задержка сводится к перенаполнению контейнера. в случае промаха по кэшу процессор идет в память, т.е. курит 200-300 тиков. на некоторых алгоритмах разницы не будет, на некоторых разница может быть больше чем в 5 раз.
no subject
Date: 2007-05-17 05:56 am (UTC)При этом, если программа "делает относительно мало работы, а вызывается очень много раз", то после первого раза весь нужный код и виртуальные таблицы должны оказаться в кэше и там торчать из-за частого использования, т.е. сильно большего доступа в память для извлечения всего этого быть не должно.
no subject
Date: 2007-05-17 06:33 pm (UTC)зависит от объема данных и размера кэша, но даже 20-30 циклов задержки на каждый непредсказанный переход к кэше могут достатчно сильно сказаться на производительности.