2010-08-21 18 views
6

Hay ciertas funciones de biblioteca comunes en erlang que son mucho más lentas que su equivalente c.Erlang - C y Erlang

¿Es posible hacer que el código c haga el análisis binario y el crujido numérico, y que los procesos de generación de erlang ejecuten el código c?

+1

digna edición de la pregunta: P – Drew

+1

@Drew Mucho más organizado y conciso estos días. Obtener un título de ingeniería astronómica ayuda. – BAR

Respuesta

4

Por supuesto, C sería más rápido, en el caso extremo, después de las optimizaciones. Si por más rápido quieres decir más rápido para correr.

Erlang sería mucho más rápido para escribir. Dependiendo de los requisitos de velocidad que tenga, Erlang es probablemente "lo suficientemente rápido", y le ahorrará días de búsqueda de errores en C.

El código C solo será más rápido después de las optimizaciones. Si pasas la misma cantidad de tiempo en C y Erlang, saldrás con la misma velocidad (ten en cuenta que cuento el tiempo invertido en la depuración y la corrección de errores en esta estimación de tiempo. Lo cual será mucho menos en Erlang).

Así:

faster writing = Erlang 
faster running (after optimisations) = C 
faster running without optimisations = any of the two 

una serie de opciones.

+1

luna: Creo que tienes una imagen excesivamente optimista de erlang. Erlang se interpreta y se ejecuta mucho más lento que C. Es más fácil usar múltiples núcleos, y por lo tanto escala mejor que un programa ingenuamente escrito en c. Sin embargo, para el cálculo básico de números, simplemente haz girar los hilos X en C y superarás a Erlang en cualquier momento. Optimizado o no. Para números: http://shootout.alioth.debian.org/u64/benchmark.php?test=all&lang=hipe&lang2=gcc – Toad

+0

Como dije. Gaste la misma cantidad de tiempo de desarrollador en la tarea. Incluya el tiempo de depuración en eso y creo que a Erlang le iría bastante bien. No porque Erlang sea rápido (no lo es), sino porque C tarda en escribir y depurar. Especialmente si se usan hilos y concurrencia. –

+0

No me sorprendería si usted está en lo correcto ... –

1

Antes que nada, escriba toda la lógica del sistema en Erlang, luego implemente los archivos binarios en C. El uso de NIF (es una especie de interfaz para C) es bastante sencillo y transparente para el resto del sistema. Aquí hay otro hilo sobre cómo hablar con C Run C Code Block in Erlang.

Antes de hackear C, asegúrese de comparar la implementación actual. Es posible que satisfaga sus necesidades, especialmente con la última versión Erlang/OTP (R14) que introduce grandes mejoras en el manejo binario.

1

easy threading no es tan interesante para erlang. Enhebrado fácil + Transmisión de mensajes y el marco OTP es lo mejor de erlang. Si necesitas un número de crujidos usa algo como ocaml, python, haskell. Erlang es muy bueno en el cálculo numérico.

El binario de análisis es una de las cosas en las que es mejor erlang, probablemente la mejor opción. La programación de libros de Joe, erlang, cubre todo muy bien y no es tan costosa. También habla sobre la integración del código C y da un ejemplo. la fuente está disponible a partir de la programación pragmática sin necesidad de comprar el libro, puede grep #include o algo así.

+1

"Erlang es muy bueno en el cálculo numérico". - ¿Supongo que quieres decir "no es"? –

0

Si te gusta Erlang, pero quieres la velocidad C, ¿por qué no ir a JOCAML. Es una extensión para OCAML (que es similar a Erlang, pero está cerca de C en términos de velocidad) diseñado para la revolución multinúcleo que está teniendo lugar en este momento. Me encanta (y sé más de 10 lenguajes de programación ...)

3

hay dos reglas del pulgar áspera sobre la base de Erlang FAQ:

  1. código que implica principalmente cálculo de números y procesamiento de datos se ejecutará alrededor de 10 veces más lento que un programa de C equivalente. Esto incluye casi todos los "micro benchmarks".

  2. Los grandes sistemas que pasan la mayor parte de su tiempo comunicándose con otros sistemas, recuperándose de fallas y tomando decisiones complejas ejecutan al menos tan rápido como los programas C equivalentes.

Sin embargo, hay algunas soluciones oficiales a la falta de procesamiento de números realización de Erlang:

La implementación de una función en C y cargar su código objeto en la máquina virtual Erlang para que sea como una función estándar de Erlang pero con rendimiento nativo.

Ejemplos: Evedis, Bitcask, ElevelDB

Una interfaz orientada a byte-desde la máquina virtual Erlang a los procesos del sistema operativo externos a través de descriptores de archivos de entrada y de salida estándar. La comunicación con este puerto es a través del mensaje que pasa desde el punto de vista de Erlang.

Un archivo de objeto C enlazada dinámicamente que se carga en la máquina virtual de Erlang y actúa como un puerto. La comunicación con este controlador de puerto es a través del mensaje que pasa desde el punto de vista de Erlang.

Ejemplos: OTP_Inet, ENanomsg, P1_TLS

simplemente puede promover su ejecución Erlang a un nodo distribuido. De esta forma, existe una especificación para implementar un tiempo de ejecución de Erlang en C y comunicarse con los nodos de Erlang con una sola interfaz.

Todas las soluciones antes mencionadas tienen sus propios pros y sus contras y deben usarse con extremo cuidado.

+0

Esta es, de lejos, la mejor respuesta. El resto de las respuestas son un jumbo mambo sobre el rendimiento y ... ¿por qué? Buen trabajo, señor. –

-2

Utilicé C más de 20 años. Estoy usando Erlang casi exclusivamente en los últimos años. C es más rápido de ejecutar por razones obvias. Hower, Erlang es lo suficientemente rápido para la mayoría de las cosas cuando lo haces bien. Además, escribir Erlang es mucho más rápido y divertido.

Para la pieza de algoritmo para la cual la velocidad del tiempo de ejecución es crítica, seguramente se puede escribir en C, que es el camino de Erlang BIF.

0

Sí,

Pero hay más de una manera de esto, hablando vagamente, algunos o todos de los cuales ya están en la lista.

Deberíamos preguntarnos:

  • son aquellos procedimientos realmente equivalentes (¿cómo la ErlangC y difieren)?
  • ¿Existe alguna forma mejor de escribir Erlang para esta tarea (otros procedimientos/bibliotecas o tipos de datos)?

Puede ser útil tener en cuenta esta publicación: Scaling & Speed with Erlang.