【发布时间】:2016-06-29 12:47:48
【问题描述】:
我编写了一个小型 java 程序,它对排序算法(合并排序、选择排序)进行基准测试,并显示他们需要对人员对象进行排序(名称、升序)的时间。
这个程序的 C++ 版本至少比 java 版本慢 4 倍。有几个开发人员说他们通过优化代码在排序方面击败了 java。释放模式,/O2,64 位,...。我已经完成了这些调整。
我的排序算法(尤其是归并排序)是否存在效率低下的问题?
//create a subvector
template <typename T> std::vector<T> splitVec(std::vector<T> main, size_t from, size_t to) {
std::vector<T>::const_iterator first = main.begin() + from;
std::vector<T>::const_iterator last = main.begin() + to;
std::vector<T> erg(first, last);
return erg;
}
//merge sort - sorting process
template <typename T> std::vector<T> merge(std::vector<T> m1, std::vector<T> m2) {
unsigned int posA = 0, posB = 0;
std::vector<T> erg;
while (posA < m1.size() && posB < m2.size()) {
if (m1.at(posA).compareTo(m2.at(posB)) <= 0) {
erg.push_back(m1.at(posA));
posA++;
}
else {
erg.push_back(m2.at(posB));
posB++;
}
}
while (posA < m1.size()) {
erg.push_back(m1.at(posA));
posA++;
}
while (posB < m2.size()) {
erg.push_back(m2.at(posB));
posB++;
}
return erg;
}
//merge sort-split up vectors
template <typename T> std::vector<T> mergeSort(std::vector<T> pers) {
if (pers.size() > 1) {
//Split pers into two equally sized vectors
std::vector<T> p1(splitVec(pers, 0, pers.size()/2));
std::vector<T> p2(splitVec(pers, (pers.size()/2), pers.size()));
return merge(mergeSort(p1), mergeSort(p2));
}
else
return pers;
}
提前致谢
【问题讨论】:
-
您正在按值传递和返回向量。在 C++ 中,这会复制向量的所有元素。
-
代码结构中的优化通常优于编译器优化设置。通过引用而不是按值传递向量将是一个很好的第一步。
reserve()ing 前面所需的空间量很容易。仅这两个就应该至少让您进入与 Java 相同的范围。公平地说,至少你没有new每个对象,所以有希望。 ;-) -
minor:
at进行绑定检查,而[]没有(并且您已经检查了索引有效性:-))。 -
我已经通过引用传递了所有内容,并在所有可能的地方保留了空间。我的程序现在运行得更快了:)
-
c++ 版本的性能大大优于 java 版本。 :)))
标签: c++ performance sorting optimization