【问题标题】:Improvement of my code [closed]改进我的代码[关闭]
【发布时间】:2016-10-07 10:16:08
【问题描述】:

我对 C++ 很陌生,只想测试 C++ 能多快完成以下工作:

只需用 100 个 Object-Point (x,y-Coordinate) 的 Objectc 创建一个向量,然后将其移动到另一个向量。重复此 k 次。 (在此代码中,它是 1000000 次 - int Iterator)。

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

我在 Windows 上运行。

#include "Main.h"
#include "Point.h"
#include <iostream>
#include <vector>
#include <chrono>


int main() {
    auto start = std::chrono::high_resolution_clock::now();
    int Constant = 10;
    int Iterator = 1000000;

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

    for (int k=0; k<Iterator; k++) {

        for (int i=0; i<Constant; i++) {
            for (int j=0; j<Constant; j++) {
                Point *p = new Point((i * 10) + j,i + 1, j + 1);
                actions->push_back(*p);
            }
        }

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

        actions->clear();
        tour->clear();
    }

    auto finish = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count() << std::endl;
}

【问题讨论】:

  • 程序运行了吗?它做你想让它做的事吗?那么你只需要一个code review
  • 如果你想改进工作代码,你最好把这个问题发到SE Code Review
  • 作业的附加信息:创建一个包含 100 个对象的向量,其中 x,y-坐标 + id 并通过按递增索引顺序添加对象并将其移动到另一个向量并删除原点向量中的对象
  • 你的问题是什么?
  • 我怀疑 this technique 将表明 new Point 和两个 push_back 语句基本上负责所有时间。

标签: c++ windows performance vector timestamp


【解决方案1】:

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

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;

同样,不要在堆上不必要地低效地分配Points!

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;

【讨论】:

  • 感谢您的快速响应。这对我帮助很大。是的,我忘了提到我只是不想要矢量的副本。此外,我只想将对象逐步移动到另一个向量。这与我正在处理的另一个问题有关。
  • @kxell2001:不客气。很高兴能帮上忙。
  • @kxell2001 - 如果您想将所有元素从一个向量移动到另一个向量,您可以使用destVector = std::move(sourceVector);。这不涉及复制。
  • @kxell2001:您编辑了最初的评论。如果你想移动(而不是深拷贝),那么@BoPersson 已经提到了std::move()。我相应地编辑了我的答案。
  • 使用这里的建议可以看到什么样的加速?
【解决方案2】:

我认为你的代码中最大的减速是你从一个向量的前面擦除。当你这样做时,它会将所有其他元素向上移动一个位置。如果您多次这样做,您会发现您正在浪费大量的处理能力。

因此,只需复制向量即可。

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

变成

tour = actions;

【讨论】:

  • 如果您真的想将元素从一个向量单独移动到另一个向量,请在没有擦除的情况下循环执行。如果您坚持擦除,请先反转动作向量。因此,您将从向量的背面进行擦除,这是一种更有效的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2017-01-25
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
相关资源
最近更新 更多