PRB: High CPU Utilization in Web Service or Web Form (307340)
The information in this article applies to:
- Microsoft Web Services (included with the .NET Framework 1.1)
- Microsoft ASP.NET (included with the .NET Framework 1.1)
- Microsoft ASP.NET (included with the .NET Framework) 1.0
- Microsoft Web Services (included with the .NET Framework) 1.0
This article was previously published under Q307340 This article refers to the Microsoft .NET Framework Class
Library System.Text namespace. SYMPTOMS You may notice that your production Web server has 100
percent CPU utilization and slow response times, even under light load.
CAUSE This problem frequently occurs when your application
performs many string concatenations, such as dynamically building HTML or XML
strings. In this scenario, Aspnet_wp.exe (or W3wp.exe , for applications that
run on IIS 6.0) is the offending process. You can see evidence of this problem
in Task Manager on the Processes tab or in the Performance Monitor counter.
RESOLUTION Use one of the following methods to resolve this problem. Solution 1 Use the System.Text.StringBuilder class to perform the concatenations.
For additional
information, click the article number below to view the article in the
Microsoft Knowledge Base: 306821 HOW TO: Improve String Concatenation Performance in Visual Basic .NET
Solution 2 Use the Response.Write method (for Web Forms) instead of concatenation to stream the
text. Note This solution assumes that your code is in ASP-style render
blocks. For example:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="mypage.aspx.vb" Inherits="myproject._mypage"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<body>
<form id="Form1" method="post" runat="server">
<asp:Button id="Button1" runat="server" Text="Button1"></asp:Button>
<p></p>
<%
Response.Write("My ")
Response.Write("streamed ")
Response.Write("text")
%>
<p></p>
<asp:Button id="Button2" runat="server" Text="Button2"></asp:Button>
</form>
</body>
</HTML>
STATUSThis
behavior is by design.MORE INFORMATION String concatenation is notoriously inefficient. It
involves character copies on the order of "l * n * n," where "l" is the average
string length, and "n" is the number of substrings that are concatenated
together. When "n" is a large value, your application can dramatically slow,
and the concatenation can exhaust both the CPU and the heap. StringBuilder efficiency is on the order of "n * l," if you can reasonably
estimate the buffer size in advance. StringBuilder is somewhat less efficient if it needs to grow the internal
buffer but is still much better than concatenation.
Modification Type: | Minor | Last Reviewed: | 8/24/2005 |
---|
Keywords: | kbPerformance kbprb kbWebForms KB307340 kbAudDeveloper |
---|
|