分析我的代碼,我看到很多緩存未命中,並想知道是否有辦法改善這種情況。優化並不是真的需要,我更加好奇是否存在這個問題的一般方法(這是一個後續問題)。局部性和共享訪問對象
// class to compute stuff
class A {
double compute();
...
// depends on other objects
std::vector<A*> dependencies;
}
我有一個容器類,它存儲指向所有創建的類A
的對象的指針。我不存儲副本,因爲我想共享訪問權限。在我使用shared_ptr
之前,但如果沒有容器,單個A
沒有意義,原始指針就沒有問題。
class Container {
...
void compute_all();
std::vector<A*> objects;
...
}
矢量objects
是插入的方式,全面評估可以通過簡單的迭代和調用A.compute()
進行排序,因此所有的依賴關係都解決了。
隨着A
類的a_i
對象,評估可能是這樣的:
a_1 => a_2 => a_3 --> a_2 --> a_1 => a_4 => ....
其中=>表示在Container
迭代和 - >迭代過A::dependencies
此外,創建容器類只有一次,並且compute_all()被調用很多次,因此在創建後重新整理整個結構是一個選項,並且不會損害效率。
我們的意見/問題:
顯然,遍歷
Container::objects
是緩存效率,但訪問指針對象絕對不是。而且,由於
A
類型的每個對象都必須遍歷A::dependencies
,這又會導致緩存未命中。
它是否有助於創建在評估順序所有需要的對象單獨vector<A*>
使得A
依賴插入的副本?
事情是這樣的:
a_1 => a_2 => a_3 => a_2_c => a_1_c => a_4 -> ....
其中a_i_c來自A_I副本。
感謝您的幫助和抱歉,如果這個問題令人困惑,但我覺得從簡單的例子推斷到大型應用程序很困難。
檢查這一個標準庫(我認爲提升了一些好的,EASTL圍繞這個概念居中):HTTP:/ /stackoverflow.com/questions/460666/decreasing-cache-misses-through-good-design – AJG85 2011-04-22 15:36:13
這絕對不是C的問題。 – Puppy 2011-04-22 19:12:26