C ++ Vector 优化
c++ Vector optimizations
我有矢量,像这样:
struct cords {
double x, y;
};
struct road {
cords start, end;
};
vector<road> roads;
而且我在我的 class 中发现了一个运行速度非常慢的函数。该函数的主要特性是从向量中获取所有对并用它们做一些数学运算。我不会更改内部 vector 项目的值,只是经常阅读它们。
我注意到的第一个问题是循环本身不够快,这就是我使用的原因:
unsigned maxI = roads.size();
unsigned maxJ = roads.size();
for (unsigned i = 0; i < maxI; i++) {
for (unsigned j = i + 1; j < maxJ; j++) {
...
}
}
它给这个函数带来了合理的时间改进,但还不够。
正如我之前所说,里面的东西只是数学和一些条件,调用这样的向量:roads[j].end.y
。
下一步,我注意到,如果我在做
for (unsigned i = 0; i < maxI; i++) {
cords point1 = roads[i].start;
cords point2 = roads[i].end;
for (unsigned j = i + 1; j < maxJ; j++) {
并且使用 point1, point2
而不是 roads[j].end.y
它的工作速度几乎快了一倍。
我只是不明白为什么会这样,我怎样才能进一步改进它。
UPD:不确定,但这可能是一个编译器相关的问题,所以我使用的是内置 vs2015。
如果不需要在内部循环中临时修改point1
和point2
,则避免复制它们只是对它们进行const引用以提高速度。
const cords &point1 = roads[i].start;
const cords &point2 = roads[i].end;
我有矢量,像这样:
struct cords {
double x, y;
};
struct road {
cords start, end;
};
vector<road> roads;
而且我在我的 class 中发现了一个运行速度非常慢的函数。该函数的主要特性是从向量中获取所有对并用它们做一些数学运算。我不会更改内部 vector 项目的值,只是经常阅读它们。 我注意到的第一个问题是循环本身不够快,这就是我使用的原因:
unsigned maxI = roads.size();
unsigned maxJ = roads.size();
for (unsigned i = 0; i < maxI; i++) {
for (unsigned j = i + 1; j < maxJ; j++) {
...
}
}
它给这个函数带来了合理的时间改进,但还不够。
正如我之前所说,里面的东西只是数学和一些条件,调用这样的向量:roads[j].end.y
。
下一步,我注意到,如果我在做
for (unsigned i = 0; i < maxI; i++) {
cords point1 = roads[i].start;
cords point2 = roads[i].end;
for (unsigned j = i + 1; j < maxJ; j++) {
并且使用 point1, point2
而不是 roads[j].end.y
它的工作速度几乎快了一倍。
我只是不明白为什么会这样,我怎样才能进一步改进它。
UPD:不确定,但这可能是一个编译器相关的问题,所以我使用的是内置 vs2015。
如果不需要在内部循环中临时修改point1
和point2
,则避免复制它们只是对它们进行const引用以提高速度。
const cords &point1 = roads[i].start;
const cords &point2 = roads[i].end;