Cualquier 'logros rápidos' para hacer más rápida la comunicación remota de .NET en una sola máquina?

StackOverflow https://stackoverflow.com/questions/4163613

Pregunta

he sido mal bajada y recibió una solicitud que en ciertas situaciones es al menos 100 veces demasiado lento, lo que tengo que liberar a nuestros clientes muy pronto (una cuestión de semanas).

A través de algunos muy sencilla de perfiles He descubierto que el cuello de botella es el uso de .NET Remoting para transferir datos entre un servicio de Windows y la interfaz gráfica -. Tanto que se ejecutan en la misma máquina

directrices de Microsoft decir "Minimizar ida y vuelta e interfaces evitar hablador" : escribir

MyComponent.SaveCustomer("bob", "smith");

en lugar de

MyComponent.Firstname = "bob";
MyComponent.LastName = "smith";
MyComponent.SaveCustomer();

creo que esta es la raíz del problema en nuestra aplicación. llama el servicio de MyComponent. * (los espectáculos de perfil del que 99,999% del tiempo se gasta en dichas declaraciones) se dispersan liberalmente a través del código fuente y no veo ninguna esperanza de rediseño de la interfaz de acuerdo con las pautas anteriores.

Editar : De hecho, la mayoría de las veces el front-end lee propiedades de MyComponent en lugar de escrituras en ella. Pero sospecho que MyComponent puede cambiar en cualquier momento en el back-end.

Miré para ver si puedo leer todas las propiedades de MyComponent de una sola vez y luego almacenar en caché de forma local (ignorando el problema del cambio-a-cualquier-tiempo por encima), pero que implicaría alterar cientos de líneas de código.

Mi pregunta es:? ¿Son cualquier 'rápida-ganar' cosas que puedo tratar de mejorar el rendimiento

necesito al menos a 100 veces la velocidad de marcha. Soy un / C ++ / C programador Delphi y estoy bastante-mucho más familiarizado con C # /. NET / Conexión remota distinta de lo que he leído en el último par de días. Estoy en busca de cosas que se pueden completar en unos pocos días -. Una gran reestructuración del código no es una opción

Sólo para empezar, ya he confirmado que se está utilizando BinaryFormatter.

(Lo siento, esto es probablemente una pregunta terribles en la línea de '¿Cómo puedo factible solución X si descartar todas las opciones posibles' ... pero estoy desesperado!)

Editar 2 En respuesta al comentario de Richard a continuación: Creo que mi pregunta se reduce a:

  1. ¿Hay alguna configuración que puede cambiar para reducir el costo de un remoto .NET de ida y vuelta cuando ambos extremos de la conexión están en el mismo equipo?
  2. ¿Hay alguna configuración que puede cambiar para reducir el número de viajes de ida y vuelta - para que cada invocación de una propiedad de objeto remoto no se traduce en una ida y vuelta por separado? Y esta ruptura podría nada?
¿Fue útil?

Solución

En .Net Remoting que tienen 3 formas de comunicación a través de HTTP, TCP e IPC. Si el commnuicatin está en el mismo PC que sugest utilizando canales IPC se acelerará sus llamadas.

Otros consejos

En pocas palabras, no hay ninguna victoria rápida aquí. Personalmente no marca MyComponent (como DTO) un MarshalByRefObject (que presumiblemente es el problema), como aquellas idas y vueltas van a paralizar. Me gustaría mantener como una clase regular, y sólo se mueven unos métodos clave para bombear alrededor de ellos (es decir, tener un MarshalByRef Gestor / repositorio / etc clase).

Esto debería reducir viajes redondos ; Si Todavía tener problemas, entonces es probable que haya ancho de banda relacionados; esto es más fácil de arreglar; por ejemplo cambiando el serializador. protobuf-net le permite hacer esto fácilmente, simplemente implementando ISerializable y expedición de los dos métodos (uno de la interfaz, además de la ctor) a ProtoBuf.Serializer - entonces hace todo el trabajo por usted, y trabaja con comunicación remota. Puedo dar ejemplos de esto si te gusta.

En realidad, puede ayudar-protobuf red con uso de la CPU también, ya que es un serializador CPU mucho más eficiente.

Podría hacer MyComponent una clase que va a almacenar en caché los valores y sólo presentarlos cuando se llama SaveCustomer ()?

Puede intentar comprimir el tráfico. Si no aumentan 100 veces, todavía se obtendrá alguna ventaja de rendimiento

Si necesita los datos más recientes (ver siempre el valor real), y el costo de obtener los datos cada vez que domina el tiempo de ejecución, entonces necesita ser radical.

¿Qué hay de cambiar de votación para empujar. En lugar de llamar a la parte remota cada vez que necesite un valor, tener el mando a distancia Presione todos los cambios y la memoria caché los últimos valores localmente.

búsquedas locales (después de la escapada inicial) están siempre al día con todos los gastos generales de comunicación remota se está realizando en el fondo (en otro hilo). Sólo tenga cuidado acerca de la seguridad para este tipo de hilo no atómicas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top