今天我只是試圖解決編程中的一個問題。我注意到 vector<vector> 的分配和排序比 vector<pair<int, pair<int, int>> 慢得多。我做了一些基準測驗,發現嵌套向量代碼比給定輸入的嵌套對代碼慢 4 倍(https://pastebin.com/izWGNEZ7)。
下面是我用于基準測驗的代碼。
auto t_start = std::chrono::high_resolution_clock::now();
vector<pair<int, pair<int, int>>> edges;
for (int i = 0; i < points.size(); i )
for (int j = i 1; j < points.size(); j )
edges.push_back({abs(points[i][0] - points[j][0]) abs(points[i][1] - points[j][1]), {i, j}});
sort(edges.begin(), edges.end());
auto t_end = std::chrono::high_resolution_clock::now();
double elapsed_time_ms = std::chrono::duration<double, std::milli>(t_end - t_start).count();
cout << elapsed_time_ms << endl;
auto t_start1 = std::chrono::high_resolution_clock::now();
vector<vector<int>> edges1;
for (int i = 0; i < points.size(); i )
for (int j = i 1; j < points.size(); j )
edges1.push_back({abs(points[i][0] - points[j][0]) abs(points[i][1] - points[j][1]), i, j});
sort(edges1.begin(), edges1.end());
auto t_end1 = std::chrono::high_resolution_clock::now();
double elapsed_time_ms1 = std::chrono::duration<double, std::milli>(t_end1 - t_start1).count();
cout << elapsed_time_ms1 << endl;
輸出:
241.917
1188.11
有誰知道為什么性能差異很大?
uj5u.com熱心網友回復:
A std::pairorstd::array具有在編譯時已知的固定大小,并將直接將物件包含在類本身中。std::vector另一方面,A必須處理動態大小,并且需要在堆上分配一塊記憶體來保存物件。
對于小物件,std::pairorstd::array會更好,因為分配和釋放記憶體的開銷會影響您的性能。這就是你所看到的。例如,在比較元素以及必須在運行時檢查大小時,指標所涉及的額外間接也會使您付出代價。
另一方面,對于大型物件,std::vector應該更好,因為它支持移動語意。交換 2 個向量只會交換指向資料的指標,而std::pair必須std:array移動/復制每個元素,這對于大型物件來說代價高昂。
因此,您看到的不是該對比向量快,而是該對比該用例中的向量快。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/480053.html
上一篇:在阻塞應用設計中使用SpringWebflux的WebClient是否會導致比RestTemplate更大的資源使用
下一篇:最大并發客戶端連接數GRPC
