Я сделал составной контейнер Range
, который принимает либо минимальный/максимальный диапазон как std::pair
, либо набор целых чисел как std::set
.
внутренне копия ввода сохраняется как void *
Этот контейнер поддерживает iterators
, и мне было любопытно, насколько быстро этот контейнер по сравнению с итерацией только по набору std::set
.
Я убедился, что пишу каждый цикл итерации в своем тесте со следующими политиками:
- без постинкремента (медленнее)
- убедитесь, что компилятор не может полностью оптимизировать циклы
- сравнивать одни и те же вещи
У меня есть следующие тайминги: тест производительности
Тест скорости
ВРЕМЯ ВЫПОЛНЕНИЯ диапазона: [Pair] : 13,0522 мс
ВРЕМЯ ВЫПОЛНЕНИЯ диапазона: [Set]: 272,54 мс
ВРЕМЯ ВЫПОЛНЕНИЯ std::set: 438,239 мс
ВРЕМЯ ВЫПОЛНЕНИЯ диапазона: Обычный цикл For: 0,000175 мс
Во-первых я был удивлен, и я надеюсь, что вы тоже, потому что почему мой контейнер Range
должен быть быстрее, поскольку итераторы Range
содержат бот итератор для std::pair
(просто целое число) и для std::set
. И моя реализация Range::iterator
фактически перенаправляет все операторы в std::set, если Range
является std::set
.
Во-вторых У вас есть какие-либо комментарии по реализации этого, чтобы быть эффективным. Может быть, есть лучший подход?
Range<Type> range(s);
. Если я скопирую набор после вставки, например. вставьте в некоторыеset<Type> s2;
, затем после вставкиauto s = s2;
, тогда цикл std::set будет быстрее. Это может быть связано с локальностью, поскольку копия набора будет копировать элементы, как правило, в порядке обхода, в то время как вставка создает соседей, которые были выделены в очень разное время. - person dyp   schedule 05.06.2014