我寫了一個基於排序算法(合併排序,選擇排序)的小型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;
}
由於事先
傳遞參數(const-)引用而不是值來避免額外的副本。 – Jarod42
你傳遞和返回值的向量。在C++中,這會複製向量的所有元素。 – Rotem
代碼結構中的優化通常優於編譯器優化設置。通過引用而不是按值傳遞向量將是一個好的第一步。 [預留()'](http://en.cppreference.com/w/cpp/container/vector/reserve)預先容納的空間需要容易的一秒。至少這兩人應該把你和Java放在同一個地方。公平起見,至少你沒有「新」每一個對象,所以有希望。 ;-) – DevSolar