2013-08-11 3 views
1

Я выполнил простой рандомизированный тест производительности Cocoa NSSet против STL unordered_set. Оба реализованы с использованием хеш-таблиц. Будучи тем, что C++ известен своим высокопроизводительным кодом, я был удивлен, увидев, что NSSet был ~ 1,5 раза быстрее, чем unordered_set. Может ли кто-нибудь пролить свет на то, почему это?NSSet vs. unordered_set

P.S. Тест выполнял поиск случайных строк (используя NSString для NSSet и basic_string<unichar> для unordered_set).

EDIT: Введите код: https://github.com/fumoboy007/StringCollectionSpeedTest.

+0

«C++ известен своим высокоэффективным кодом» ... Ну, может быть, у нас нет того же способа количественной оценки производительности ... – Macmade

+0

Итак, как вы оцениваете производительность? Не оставляй меня висящим! – fumoboy007

+0

Обратите внимание, что NSSet является «беспошлинным мостом» для CFSet, и это открытый источник: http://opensource.apple.com/source/CF/CF-744.18/CFSet.c, поэтому вы можете сравнить реализации, если вы как. –

ответ

1

Включите оптимизацию и наслаждайтесь тем, как «быстрые» контейнеры C++: нулевые секунды nano для цикла, которые были оптимизированы компилятором! Разве вы здесь не бормотали: «Не со мной!» Компиляторы более умны, чем вы думаете. ;)

Так, первый фокус в компилятор: Restructure вашего тест, так что результата будет генерироваться циклом, и что результат должен зависеть от действий в каждой итерации (например, суммировать подсчет). Этот результат также должен быть использован, например, распечатать его на консоли. В противном случае компилятор снова обнаружит, что вам не нужен этот результат и, следовательно, вообще не нужно выполнять цикл.

Edit:

Результаты испытаний (на моей системе):

Оказалось, что NSSet и станд :: unordered_set примерно равны по времени для поиска.

+0

Достаточно ли переместить 'startTime = clock();' и 'endTime = clock();' в цикл (но не использовать результат 'cppSet.count (string)')? Кажется, это дает мне правильные результаты. – fumoboy007

+0

@ fumoboy007 Да, это ... просто попробовал это с этими утверждениями вне цикла, и я получил «1.84467e + 13 секунд». (Мне нравится разговаривать сам с собой.) – fumoboy007

+0

@ fumoboy007 На самом деле, nvm hmmm ... Мне нужно исследовать дальше. – fumoboy007

Смежные вопросы