Вы должны использовать set
каким-либо образом, чтобы уменьшить риск оптимизации цикла, например, добавив return c.size();
.
Также ваш выбор номераиз итераций может быть слишком низким.Добавьте цифру к счетчику циклов, и вы увидите заметное время выполнения.
Современный процессор может легко обрабатывать> 2 * 10 9 операций / с.Предполагая, что ваш компилятор использует memcmp
, который, вероятно, векторизован вручную, с небольшим рабочим набором, таким как ваш, вы работаете полностью из кэша и можете достичь пропускной способности до 512 байт на сравнение (с AVX2).Предполагая умеренную скорость 10 циклов на итерацию, мы все равно можем сравнить> 10 10 байт / с.Таким образом, ваша программа должна работать в течение <1 с на умеренном оборудовании. </p>
Попробуйте вместо этого этот обновленный код:
#include <string>
#include <set>
using namespace std;
int main(){
set<string> c;
string s(100000,'a');
for(int i=0;i<1000000;i++) { // Add a digit here
c.insert(s);
}
return c.size(); // use something from the set
}
При включенной оптимизации (-O3
) для запуска потребуется ~ 5 секундмоя система.
Другими словами, да, вставка в двоичное дерево имеет сложность O (log n), но сравнение строки имеет сложность O (n).Эти n не совпадают, в случае map
он представляет размер карты, а в случае string
- длину строки.
В вашем конкретном случае карта имеет толькоодин элемент, поэтому вставка O (1).Вы получаете линейную сложность O (n) исключительно из сравнения строк, где n равно string_length * number_of_iterations .