PRB: Elevada utilización de CPU en un servicio Web o en un Web Form

Síntomas

Quizás observe que el servidor Web de producción tiene una utilización de la CPU del 100 por cien y tiempos de respuesta lentos, incluso con poca carga.

Causa

Normalmente este problema se produce cuando la aplicación realiza muchas concatenaciones de cadenas, como generar dinámicamente cadenas del Lenguaje de marcado de hipertexto (HTML) o del Lenguaje de marcado extensible (XML). En este caso, Aspnet_wp.exe es el proceso que produce el error. Puede verse en la ficha Procesos del Administrador de tareas o en el contador % de tiempo de procesador de Monitor de rendimiento.

Solución

Utilice uno de los métodos siguientes para resolver este problema.

Solución 1

Utilice la clase System.Text.StringBuilder para realizar las concatenaciones.
Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

306821 CÓMO: Mejorar el rendimiento de la concatenación de cadenas en Visual Basic .NET

Solución 2

Utilice el método Response.Write (para Web Forms) en lugar de la concatenación para transmitir el texto.


NOTA: en esta solución se supone que el código está en bloques de procesamiento estilo ASP. Por ejemplo:
<%@ 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>

Estado

Este comportamiento es una característica del diseño de la aplicación.

Más información

La concatenación de cadenas es bastante ineficiente. Implica copias de caracteres en el orden "l * n * n", donde "l" es la longitud promedio de la cadena y "n" es el número de subcadenas concatenadas. Cuando "n" es un valor grande, la aplicación puede funcionar muy despacio y la concatenación puede consumir tanto la CPU como el montón. La eficiencia de StringBuilder está en el orden de "n * l" si puede estimar de antemano el tamaño del búfer de forma razonable. StringBuilder es menos eficiente si tiene que aumentar el búfer interno, pero sigue siendo mucho mejor que la concatenación.
Propiedades

Id. de artículo: 307340 - Última revisión: 1 dic. 2005 - Revisión: 1

Comentarios