У меня есть индекс, содержащий около 10 тыс. Элементов, которые необходимо отсортировать по регистру, лексикографически.Улучшить std :: sort performance
Это мой подход:
bool lowercomp (AbstractServiceProvider::AbstractItem* i, AbstractServiceProvider::AbstractItem* j)
{
std::string a,b;
// lower first string
a.resize(i->title().length());
std::transform(i->title().cbegin(), i->title().cend(), a.begin(),
std::bind2nd(std::ptr_fun(&std::tolower<char>), std::locale("")));
// lower 2nd string
b.resize(j->title().length());
std::transform(j->title().cbegin(), j->title().cend(), b.begin(),
std::bind2nd(std::ptr_fun(&std::tolower<char>), std::locale("")));
return 0 > a.compare(b);
}
Somwhere в моем коде:
t = new boost::timer::auto_cpu_timer;
std::sort(_index.begin(), _index.end(), lowercomp);
delete t;
Но это занимает около 4 секунд. Без части toLower она занимает около 0,003 секунды. Есть ли способ улучшить это?
Эта часть, я сомневаюсь. 'std :: sort' оптимизирован как есть. Любая дальнейшая оптимизация потребует скорее настраиваемого усовершенствованного обмана. – 101010
Возможно, посмотрите на [сравнение нечувствительных к регистру строк в C++] (http://stackoverflow.com/questions/11635/case-insensitive-string-comparison-in-c)? – crashmstr
Я не исключаю, что вы можете сравнить с таблицей сортировки, чтобы ускорить работу. Однако в вашей функции нижнего пакета есть некоторые излишние накладные расходы. –