高性能程序,啥是更好的向量数组或向量向量

Posted

技术标签:

【中文标题】高性能程序,啥是更好的向量数组或向量向量【英文标题】:High performance program, what is better array of vectors or vector of vectors高性能程序,什么是更好的向量数组或向量向量 【发布时间】:2018-01-13 19:46:05 【问题描述】:

我正在编写必须是高性能程序的代码。

我现在拥有的是我发明的一组“A”类型的向量。 "A" 是一个有 long long 和 double 的结构体。

vector<A>* ord = new vector<A>[X];

X 是一个直到执行时我才知道的值。

我要做的是,对于每个向量,通过 long long 变量对其对象进行排序,然后执行一些操作。

我的问题是,就性能而言,我现在拥有的“向量数组”更好,或者最好创建一个这样的向量向量:

vector<vector<A>> ord;

二思:

请注意,我不必在向量之间进行运算。 我在其他帖子中读到,使用 `new' 运算符是个坏主意,在这种情况下,我应该在我的程序中使用它。

【问题讨论】:

ericlippert.com/2012/12/17/performance-rant 虽然老实说我看不出第一个版本会更快(只要你正确使用std::vector 除非您已经确定由于std::vector&lt;std::vector&lt;A&gt;&gt; 而存在真正的性能瓶颈,否则不要使用替代方案使事情复杂化。即使您确实找到了瓶颈,我也怀疑使用 C 数组是否会有所帮助。最后,如果您需要拥有指针,请首选 std::unique_ptr 而不是原始拥有指针。 您选择排序和执行“其他操作”的算法,以及您是否能够使用 SIMD 或其他优化,以及您的代码是否多线程可能比您使用new 或向量(恕我直言)更有可能产生更大的影响。 【参考方案1】:

动态分配的向量数组和向量向量在优化代码中可能相同。并且向量的向量处理了很多问题,除非您遇到一些非常不寻常的问题,否则您当然应该更喜欢该解决方案。

过早的优化是万恶之源——托尼·霍尔爵士

【讨论】:

【参考方案2】:

您提到“X 是一个直到执行时我才知道的值”,这是否意味着它是静态的?

如果您需要它是动态使用向量,但如果 X 不更改使用数组,因为它将为您节省一点内存(如果 X 是静态的,两者将以几乎相同的速度运行)。

至于您关于何时使用 new 的问题,我将遵循这篇文章: When to use "new" and when not to, in C++?

【讨论】:

以上是关于高性能程序,啥是更好的向量数组或向量向量的主要内容,如果未能解决你的问题,请参考以下文章

考虑到干净代码的性能,啥更好

性能 - 使用迭代器或指针迭代向量?

位向量与布尔值列表的性能

使用 Cuda 进行 128 位向量加法,性能问题

性能优化篇:NEON快速入门指南

【论文笔记】融合标签向量到BERT:对文本分类进行改进