Slow ApplicationSettingsBase

问题描述:

在多线程场景中使用时,应用程序设置机制(派生自ApplicationSettingsBase)似乎是一个真正的瓶颈。尤其是,当经常查询属性时,它们引入的并发性会减慢我的循环。无论如何,我喜欢使用它们以获得那些漂亮的应用程序配置选项。但也许我需要将它们包装到我自己的缓存中,或者如此?Slow ApplicationSettingsBase

任何人都有同样的问题?我错过了什么吗?我想,ApplicationSettingsBase会缓存所有设置吗?为什么它似乎锁定来自多个线程的访问?什么可能是一个常见的解决方法?

我看不出有什么奇怪的线程安全设置机制?如果它减慢了你喜欢的并发游戏,你应该尝试使用局部变量而不是再次快速查询getsetting。我认为重新设计您的设置请求机制会显着提高执行效率。

+0

我想你是对的。设置机制似乎不适用于这种使用方案。谢谢。 – user492238 2012-02-29 08:28:10

我真的建议在对象中包装任何类型的“获取设置”功能并将其隐藏在接口后面。我们强烈型这一点,所以我们有:

public class Worker 
{ 
    private readonly ISettings settings; 
    public Worker (ISettings settings) 
    { 
     this.settings = settings; 
    } 

    public void Work() 
    { 
     for (int i = 0; i < settings.MaxWorkerIterations(); i++) 
     { ... } 
    } 
} 

public interface ISettings 
{ 
    int MaxWorkerIterations(); 
} 

public class AppConfigSettings 
{ 
    public int MaxWorkerIterations() 
    { 
     return (int) ApplicationSettings["MaxWorkerIterations"]; 
    } 
} 

这样做的(主要)编译时检查和可测性容易受益。您也可以将您的AppConfigSettings类重写为一个明显的CachingAppConfigSettings类。

+1

我真的不明白你的观点。这会如何改善这种情况?但由于缺乏其他合格的答案,我将不得不接受你的解决方案。 ;) – user492238 2012-02-25 15:35:03

+0

Yippie!可惜接受!我的答案是什么没有帮助?我提到了这方面的一些好处,以及如何轻松添加缓存层。 – 2012-02-27 15:59:12

+1

它没有什么帮助,因为将设置包装在界面中不会摆脱问题中描述的性能问题。无论如何;) – user492238 2012-02-29 08:19:56