IIS 7真的很慢连接C#字符串

时间:2012-11-27 00:10:09

标签: c# string memory iis-7

我们有一个大型系统已经实现了很多字符串连接 - 它无处不在。

我们写了一个快速页面,在循环中连接字符串。这在我们的dev boxen(调试关闭)和我们的测试VM上运行3.3秒。但是在生产(IIS7)上,它运行时间为15.7秒。

任何人都可以建议我们可以在服务器端查看(IIS设置,内存设置等)来解释这个问题吗?

仅供参考 - 服务器有大量的可用内存和可用的CPU周期 - 所以它不是资源问题。 重写所有使用string.Join或StringBuilder的代码不在预算范围内。

3 个答案:

答案 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?

检查您的应用是否未在调试模式下运行。