改进我的代码

时间:2016-10-07 10:16:08

标签: c++ windows performance vector timestamp

我对C ++很陌生,只想测试C ++在下班后的速度:

只需创建一个具有100 Objectc of Object-Point(x,y-Coordinate)的矢量并将其移动到另一个矢量。重复这个k次。 (在此代码中它是1000000次 - int迭代器)。

好吧,因为我对C ++很新,你有没有看到更好的方法,或者我错过了什么?

我在Windows上运行。

Post

2 个答案:

答案 0 :(得分:3)

考虑在堆栈上分配矢量实例,而不是在堆上,例如:

std::vector<Point>* tour = new std::vector<Point>();
std::vector<Point>* actions = new std::vector<Point>();

变成:

// std::vector default constructor creates empty vectors.
std::vector<Point> tour;
std::vector<Point> actions;

同样, not 不必要地在堆上低效地分配Point

Point *p = new Point((i * 10) + j,i + 1, j + 1);
actions->push_back(*p);

只需做一些更简单,更有效的事情,例如:

actions.push_back(Point{x, y, z});

此外,您可以使用重载operator=

从一个向量复制到另一个向量
destVector = sourceVector;

根据您的其他评论,如果您想内容从一个向量移动到另一个向量,您可以使用std::move(),例如:

// Data moved from sourceVector to destVector.
// Leaves sourceVector empty.
destVector = std::move(sourceVector);

此外,如果您有编译时常量,则可以使用constexpr

constexpr int Constant = 10;
constexpr int Iterator = 1000000;

答案 1 :(得分:1)

我认为代码中最大的减速是你从向量的前面擦除的事实。执行此操作时,它会将每个其他元素向上移动一个位置。如果你多次这样做,你会发现你浪费了很多处理能力。

所以只需复制矢量。

while(!actions->empty()) {
    tour->push_back(actions->at(0));
    actions->erase(actions->begin());
}

变为

tour = actions;