Как ускорить мой объектно-ориентированный класс Iterator? - PullRequest
0 голосов
/ 18 ноября 2010

С помощью вопроса Быстрый и гибкий итератор для абстрактного класса Я создал абстрактный GridIterator для абстрактного класса GridData. Теперь я могу использовать любой конкретный подкласс GridIterator для перебора любого конкретного подкласса GridData.

Однако во время тестирования я обнаружил, что виртуальные операторы ++ и операторы виртуальных операторов * становятся настоящими узкими местами моих алгоритмов. Мне интересно, могу ли я что-нибудь сделать, чтобы ускорить это. Из-за абстракции, вставка, вероятно, не будет работать для меня?

Я бы также хотел предоставить константный итератор. Я не уверен, как заставить это работать с текущим дизайном класса. Что касается моего первоначального вопроса ( Быстрый и гибкий итератор для абстрактного класса ), могу ли я просто создать ConstGridIterator в качестве подкласса от прямого итератора STL с const T вместо T? Или мне нужно реализовать const-версию каждого отдельного класса итератора (GridIterator и baseImpl)?

1 Ответ

3 голосов
/ 18 ноября 2010

Делайте как STL и не используйте виртуальные методы в итераторе или контейнерах. Большинство компиляторов, когда их просят оптимизировать, могут оптимизировать большинство итераторов STL до такой степени, что они полностью обойдены и даже не существуют в объектном файле. Например, *(vector<T>.begin()+5) можно оптимизировать до vector<T>.<em>_</em>_underlying_array[5], даже если vector<T>::iterator - это сложный класс с конструкторами, деструкторами и переопределениями сложных операторов.

Наличие виртуального вызова метода в любом месте стека вызовов operator++, begin(), end() или operator !=() не позволяет компилятору корректно оптимизировать это, поскольку метод может быть переопределен любым способом. виртуальные методы не только имеют небольшие накладные расходы времени выполнения, они делают код неоптимизируемым, делая его более модульным.

Если вы хотите повысить производительность, рассмотрите возможность использования шаблонов вместо наследования или настройте компилятор, сказав, что никто не наследует этот класс. Это может конфликтовать с вашим текущим дизайном, но вам нужно выбрать два приоритета среди этих трех: производительность, модульность и стоимость.

...