【发布时间】:2012-02-22 16:10:23
【问题描述】:
我已设法将 Web 应用程序的性能提高到比以前快 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>>
在每个循环结束时,内部字典删除条目 并且在每个用户会话结束时,整个内部字典都从外部字典中删除。
【问题讨论】:
-
请澄清。您删除了序列化的代码,将其替换为保存在缓存中的代码?或者,您删除了序列化和缓存数据的代码?
-
您能否提供一些见解,您是如何测量内存使用情况的?您是否也考虑了 GC(性能计数器 -> GC 中的时间)?
-
我删除了序列化的代码和将此序列化值放入缓存的代码。
-
我还没有使用性能计数器。我在客户端使用秒表来测量平均响应时间,并观察服务器上 w3wp 的任务管理器内存使用情况。
标签: .net multithreading performance memory-management