我设法将网络应用程序性能提高了10%。有了这个,我注意到内存使用量增加了一倍!!!
测试应用程序执行:调用Web服务,执行一些复杂的业务操作* [用户数] * [次数]
我检查了我的更改代码,但是没有什么可以使用更多的内存..(我所做的就是删除将DataSet序列化为byte []并将其保存在缓存中的代码行) 我在多线程测试中一次又一次地检查:
任何人都能解释为什么????
以下代码:
之前:(周期时间:100%记忆100%)
outStream = new MemoryStream();
new BinaryFormatter().Serialize(outStream, stateData);
outStream.Close();
SessionSettings.StateData_Set(stateId, outStream.ToArray());
outStream.Dispose();
选项1之后:(周期时间:200%内存50%)
for (int i = 0; i < 20; i++)
{
outStream = new MemoryStream();
new BinaryFormatter().Serialize(outStream, stateData);
}
outStream.Close();
SessionSettings.StateData_Set(stateId, outStream.ToArray());
outStream.Dispose();
选项2之后:(周期时间:90%内存200%)
//outStream = new MemoryStream();
//new BinaryFormatter().Serialize(outStream, stateData);
//outStream.Close();
SessionSettings.StateData_Set(stateId, null);
//outStream.Dispose();
SessionSettings.StateData_Set将对象放入
dictionary<string,dictionary<string, object>>
表示
<Sessions<DataKey,DataObject>>
在每个循环结束时,内部字典删除条目 并且在每个用户会话结束时,从外部字典中删除整个内部字典。
答案 0 :(得分:4)
另一个猜测:如果您的应用程序分配了太多内存(可能通过频繁的序列化),CLR将更频繁地触发GC。通过观看性能计数器 - &gt;你会注意到GC的时间,GC占用了大量的CPU - 我看到场景高于40%。如果您的数据集很大并且byte []存储在LOH上结束,则尤其如此。
通过限制这些分配,GC的触发频率会降低,从而导致更好的应用程序性能。观察到内存增加的原因可能是托管堆现在在健康区域中工作得更多。
为了找到更可靠的解释,请发布一些性能对策:优化之前和优化之后。有趣的是:整体堆大小,GC中的时间花费。
答案 1 :(得分:3)
由于您没有提供任何代码,只提供简短的解释,因此它更像是一个谜语而不是一个问题。
因此,也许10个用户几乎同时访问了CACHED DATASET。用户同步锁定和查看CACHED DATASET(一次一个)。这在多线程测试中表现不佳,但会占用很少的内存。
也许10个用户几乎同时访问了REPLICATED DATASET(未缓存)。每个用户都有自己的REPLICATED DATASET副本。由于没有锁定/同步访问和DATASET的多个副本,内存会增加,但性能会提高。