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