2

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の並べ替えを高速化するのを手伝ってくれる人はいますか?

これがless構造体です。

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秒と定義されます。

4

2 に答える 2

2

アイテムをm_list値で保存していて、それらを交換するのは費用がかかるのではないかと思います。より高速なスワップを実装するか、スマートポインターによってコンテナーに格納することを試みることができます。

もちろん、プロファイラーは問題をより正確に特定するのに役立ちます。

于 2012-04-05T17:44:49.200 に答える
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 などを使用していると仮定して、sort メンバー関数を使用します。

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 を使用している場合、要素が移動可能であることを確認することで、これらすべてのコピーを最適化できる可能性があります。

于 2012-04-05T17:55:14.507 に答える