2017-08-05 62 views
2

我有unique_ptr巨大的向量。調用矢量析構函數或清除不同的線程

當我需要做clear()或調用析構函數時,它花費了4-5秒。

加速它的一種理論方法是創建臨時向量,將其與我工作的巨大向量交換,然後啓動一個線程並在臨時向量上調用清除。

當看着互聯網,我沒有看到任何人這樣說優化。

是否有缺陷在我的優化?

+3

聽起來可行...也許你可以想出不同的分配方案,因此你有更少的更大的分配 –

+0

沒有人談論它的原因是混合的:你有一個非常專業化的請求+它是有點直觀和微不足道(對於生硬而言很抱歉)。 –

+2

fyi:您可能沒有看到這種技術所帶來的所有好處 - 堆是共享資源,分配/刪除時需要鎖定。所以你的後臺線程會「擁有」堆,直到完成刪除向量。你的主線程中的分配(例如std :: string,std :: vector等)將不得不爭奪堆鎖。 –

回答

1

我想你的想法應該工作。例如,如果你有一些數據的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(),以便在執行清除操作時主線程不會掛起。

+0

是的,交換/移動的重點是你可以立即使用空向量。 – Nick

+1

@Nick我想你不能在移動後使用'std :: vector'。但是你可能會像上面提到的那樣進行交換,並處理空向量。 –