C++ 什么样的优化可以提高我的性能?

C++ 什么样的优化可以提高我的性能?,c++,performance,sorting,optimization,C++,Performance,Sorting,Optimization,我编写了一个小型java程序,它对排序算法(合并排序、选择排序)进行基准测试,并显示排序person对象(名称、升序)所需的时间 这个程序的C++版本至少比java版本慢4倍。有几个开发人员说,他们通过优化代码在排序方面击败了java。释放模式,/O2,64位。我已经做了这些调整 我的排序算法(尤其是合并排序)有没有效率低下 //创建一个子向量 模板std::vector splitVec(std::vector main,size\u t from,size\u t to){ std::vec

我编写了一个小型java程序,它对排序算法(合并排序、选择排序)进行基准测试,并显示排序person对象(名称、升序)所需的时间

<>这个程序的C++版本至少比java版本慢4倍。有几个开发人员说,他们通过优化代码在排序方面击败了java。释放模式,/O2,64位。我已经做了这些调整

我的排序算法(尤其是合并排序)有没有效率低下

//创建一个子向量
模板std::vector splitVec(std::vector main,size\u t from,size\u t to){
std::vector::const_iterator first=main.begin()+from;
std::vector::const_iterator last=main.begin()+to;
标准::向量erg(第一个,最后一个);
返回erg;
}
//合并排序-排序过程
模板std::vector merge(std::vector m1,std::vector m2){
无符号整数posA=0,posB=0;
std::载体视网膜电图;
而(posA

提前感谢

通过引用传递向量。这将显著提高性能


当您通过值传递向量时,您每次都会复制它(在每个步骤中增加O(n)的复杂性)

通过引用传递向量。这将显著提高性能


当您通过值传递向量时,您每次都会复制它(在每个步骤中增加O(n)的复杂性)

您缺少一个非常大的优化。您通过值而不是引用传递所有向量。这意味着每个函数调用都在复制向量,这是非常低效的


<>因为java中的所有东西都是指针,java代码不打算把所有这些拷贝都作为C++代码中的一个主要部分。<>你不需要一个非常大的优化。你是通过值传递所有向量而不是引用。这意味着每个函数调用都复制了向量。效率很低


因为java中的所有东西都是指针,java代码不打算把所有这些拷贝都作为C++代码中的一个主要部分。

通过引用传递源数据,而不是复制它,将是一个巨大的改进。
此外,您应该
erg
中保留
空间,否则在添加更多元素时会重复重新分配和复制所有元素。

通过引用传递源数据,而不是复制它,这将是一个巨大的改进


此外,您应该
erg
中保留
空间,否则在添加更多元素时会重复重新分配和复制所有元素。

不要传递向量。不要通过值,也不要通过引用。传递迭代器:

template <class Iter>
void sort(Iter first, Iter last) {
    ...
}

sort(my_vector.begin(), my_vector.end();
模板
无效排序(Iter优先,Iter最后){
...
}
排序(my_vector.begin(),my_vector.end();
要分割范围,只需计算中间值:

template <class Iter>
Iter mid(Iter first, Iter last) {
    return first + (last - first) / 2;
}
模板
国际热核实验堆中期(国际热核实验堆第一,国际热核实验堆最后){
返回第一个+(最后一个-第一个)/2;
}

这假设代码仍在对某种容器中保存的值进行排序(在原始代码中,是
std::vector
),因此迭代器是随机访问迭代器。

不传递向量。不按值传递,也不按引用传递。传递迭代器:

template <class Iter>
void sort(Iter first, Iter last) {
    ...
}

sort(my_vector.begin(), my_vector.end();
模板
无效排序(Iter优先,Iter最后){
...
}
排序(my_vector.begin(),my_vector.end();
要分割范围,只需计算中间值:

template <class Iter>
Iter mid(Iter first, Iter last) {
    return first + (last - first) / 2;
}
模板
国际热核实验堆中期(国际热核实验堆第一,国际热核实验堆最后){
返回第一个+(最后一个-第一个)/2;
}

这假设代码仍在对某种容器中保存的值进行排序(在原始代码中,a
std::vector
),因此迭代器是随机访问迭代器。

使用push_-back而不是索引是很慢的。一次性分配工作数组或向量,并将其索引到该数组中,可以避免执行所有这些递归分配。使用一对相互递归的函数可以避免在合并后将数据复制回

自底向上的合并排序会稍微快一点,虽然自底向上的合并排序通常是大多数库所使用的(如std::stable_sort),但自顶向下的合并排序似乎是教室里教的

适用于数组或向量的自顶向下合并排序的示例模板(将向量作为指向第一个元素的指针传递)

模板
void TopDownSplitMergeAtoA(T a[],T b[],尺寸ll,尺寸ee);
模板
void TopDownSplitMergeAtoB(T a[],T b[],尺寸ll,尺寸ee);
模板
void TopDownMerge(T a[],T b[],大小ll,大小rr,大小ee);
模板
void MergeSort(ta[],size\u T n)//输入函数
{
if(n<2)//if size<2返回
返回;
T*b=新的T[n];
TopDownSplitMergeAtoA(a,b,0,n);
删除[]b;
}
模板
void TopDownSplitMergeAtoA(T a[],T b[],尺寸L,尺寸ee)
{
if((ee-ll)==1)//if size==1返回
返回;
大小\u t rr=(ll+ee)>>1;//中点,右半部分的起点
TopDownSplitMergeAtoB(a、b、ll、rr);
TopDownSplitMergeAtoB(a、b、rr、ee);
TopDownMerge(b,a,ll,rr,ee);//将b合并到a
}
模板
void TopDownplitMergeAtob(T a[],T b[],尺寸L,尺寸ee)
{
如果((ee-ll)==1){//if size==1将a复制到b
b[ll]=a[ll];
返回;
}
大小\u t rr=(ll+ee)>>1;//中点,右半部分的起点
顶降层麦角(a、b、ll、rr);
TopDownSplitMergeAtoA(a、b、rr、ee);
TopDownMerge(a,b,ll,rr,ee);//将a合并到b
}
模板
无效上下合并(T a[],T b[],大小