【发布时间】:2015-01-08 03:36:35
【问题描述】:
因此,出于性能原因以及未来使用 CUDA 并行化某些内容的意图,我正在将我编写的 Java 代码转换为 C++ 代码。然而,我想做的第一件事是直接转换,让它在 C++ 中运行,代码与在 java 中的代码相同。
我遇到的问题是,下面的循环在 C++ 中实际上需要几分钟才能完成,而在 Java 中几乎不需要任何时间。唯一的区别是我在 C++ 中使用向量,而在 Java 中使用 ArrayList。
当我最初创建单元向量时,我还为邻居向量保留了适当的大小。这段代码的目的是在 3d 立方体中创建一个统一的单元格网格,并将每个单元格的邻居存储在单元格本身内部,以便以后方便。
我使用 Visual Studio 2013 以防万一(对于 C++)和 Eclipse for java。
我觉得我在这里肯定遗漏了一些简单的东西,因为这样的减速似乎很疯狂,但是当我注释掉 push_back 时,代码基本上会立即执行。
w、h 和 d 都是 20。 cells 是 Cell 结构的向量(见下文)。
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
for (int k = 0; k < d; k++) {
for (int x = -1; x < 2; x++) {
for (int y = -1; y < 2; y++) {
for (int z = -1; z < 2; z++) {
if (i + x >= 0 && i + x < w && j + y >= 0 && j + y < h && k + z >= 0 && k + z < d) {
cells[i][j][k].addNeighbor(cells[i + x][j + y][k + z]);
}
}
}
}
}
}
}
在不同的文件中定义:
struct Cell {
std::vector<Particle> particles;
std::vector<Cell> neighbors;
int b = 0;
void addParticle(Particle &p) {
particles.push_back(p);
}
void addNeighbor(Cell &c) {
neighbors.push_back(c);
}
};
【问题讨论】:
-
Cells 插入到向量中是复制,这与仅存储对单元格的引用的 Java 不同。通过反复执行此操作,您最终会得到向量的向量的向量...看看为什么现在这么慢? -
确保您正在运行优化/发布版本。不要使用调试版本来判断 STL 容器的速度,尤其是使用 Visual Studio。
-
正如@PaulMcKenzie 提到的,还可以提供更多详细信息,例如构建设置,即发布/调试构建、通过调试器或命令提示符运行等。
标签: c++ performance vector