【问题标题】:std::vector making struct sort slow? c++std::vector 使结构排序变慢? C++
【发布时间】:2014-08-08 13:18:58
【问题描述】:

我有一个按成员之一排序的结构列表。我正在使用 std::sort 和我自己的比较函数,那部分很好。但是,当我从以下位置更改结构时,我注意到(非常)大的性能差距:

struct square
{
    float x;
    float y;
    float z;

    float scale;
    float angle;

    GLuint texture;
};

struct square
{
    float x;
    float y;
    float z;

    float scale;
    float angle;

    GLuint texture;
    std::vector <float> color;
};

此后我使用了一种完全不同的方法,并且我意识到使用这样的向量是一个坏主意(我知道数组的大小 - rgb),但我想知道为什么会受到性能影响。我正在比较 z 值以进行排序。

这是我的排序函数和结构列表:

std::vector <square> square_list;
//Then add a bunch of squares

bool sort (square a,square b)
{
   return a.z < b.z;
}

//Here is the sort that is slow
std::sort (square_list.begin(),square_list.end(),sort);

我想知道这是否与重新排序结构列表有关,因为在第二种情况下它们的大小明显更大?

感谢您的任何回复。

【问题讨论】:

  • 如果将排序功能改成bool sort (square&amp; a,square&amp; b),性能上的差异是否仍然存在?
  • 如果您为您的结构编写移动构造函数/赋值运算符,它可能会更快。这样分配给color(结构外)的内存不需要重新分配和复制,但指针只是从一个向量移动到另一个向量。应该至少快一点。
  • @j_kubik 我不同意。这意味着将结构移动到排序函数会损坏原始结构。
  • @NeilKirk @mikhail 我并不是说将对象移动到排序函数中,这将毫无意义——我什至根本不知道它是如何工作的,更不用说更快了。由于比较后发生的事情,移动运算符会使其更快 - 结构在数组中移动(通常与另一个结构交换,但我们没有用于此的运算符,并且优化的移动将做同样的事情),所以数组最终排序。我假设 c++11 实现将使用移动语义来移动/交换 std::sort 中的元素。

标签: c++ sorting vector struct


【解决方案1】:
bool sort (square a,square b)

这每次都会复制结构,包括向量。向量的复制速度比普通数组慢。您应该改用它。

bool sort (const square& a, const square& b)

如果您使用的是 C++11,则可以将向量替换为 std::array,因为大小是恒定的。

【讨论】:

  • 另一方面,vector 移动 array 可能会更快,因此两者都值得尝试。
  • @juanchopanza 总的来说,您是正确的。但是,我认为从问题中数组大小只有 3 :)
  • 问题确实如你所指。非常感谢您的意见。另外,juanchopanza,为什么矢量移动得更快?
  • @Miicck Vectors 只能复制它们指向数据的指针,而数组必须复制其所有数据。这是因为这两种数据结构是如何存储数据的。
  • +1 此外,如果square 序列本身没有必须进行排序,并且仅使用一次排序视图是使用要求,则使用临时排序指针床也可能是有益的。无论如何,如果您知道使用.reserve()square 计数上限也是相当可观的。
【解决方案2】:

除了将参数作为 const ref 之外,您还可以使用仿函数进行比较。这通常更快,因为函子更容易内联。

std::vector <square> square_list;
//Then add a bunch of squares

struct sort
{
  bool operator() (const square& a, const square& b) const {
    return a.z < b.z;
  }
}

std::sort (square_list.begin(),square_list.end(),sort);

【讨论】:

【解决方案3】:

sort 每次都复制你的值,然后 std::vector 预分配一堆内存。复制时间量更大

【讨论】:

  • 与预分配无关。
【解决方案4】:

您是否尝试在向量中存储指针而不是整个结构?

std::vector <square*> square_list;
//Then add a bunch of squares

bool sort (square* a,square* b)
{
   return a->z < b->z;
}

//Here is the sort that is slow
std::sort (square_list.begin(),square_list.end(),sort);

【讨论】:

  • 如果只能使用引用,为什么要更改处理代码?
  • 那么应该是 const ptr。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多