Pregunta

El sistema de trabajo en que aquí se ha escrito antes .net 2.0 y no tiene el beneficio de medicamentos genéricos.Finalmente fue actualizado a la 2.0, pero ninguno de los que el código fue reestructurada debido a limitaciones de tiempo.Hay un número de lugares donde se utiliza el código ArraysLists etc.que guardar cosas, como objetos.

Desde la perspectiva del rendimiento, lo importante cambiar el código para el uso de medicamentos genéricos?Yo sé de una perfomance perspectiva, boxing y unboxing etc., es ineficiente, pero ¿cuánto de un aumento en el rendimiento va a realmente estar cambiarlo?Son algo genéricos para utilizar sobre una base hacia adelante, o no lo suficiente de un cambio de rendimiento que una conciencia debe hacerse un esfuerzo para actualizar el viejo código?

¿Fue útil?

Solución

Técnicamente el desempeño de los genéricos es, como dices, mejor.Sin embargo, a menos que el rendimiento es muy importante Y que ya ha optimizado en otras áreas que usted es probable para conseguir MUCHO mejor de mejoras por gastar su tiempo en otros lugares.

Yo sugeriría:

  • el uso de medicamentos genéricos en adelante.
  • si usted tiene un sólido unidad de pruebas, a continuación, refactorizar a los medicamentos genéricos como tocar código
  • pasa otra vez haciendo refactorings/medición que va a mejorar significativamente el rendimiento (llamadas de base de datos, cambiando las estructuras de datos, etc) en lugar de unos pocos milisegundos de aquí y de allá.

Por supuesto, hay otras razones de rendimiento a cambio de genéricos:

  • menos propenso a errores, ya que tienes tiempo de compilación comprobación de tipos
  • más legible, usted no necesita para lanzar por todo el lugar, y es obvio de qué tipo es almacenado en una colección
  • si eres el uso de medicamentos genéricos en el futuro, entonces es más para utilizar en todas partes

Otros consejos

He aquí los resultados que obtuve a partir de un simple análisis de una cadena a partir de un archivo de 100KB de 100.000 veces.La Lista Genérica(De carbón) tomó 612.293 segundos para ir de 100.000 veces, a través del archivo.El ArrayList tomó 2,880.415 segundos para ir de 100.000 veces, a través del archivo.Esto significa que en este escenario (como su kilometraje se variar) la Lista Genérica(De carbón) es de 4,7 veces más rápido.

Aquí está el código que corrió a través de 100,000 veces:

Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
    Dim genList As New ArrayList

    For Each ch As Char In strToProcess.ToCharArray
        genList.Add(ch)
    Next

    Dim dummy As New System.Text.StringBuilder()
    For i As Integer = 0 To genList.Count - 1
        dummy.Append(genList(i))
    Next

End Sub

 Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
     Dim genList As New List(Of Char)

     For Each ch As Char In strToProcess.ToCharArray
         genList.Add(ch)
     Next

     Dim dummy As New System.Text.StringBuilder()
     For i As Integer = 0 To genList.Count - 1
         dummy.Append(genList(i))
     Next
 End Sub

La única manera de saber con certeza es el perfil de su código mediante el uso de una herramienta como dotTrace.

http://www.jetbrains.com/profiler/

Es posible que en el boxing/unboxing es trivial en su aplicación en particular y no valdría la pena de refactorización.En adelante, usted debe considerar el uso de medicamentos genéricos, debido a que el tipo en tiempo de compilación de seguridad.

Los medicamentos genéricos, ya sea en Java o .NET, debe ser utilizado para el diseño y el tipo de seguridad, no para el rendimiento.Autoboxing es diferente de la de los genéricos (esencialmente implícito de objetos primitivos y conversiones), y como usted ha mencionado, NO se debe utilizar en lugar de una primitiva si hay mucho de aritmética u otras operaciones que va a causar un impacto en el rendimiento de los repetidos implícita objeto de creación/destrucción.

En general me gustaría sugerir el uso de ir hacia adelante, y sólo la actualización de código existente si se necesita ser limpiado para el tipo de seguridad / propósitos de diseño, no el rendimiento.

Depende, la mejor respuesta es el perfil de su código y ver.Me gusta AQTime pero un número de paquetes existen para esto.

En general, si un objeto ArrayList se utiliza una gran cantidad puede ser vale la pena cambiar a una versión genérica.Aunque realmente, lo más probable es que ni siquiera sería capaz de medir la diferencia de rendimiento.Boxing y unboxing son medidas adicionales, pero las computadoras modernas son tan rápido que casi no hace diferencia.Como un ArrayList es en realidad una matriz normal con un bonito envoltorio, probablemente verá mucho más el rendimiento obtenido a partir de una mejor estructura de datos de selección (ArrayList.Quitar es O(n)!) que con la conversión de los medicamentos genéricos.

Editar:Outlaw Programador tiene un buen punto, usted todavía será boxing y unboxing con medicamentos genéricos, lo que ocurre de forma implícita.Todo el código que hay en torno a la comprobación de las excepciones y los nulos de fundición y "es/as" de palabras clave podría ayudar un poco, sin embargo.

Las mayores ganancias, se encuentra en fases de Mantenimiento.Los medicamentos genéricos son mucho más fáciles de tratar y actualización, sin tener que lidiar con la conversión y de la fundición de problemas.Si este es el código que continuamente visitan, entonces por todos los medios el esfuerzo.Si este es el código que no ha sido tocado en años, yo no lo que realmente molesta.

¿Qué autoboxing/unboxing tienen que ver con los medicamentos genéricos?Esto es sólo un tipo de problema de seguridad.Con una colección no genérica, se requiere explícitamente la espalda a un objeto del tipo real.Con los medicamentos genéricos, usted puede saltarse este paso.Yo no creo que hay una diferencia de rendimiento de una forma u otra.

Mi antigua empresa considera, de hecho, este problema.El enfoque que utilizamos fue:si es fácil para refactorizar hacerlo;si no (es decir,va a tocar demasiadas clases), dejarlo para un momento posterior.Realmente depende de si o no usted tiene el tiempo para hacerlo, o si hay elementos más importantes a ser la codificación (es decir,características que se deben implementar para los clientes).

Entonces de nuevo, si no estás trabajando en algo para un cliente, seguir adelante y pasar tiempo de refactorización.Podrá mejorar la legibilidad del código por ti mismo.

Depende de cuánto hay en tu código.Si la unión o de la pantalla grande en las listas de IU, probablemente verá una gran ganancia en el rendimiento.

Si tu ArrayList son simplemente espolvoreado sobre aquí y allá, entonces probablemente no será un gran problema para simplemente limpiarla, pero tampoco impacto en el rendimiento general muy mucho.

Si usted está usando un montón de ArrayLists todo el código y sería un gran untertaking para reemplazarlos (algo que puede afectar a sus horarios), entonces usted podría adoptar una si-te-toca-que-cambiar-enfoque.

Lo principal es, sin embargo, que los medicamentos Genéricos son mucho más fáciles de leer, y son más estables a través de la aplicación debido a la fuerte tipificación se obtiene de ellos.Verás que no sólo ganancias de rendimiento, pero a partir de un código el mantenimiento y la estabilidad.Si usted puede hacerlo de forma rápida, yo diría que hacerlo.

Si usted puede obtener la aceptación del Propietario del Producto, yo recomiendo entrar limpiarla.Que el amor de su código más después.

Si las entidades en el ArrayLists son los tipos de Objeto, podrás obtener un poco de no presentarlos al tipo correcto.Si son tipos de Valor (structs o primitivas como Int32), a continuación, en el boxing/unboxing proceso añade un montón de sobrecarga, y las colecciones Genéricas debe ser mucho más rápido.

He aquí un artículo de MSDN sobre el tema

Los medicamentos genéricos tiene mucho mejor rendimiento, especialmente si usted va a utilizar el valor de tipo (int, bool, estructura, etc.) donde podrás obtener un noticeble ganancia de rendimiento.

  1. Usar Arraylist con valor-tipos de causas boxing/unboxing que, si se hace varios cientos de veces es substantialy más lento que el uso de la Lista genérica.

  2. cuando el almacenamiento de valor-los tipos de objeto que va hasta cuatro de memoria de tiempo de cada elemento.Mientras que esta cantidad no se agotará la RAM la memoria caché, que es más pequeño podría contienen menos elementos, lo que significa que mientras que recorrer un largo colecciones habría muchas copias de la memoria principal a la memoria caché, que retrasaría su aplicación.

Escribí acerca de aquí.

El uso de medicamentos genéricos debe también significa que su código será más simple y fácil de usar si desea aprovechar las cosas como linq en las últimas versiones c#.

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