Хотя это не тот код и, возможно, он не тот же компилятор, который вы используете, вот несколько справочных данных из довольно старого теста (bench ++ Джо Ороста):
Test Name: F000005 Class Name: Style
CPU Time: 7.70 nanoseconds plus or minus 0.385
Wall/CPU: 1.00 ratio. Iteration Count: 1677721600
Test Description:
Time to test a global using a 10-way if/else if statement
compare this test with F000006
Test Name: F000006 Class Name: Style
CPU Time: 2.00 nanoseconds plus or minus 0.0999
Wall/CPU: 1.00 ratio. Iteration Count: 1677721600
Test Description:
Time to test a global using a 10-way switch statement
compare this test with F000005
Test Name: F000007 Class Name: Style
CPU Time: 3.41 nanoseconds plus or minus 0.171
Wall/CPU: 1.00 ratio. Iteration Count: 1677721600
Test Description:
Time to test a global using a 10-way sparse switch statement
compare this test with F000005 and F000006
Test Name: F000008 Class Name: Style
CPU Time: 2.20 nanoseconds plus or minus 0.110
Wall/CPU: 1.00 ratio. Iteration Count: 1677721600
Test Description:
Time to test a global using a 10-way virtual function class
compare this test with F000006
Этот конкретный результат получен при компиляции с 64-битной версией VC ++ 9.0 (VS 2008), но он в достаточной степени похож на то, что я видел в других недавних компиляторах. Суть в том, что виртуальная функция быстрее, чем большинство очевидных альтернатив, и очень близка к той же скорости, что и единственная, которая ее побеждает (фактически, оба равных находятся в пределах измеряемой границы ошибки). Это, однако, зависит от плотных значений - как вы можете видеть в F00007, если значения редкие, оператор switch создает код, который медленнее, чем вызов виртуальной функции.
Итог: вызов виртуальной функции - это, вероятно, неправильное место для поиска. Рефакторированный код может легко работать медленнее, и даже в лучшем случае его, вероятно, не будет достаточно, чтобы заметить или позаботиться о нем.