Soy nuevo en los servicios de datos de WCF, así que he estado jugando. Después de algunas pruebas iniciales, estoy decepcionado por el rendimiento de mi servicio de datos de prueba.Cómo mejorar el rendimiento de los servicios de datos de WCF
que se dan cuenta de que, debido a un WCF DS es HTTP basado en que hay sobrecarga inherente al protocolo, pero mis pruebas son todavía muy lento de lo que se puede esperar:
Medio Ambiente:
- Todo en una caja : Computadora portátil Quad Core de 64 bits con 4 GB de RAM con W7. Máquina decente
- Pequeña base de datos SQL (SQLExpress 2008 R2) con 16 tablas ... la tabla bajo prueba tiene 243 filas.
- Organicé mi servicio de prueba en IIS con todos los valores predeterminados.
Código:
- He creado un modelo de Entity Framework (DataContext) de esta base de datos (archivo codegen por VS2010).
- He creado un servicio de datos basado en este modelo.
- He creado un cliente que tiene una referencia de servicio directo (ObjectContext) para este servicio (de la codegen por VS2010)
- En el cliente también soy capaz de llamar el modelo EF directamente y también utilizar SQL Native (ADO .NET SqlConnection)
plan de pruebas:
- Cada iteración se conecta a la base de datos (no es una opción para reutilizar las conexiones), consultas de todas las filas de la tabla de destino ("Eventos") y luego los cuenta (lo que obliga a realizar recuperaciones diferidas).
- Ejecutar para 25 iteraciones cada una para SQL nativo (SqlConnection/SqlCommand), Entity Framework (DataContext) y WCF Data Services (ObjectContext).
Resultados:
- 25 iteraciones de SQL Native: 436ms
- 25 iteraciones del marco de la entidad: 656ms
- 25 iteraciones de WCF Data Services: 12110ms
ay. Eso es aproximadamente 20 veces más lento que EF.
Dado que los servicios de datos WCF son HTTP, no hay oportunidad para la reutilización de la conexión HTTP, por lo que el cliente se ve obligado a volver a conectarse con el servidor web para cada iteración. Pero seguramente está sucediendo más aquí que eso.
EF es bastante rápido y es el mismo código/modelo EF que se reutiliza para las pruebas de servicio y de cliente directo a EF. Habrá una sobrecarga para la serialización Xml y la deserialización en el servicio de datos, ¡pero eso es mucho!?! He tenido un buen rendimiento con la serialización Xml en el pasado.
Voy a realizar algunas pruebas con las codificaciones JSON y Protocol-Buffer para ver si puedo obtener un mejor rendimiento, pero tengo curiosidad si la comunidad tiene algún consejo para acelerar esto.
No soy fuerte con IIS, por lo que quizás haya algunos ajustes de IIS (cachés, pools de conexión, etc.) que se pueden configurar para mejorar esto?
interesante ... una serie de puntos de vista, unos up-votos, y un par de favoritos añade, pero no hay respuestas. Estoy abriendo una recompensa por esto para dar más vida a esta pregunta. Espero que alguien tenga una respuesta. –
No utilizaría WCF Data Services a menos que estuviera planeando exponer mis datos a otras aplicaciones. Si todo se está ejecutando en la misma caja, ¿por qué no simplemente usar EF directamente? –
No se está ejecutando en la misma caja. Pero las fuentes de datos están todas en una red corporativa (muy grande e internacional). Estoy tratando de poner una capa de servicio frente a una serie de fuentes de datos diferentes (SQL, XML, archivos planos, etc.) que aísla la semántica de almacenamiento real de la capacidad de descubrir y consultar los datos. –