edit: Я специально сравниваю операции std::vector
линейного поиска с бинарными поисковыми операциями std::map
, потому что это, по-видимому, относится к утверждению Herb. Я знаю, что использование двоичного поиска приведет к переходу производительности с O (N) на O (log N), но это не будет проверять утверждение Herb
Bjarne Stroustrup и Herb Sutter недавно говорили о том, насколько удивительным std::vector
является ситуация, в которой можно было бы ожидать использования std::list
из-за стоимости промахов в кэше во время связанного обхода списка. (см. http://channel9.msdn.com/Events/Build/2014/2-661 с отметкой 48 минут)
Herb сделал еще одно утверждение, однако, что операции над упорядоченным вектором были даже быстрее, чем std::map
(см. http://i.imgur.com/zX07TZR.png, взятый из 51:30), что было трудно понять. Поэтому я создал небольшой тест, чтобы продемонстрировать это, и с трудом воспроизводил эти результаты: https://ideone.com/MN7DYK
Это тестовый код:
template <typename C>
void test(std::string name, std::vector<int> shuffledInputValues, C & c)
{
// fill container 'c' with values from 'shuffledInputValues' then erase them all
{
std::cout << "testing " << name << "..." << std::endl;
timer t;
for (auto val : shuffledInputValues) insert(c, val);
for (auto val : shuffledInputValues) remove(c, val);
}
}
// output:
// testing vector...99.189ms
// testing deque...120.848ms
// testing set...4.077ms
Обратите внимание, как std::vector
выполняет порядок медленнее, чем std::set
. Конечно, это результат, которого я ожидал, но я смущен тем утверждением, которое пыталась сделать Herb.
Что я делаю неправильно? Или я не понимаю претензии Herb?
Примечания к моему тестовому приложению:
- он должен использовать линейные операции - вся цель упражнения - продемонстрировать магию кэша кэша, это ограничения, которые Herb и Bjarne накладывают на упражнение.
- Я не пробовал какой-либо сложный цикл для моей векторной итерации, но я считаю, что итерация никак не влияет на производительность.
- Я ограничил цикл до 10 тыс. элементов, потому что идеонизирует время на больших наборах, но увеличение размера не изменяет результаты.
edit: см. https://ideone.com/916fVd для модифицированного примера, который сравнивает только производительность поисковых запросов. Линейный поиск показывает ту же производительность.