IIS 7非常慢的C#字符串

IIS 7非常慢的C#字符串,c#,string,memory,iis-7,C#,String,Memory,Iis 7,我们有一个大型系统,它已经用很多字符串连接实现了——它无处不在 我们写了一个快速页面,在循环中连接字符串。这在我们的dev-boxen(debug-off)和测试vm上以3.3s运行。然而,在生产(IIS7)中,其运行时间为15.7秒 有谁能建议我们可以从服务器端(IIS设置、内存设置等)了解这一点 仅供参考-服务器有大量的可用内存和可用CPU周期-所以这不是资源问题重写所有代码以使用string.Join或StringBuilder不在预算之内。这会在内存中创建大量微小的string对象,需要

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

我们写了一个快速页面,在循环中连接字符串。这在我们的dev-boxen(debug-off)和测试vm上以3.3s运行。然而,在生产(IIS7)中,其运行时间为15.7秒

有谁能建议我们可以从服务器端(IIS设置、内存设置等)了解这一点


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

这会在内存中创建大量微小的string对象,需要稍后由垃圾收集器收集。换成

  var sMain = new StringBuilder();
  while (something)
  {
    sMain.Append(sStringSub);
    // ...
  }

  // Call sMain.ToString() when you need the whole string

这会在内存中创建大量微小的字符串对象,这些对象需要稍后由垃圾收集器收集。换成

  var sMain = new StringBuilder();
  while (something)
  {
    sMain.Append(sStringSub);
    // ...
  }

  // Call sMain.ToString() when you need the whole string

将开发框中的网站设置与生产框中的网站设置区分开来。有很多因素可能会导致不同,从工作线程数到最大内存大小。如果超过这些阈值,IIS将回收工作进程

另外,您是否在dev box上使用IIS或Cassini


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

将“开发”框中的网站设置与“生产”框中的设置区分开来。有很多因素可能会导致不同,从工作线程数到最大内存大小。如果超过这些阈值,IIS将回收工作进程

另外,您是否在dev box上使用IIS或Cassini


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

真不敢相信我是第一个推荐的

这将准确地告诉您,与开发人员PC相比,在服务器上花费如此多的时间是什么。

字符串是存储在托管堆上的引用类型,因此要接受垃圾收集。当GC第一次检测到无法释放内存时,它会将字符串升级到第几代(0,1,2)。如果你看一看,我打赌你会看到分配给第二代的一吨字符串

重写所有代码以使用string.Join或StringBuilder不在 预算案

它是否在预算之内并不重要。如果一个应用程序需要15秒来响应,没有人会想使用它,你也不会赚到钱。你必须改变一些东西

没有探查器的痕迹就像在黑暗中拍摄。。。我最好的猜测是dev PC有一个SSD


即使字符串是不可变的,并且大部分内存可能引用了GC无法收集的串接字符串。我仍然不认为这是一个内存问题,我打赌这与I/O有关,但探查器跟踪将证实这一点。

不敢相信我是第一个推荐的

这将准确地告诉您,与开发人员PC相比,在服务器上花费如此多的时间是什么。

字符串是存储在托管堆上的引用类型,因此要接受垃圾收集。当GC第一次检测到无法释放内存时,它会将字符串升级到第几代(0,1,2)。如果你看一看,我打赌你会看到分配给第二代的一吨字符串

重写所有代码以使用string.Join或StringBuilder不在 预算案

它是否在预算之内并不重要。如果一个应用程序需要15秒来响应,没有人会想使用它,你也不会赚到钱。你必须改变一些东西

没有探查器的痕迹就像在黑暗中拍摄。。。我最好的猜测是dev PC有一个SSD


即使字符串是不可变的,并且大部分内存可能引用了GC无法收集的串接字符串。我仍然不认为这是一个内存问题,我打赌这与I/O有关,但探查器跟踪将确认。

如何连接字符串,使用+或使用StringBuilder类?Sergey-本质上是sStringMain+=sStringSub;你能给我们展示更可行的代码,让我们看看你在做什么,而不是让我们猜测或玩读心术吗?@Jack“我们写了一个快速页面,在循环中连接字符串”,所以快速查找替换并使用
StringBuilder
。否则,您将不得不为我们提供代码。但这并不是一个代码问题。如何使用+或使用StringBuilder类连接字符串?Sergey-本质上是sStringMain+=sStringSub;你能给我们展示更可行的代码,让我们看看你在做什么,而不是让我们猜测或玩读心术吗?@Jack“我们写了一个快速页面,在循环中连接字符串”,所以快速查找替换并使用
StringBuilder
。否则,您将不得不为我们提供代码。虽然这可能不是代码问题。正如我所说,此选项不在预算中,也不能解释差异-请在发布答案之前阅读问题。我会为StringBuilder预先分配更多内存。默认情况下,它包含16个字符。实际上,一旦它必须为更大的数据重新分配一个新的内存块,它就会对性能造成同样大的影响。@SimonWhitehead这不是.NET中StringBuilder的工作方式。与列表类似,StringBuilder可以扩展,而无需将旧内容复制到新数组中。否则StringBuilder将毫无用处。我个人尝试设置StringBuilder的创建容量,如果我有一个大致的想法,它应该有多大,但这是一个微观性能优化,将无法检测到。@Trispid不正确。ILSpy显示,如果容量(默认值:
internal const int DefaultCapacity=16;
)被消耗,它将调用其内部方法
private void ExpandByABlock(int minBlockCharCount)
,该方法分配一个新的
char[]<