我们有一个大型系统已经实现了很多字符串连接 - 它无处不在。
我们写了一个快速页面,在循环中连接字符串。这在我们的dev boxen(调试关闭)和我们的测试VM上运行3.3秒。但是在生产(IIS7)上,它运行时间为15.7秒。
任何人都可以建议我们可以在服务器端查看(IIS设置,内存设置等)来解释这个问题吗?
仅供参考 - 服务器有大量的可用内存和可用的CPU周期 - 所以它不是资源问题。 重写所有使用string.Join或StringBuilder的代码不在预算范围内。
答案 0 :(得分:3)
这会在内存中创建大量微小的字符串对象,需要稍后由垃圾收集器收集。替换为
var sMain = new StringBuilder();
while (something)
{
sMain.Append(sStringSub);
// ...
}
// Call sMain.ToString() when you need the whole string
答案 1 :(得分:2)
不相信我是第一个推荐RedGates Profiling Tools的人。
这将告诉您服务器与开发PC之间花费的时间是多少。
字符串是存储在托管堆上的引用类型,因此受垃圾收集的影响。 GC会在第一次检测到它时无法释放内存,因此GC会在几代(0,1,2)中提升您的字符串。如果你看CLR Profiler我打赌你会看到一大堆字符串分配给第2代。
重写所有代码以使用string.Join或StringBuilder不在 预算。
预算与否无关紧要。如果申请需要15秒才能回复,没有人会想要使用它,你就不会赚钱。你将不得不改变一些东西。
如果没有Profiler跟踪它就像在黑暗中拍摄一样......我最好的猜测就是开发PC有一个SSD。
即使字符串是不可移植的,并且很大一部分内存可能是指已连接的字符串,但GC无法收集。我仍然不认为这是一个内存问题,我打赌它与I / O有关,但是探查器跟踪会确认。
答案 2 :(得分:0)
将开发框中的网站设置与生产框区分开来。有许多事情可能导致不同的,从工作线程数到最大内存大小的所有内容。如果超过这些阈值,IIS将回收工作人员。
另外,你在开发箱上使用IIS还是Cassini?
检查您的应用是否未在调试模式下运行。