Pregunta

Cualquier pequeña procesamiento de base de datos puede ser fácilmente abordado por Python / Perl / ... guiones, que utiliza las bibliotecas y / o utilidades incluso desde el propio lenguaje. Sin embargo, cuando se trata de rendimiento, la gente tiende a extender la mano para los idiomas / C ++ / C de bajo nivel. La posibilidad de adaptar el código a las necesidades parece ser lo que hace que estas lenguas tan atractivo para bigdata - ya sea en relación con la gestión de memoria, el paralelismo, el acceso al disco, o incluso optimizaciones de bajo nivel (a través de construcciones de montaje a nivel de C / C ++).

Por supuesto, tales serie de beneficios no vendría sin un costo: la escritura del código, e incluso a veces reinventar la rueda , puede ser bastante caro / tedioso. Aunque hay un montón de librerías disponibles, la gente tiende a escribir el código por sí mismos cada vez que necesitan subvención rendimiento. Lo que desactiva afirmaciones de rendimiento del uso de las bibliotecas durante el procesamiento de grandes bases de datos?

Por ejemplo, considere una entreprise que se arrastra continuamente páginas web y analiza los datos recogidos. Para cada ventana deslizante, diferentes algoritmos de minería de datos se ejecutan en los datos extraídos. ¿Por qué los desarrolladores zanja fuera usando las bibliotecas / marcos disponibles (ya sea para el rastreo, el procesamiento de textos, y la minería de datos)? El uso de material ya aplicadas no sólo aliviar la carga de la codificación de todo el proceso, sino que también ahorrará mucho tiempo.

En un solo disparo

  • lo que hace que escribir el código por sí mismo un Garantía de rendimiento?
  • ¿por qué es arriesgada a depender de unos marcos / bibliotecas cuando se debe asegurar de alto rendimiento?
¿Fue útil?

Solución

Una vez hecho el juego volver a escribir una y otra vez a mí mismo (y sigue haciéndolo), mi reacción inmediata fue adaptabilidad .

Mientras que los marcos y las bibliotecas tienen un enorme arsenal de rutinas (posiblemente intertwinable) para tareas estándar, sus propiedades marco a menudo (siempre?) Desautoriza atajos. De hecho, la mayoría de los marcos tienen algún tipo de infraestructura alrededor del núcleo que se aplica una capa central de la funcionalidad básica. funcionalidad más específica hace uso de la capa de base y se coloca en una segunda capa alrededor del núcleo.

Ahora por atajos I significa ir directamente de una segunda rutina de capa a otra segunda rutina de capa sin necesidad de utilizar el núcleo. Ejemplo típico (de mi dominio) sería marcas de tiempo: Usted tiene una fuente de datos con marca de tiempo de algún tipo. Hasta ahora, el trabajo es simplemente para leer los datos por el cable y pasarlo al núcleo por lo que su otro código puede deleitarse en él.

Ahora su industria cambia el formato de hora predeterminado por una muy buena razón (en mi caso fueron de vez en cuando UNIX GPS). A menos que su marco es específica de la industria es muy poco probable que están dispuestos a cambiar la representación del núcleo de tiempo, por lo que terminan usando un marco que casi hace lo que quiere. Cada vez que acceda a sus datos hay que convertirlo a la industria en tiempo de formato en primer lugar, y cada vez que quiera modificó usted tiene que convertir de nuevo a lo que estime las centrales apropiado. No hay manera de que se puede entregar a los datos directamente de la fuente a un sumidero sin doble conversión.

Aquí es donde sus marcos hechos a mano a brillar, es sólo un cambio menor y que está de vuelta modelar el mundo real mientras que todos los otros marcos (no específicos de la industria) tendrá ahora una desventaja rendimiento.

Con el tiempo, la discrepancia entre el mundo real y el modelo va a sumar. Con un marco off-the-shelf que pronto iba a enfrentar a preguntas como: ¿Cómo puedo representar this en that o ¿cómo hacer que la rutina aceptar X / Y productos

.

Hasta el momento no se trataba de C / C ++. Pero si, por alguna razón, no se puede cambiar el marco, es decir, usted tiene que aguantar con doble conversión de los datos para ir de un extremo a otro, entonces lo que normalmente emplean algo que minimiza la sobrecarga adicional. En mi caso, un Tai-> UTC o UTC-> convertidor de TAI es mejor dejar a C cruda (o una FPGA). No hay ninguna elegancia posible, sin profunda estructura de datos inteligente que hace que el problema trivial. Es sólo una sentencia switch aburrido, y por qué no usar un lenguaje cuyos compiladores son buenos en la optimización exactamente eso?

Otros consejos

No creo que llegue a todos para C / C ++ cuando el rendimiento es un problema.

La ventaja de escribir código de bajo nivel está utilizando un menor número de ciclos de la CPU, o, a veces, menos memoria. Pero me gustaría tener en cuenta que los lenguajes de alto nivel pueden llamar a los lenguajes de nivel inferior, y hacer, para conseguir un poco de este valor. lenguajes Python y JVM pueden hacer esto.

El científico de datos utilizando, por ejemplo, scikit-learn en su escritorio está llamando ya muy optimizado rutinas nativas para hacer el cálculo de números. No hay ningún punto en escribir nuevo código para la velocidad.

En el contexto distribuida "grandes datos", que son más típicamente cuello de botella en el movimiento de datos: transferencia de la red y E / S. código nativo no ayuda. Lo que ayuda no está escribiendo el mismo código para correr más rápido, pero la escritura de código más inteligente.

lenguajes de alto nivel se va a permitirle implementar algoritmos más sofisticados distribuidos en una determinada cantidad de tiempo de desarrollo de C / C ++. A escala, el algoritmo inteligente con un mejor movimiento de datos le ganará a código nativo mudo.

También es generalmente cierto que el tiempo desarrollador, y los insectos, las cargas de costos más nuevo hardware. Un año de tiempo de un programador senior podría ser de $ 200K a plena carga; más de un año que también alquila cientos de servidores valor de tiempo de cálculo. Simplemente no puede tener sentido en la mayoría de los casos molestar a la optimización de más de tirar más hardware en ella.

No entiendo el seguimiento de "concesión" y "desactivar" y "afirmar"?

Como todos sabemos, en el mundo digital hay muchas maneras de hacer el mismo trabajo / obtener los resultados esperados ..

y responsabilidades / riesgos que viene del código son sobre los hombros de los desarrolladores ..

Este es pequeña, pero supongo que un ejemplo muy útil de .NET mundo ..

Así Muchos desarrolladores .NET utilizan el built-in BinaryReader - Control BinaryWriter en su serialización de datos para el funcionamiento / superar el proceso ..

Este es CSharp código fuente de la clase construida en uno de BinaryWriter el marco de los métodos de escritura sobrecargados:

// Writes a boolean to this stream. A single byte is written to the stream
// with the value 0 representing false or the value 1 representing true.
// 
public virtual void Write(bool value) 
{
     //_buffer is a byte array which declared in ctor / init codes of the class
    _buffer = ((byte) (value? 1:0));

    //OutStream is the stream instance which BinaryWriter Writes the value(s) into it.
    OutStream.WriteByte(_buffer[0]);
}

Como se ve, este método podría escribirse sin la asignación adicional para _buffer variables:

public virtual void Write(bool value) 
{
    OutStream.WriteByte((byte) (value ? 1 : 0));
}

Sin asignar podríamos ganar unos pocos milisegundos milliseconds..This pueden aceptar como "casi nada", pero lo que si hay múltiples miles de escritura (es decir, en un proceso de servidor)?

Le permite suponer que "pocos" es de 2 (milisegundos) y multi-Miles casos sólo son 2.000 .. Este medio de 4 segundos más procesos time..4 segundos después de regresar ..

Si continuamos objeto de .NET y si se puede comprobar los códigos fuente de BCL - .NET Base Class Library of a partir de MSDN se puede ver una gran cantidad de losts rendimiento del desarrollador decide ..

Cualquiera de los puntos de la fuente BCL Es normal que se ve desarrollador decidió utilizar while () o foreach () bucles que podrían poner en práctica un bucle más rápido para () en su código.

Este pequeño ganancias nos dan el rendimiento total del ..

Y si volvemos a la BinaryWriter.Write () Método ..

En realidad extra de asignar a una aplicación _buffer no es un fault..This desarrollador es decidir exactamente a "estancia en la caja fuerte"!

Supongamos que decidimos no utilizar _buffer y decidió aplicar el segundo method..If intentamos enviar miles multi-bytes a través de un cable (es decir, la carga / descarga de datos de un BLOB o CLOB) con el segundo método, se puede fracasamos comúnmente debido a la conexión lost..Cause tratamos de enviar todos los datos sin ninguna comprobación y el control pierde la conexión mechanism.When, tanto el servidor y el cliente nunca se sabe los datos enviados completado o no.

Si el desarrollador decide "estancia en la caja fuerte", entonces normalmente significa costos de rendimiento depende en práctica "estancia en la caja fuerte" mecanismo (s).

Sin embargo, si el desarrollador decide "llegar arriesgada, el rendimiento de ganancia" esto no es un fallo also..Till hay algunas discusiones acerca de "riesgo" de codificación.

Y como una pequeña nota:. Desarrolladores de bibliotecas comerciales siempre tratan de permanecer en el seguro porque no pueden saber dónde va a utilizar su código

Desde una perspectiva de los programadores, los marcos raramente objetivo de rendimiento como la más alta prioridad. Si la biblioteca va a ser ampliamente aprovechado las cosas que las personas susceptibles de valor más son la facilidad de uso, flexibilidad y fiabilidad.

El rendimiento se valora generalmente en bibliotecas secundarias competitivas. "Biblioteca X es mejor porque es más rápido." Incluso entonces con mucha frecuencia esas bibliotecas comercio fuera la solución más óptima para uno que puede ser aprovechada ampliamente.

Mediante el uso de cualquier marco que está tomando un riesgo inherente que existe una solución más rápida. Yo podría ir tan lejos como para decir que una solución más rápida, casi siempre existe.

Escribir algo por sí mismo no es una garantía de rendimiento, pero si usted sabe lo que está haciendo y tener un conjunto bastante limitado de requisitos que puede ayudar.

Un ejemplo podría ser JSON análisis. Hay un centenar de bibliotecas que hay para una variedad de idiomas que a su vez JSON en un objeto atribuibles y viceversa. Sé de una aplicación que lo hace todo en registros de la CPU. Es medible más rápido que todos los demás programas de análisis, pero también es muy limitada y que la limitación variará en base a lo que la CPU se está trabajando.

Es la tarea de construir un JSON-alta performant entorno específico analizador una idea buena? Me gustaría aprovechar una biblioteca respetado de 99 veces de cada 100. En aquella instancia independiente de unos pocos ciclos de CPU adicionales multiplicado por un millón de iteraciones haría que el tiempo de desarrollo de la pena.

Licenciado bajo: CC-BY-SA con atribución
scroll top