std :: sort很慢,只有少量数据

时间:2012-04-05 17:41:48

标签: c++ qt sorting

我发现std :: sort非常慢,只能排序1000个项目。

在类模板template <typename T> class TableModel : public QAbstractTableModel中,我有以下函数对表进行排序。

template<typename T>
void TableModel<T>::sort(int column, Qt::SortOrder order = Qt::AscendingOrder) {
    if(order == Qt::AscendingOrder) {
        qSort(m_list.begin(), m_list.end(), less<T>(column));
    } else {
        qSort(m_list.begin(), m_list.end(), greater<T>(column));
    }
    reset();
 }

我注意到如果我只是随机洗牌我的桌子是随机播放然后立即显示。所以这让我觉得它的那种缓慢。任何人都可以帮助我加快QTable的分类吗?

这是较少的结构。

template<typename T>
struct less {
    int index;
    less(int index) : index(index) {}
    bool operator()(const T& first, const T& second) {
        return T::less(first, second, index);
    }
};

T :: less是一个函数,它所做的全部都比基于给定索引的比较少。

当我需要在以后处理大约100,000件物品时,只有1000件物品被定义为5秒。

2 个答案:

答案 0 :(得分:2)

我怀疑m_list按值存储项目并且交换它们很昂贵。您可以尝试实现更快的交换,或者通过智能指针将它们存储在容器中。

当然,分析器可以帮助您更准确地查明问题。

答案 1 :(得分:1)

由于m_list是QList,因此它不具有与普通列表相同的接口或性能特征。例如,显然QList在内部存储T *数组。如果排序算法知道此实现细节,则可以对该表示进行排序而无需任何复制。相比之下,std :: sort可能会深深地复制周围的值,或者可能会移动它们,这比排序QList数组中的指针要多得多。

最好将Qt容器与Qt算法一起使用,因为Qt算法更可能专门用于Qt容器。或者你可以避免使用Qt容器,只需坚持使用标准库。

无论如何,尝试使用Qt的qSort算法:

template<typename T>
void TableModel<T>::sort(int column, Qt::SortOrder order = Qt::AscendingOrder) {
    if(order == Qt::AscendingOrder) {
        qSort(m_list.begin(), m_list.end(), less<T>(column));
    } else {
        qSort(m_list.begin(), m_list.end(), greater<T>(column));
    }
    reset();
}

原始答案

std :: sort无法利用列表中的节点可以移动而不复制元素的事实。假设您正在使用std :: list或类似的东西,请使用排序成员函数。

template<typename T>
void TableModel<T>::sort(int column, Qt::SortOrder order = Qt::AscendingOrder) {
    std::random_shuffle(m_list.begin(), m_list.end());
    if(order == Qt::AscendingOrder) {
       m_list.sort(less<T>(column));
    } else {
       m_list.sort(greater<T>(column));
    }
    reset();
}

如果您不能这样做,那么您可以通过确保在使用C ++ 11时启用移动元素来优化所有这些副本。