我有unique_ptr巨大的向量。調用矢量析構函數或清除不同的線程
當我需要做clear()或調用析構函數時,它花費了4-5秒。
加速它的一種理論方法是創建臨時向量,將其與我工作的巨大向量交換,然後啓動一個線程並在臨時向量上調用清除。
當看着互聯網,我沒有看到任何人這樣說優化。
是否有缺陷在我的優化?
我有unique_ptr巨大的向量。調用矢量析構函數或清除不同的線程
當我需要做clear()或調用析構函數時,它花費了4-5秒。
加速它的一種理論方法是創建臨時向量,將其與我工作的巨大向量交換,然後啓動一個線程並在臨時向量上調用清除。
當看着互聯網,我沒有看到任何人這樣說優化。
是否有缺陷在我的優化?
我想你的想法應該工作。例如,如果你有一些數據的std::vector
稱爲X
:
struct X
{
// some data here
};
using DataStorage = std::vector<std::unique_ptr<X>>;
你可以使用std::async
移動DataStorage
對象,這個對象異步的調用clear()
:
DataStorage data;
// data usage
auto clear_task = std::async(std::launch::async,
&DataStorage::clear, std::move(data));
// do some stuff here; data object is not used anymore
clear_task.wait();
這裏沒有不必要的複製:您只需移動data
並指定您希望在單獨的線程中調用clear()
,以便在執行清除操作時主線程不會掛起。
是的,交換/移動的重點是你可以立即使用空向量。 – Nick
@Nick我想你不能在移動後使用'std :: vector'。但是你可能會像上面提到的那樣進行交換,並處理空向量。 –
聽起來可行...也許你可以想出不同的分配方案,因此你有更少的更大的分配 –
沒有人談論它的原因是混合的:你有一個非常專業化的請求+它是有點直觀和微不足道(對於生硬而言很抱歉)。 –
fyi:您可能沒有看到這種技術所帶來的所有好處 - 堆是共享資源,分配/刪除時需要鎖定。所以你的後臺線程會「擁有」堆,直到完成刪除向量。你的主線程中的分配(例如std :: string,std :: vector等)將不得不爭奪堆鎖。 –