你说这有一张地图,而且相当大。如果这些子图很大,则可能是您访问数据的方式导致了问题。这就是我的意思,如果你正在做这样的事情:
// Potential problem as it copies the sub-map each time
stageStoreCache->find('sub-map')->find('data')
stageStoreCache->find('sub-map')->find('other')
问题在于,每次stageStoreCache->find('sub-map')
调用它实际上都必须将它为“子地图”找到的所有地图数据从线程对象复制到请求该数据的线程中。如果这些子图很大,这需要时间。更好的方法是执行一次并将其存储在局部变量中:
// Better Approach
local(cache) = stageStoreCache->find('sub-map')
#cache->find('data')
#cache->find('other')
这至少只需要复制一次“子地图”。另一种可能更好的方法(只有测试才能知道)是重构您的代码,以便对 stageStoreCache 的每次调用都会深入到您实际想要的数据,并且只复制少量数据。
// Might even be better as it just copies the values you want
stageStoreCache->drill('sub-map', 'data')
stageStoreCache->drill('sub-map', 'other')
最终,我希望Lasso改进线程对象,使它们永远不会阻塞读取。(我原以为这是作为功能请求提交的,但我在 Rhinotrac 上没有找到它。)在此之前,如果我的建议都没有帮助,那么您可能需要使用其他东西进行调查以缓存这些数据,例如内存缓存。