Pregunta

Tengo la intención de participar en el desarrollo de un código escrito en lenguaje C para el análisis de Monte Carlo de problemas complejos. imputando dicho códigos enormes arreglos de datos en la memoria para acelerar su rendimiento, por lo tanto, el autor del código ha elegido C en lugar de C ++ afirmando que uno puede hacer más rápido y más fiable (en relación con las pérdidas de memoria) con código C.

¿Está de acuerdo con eso? ¿Cuál sería su elección, si necesita almacenar 4-16 GB de arreglos de datos en la memoria durante el cálculo?

¿Fue útil?

Solución

Definitivamente C ++. Por defecto, no hay ninguna diferencia significativa entre los dos, y C ++ proporciona un par de cosas C no:

  1. constructores / destructores. Estos le permiten automatizar la mayoría de gestión de memoria, mejorando la fiabilidad.
  2. asignadores
  3. por clase. Estos le permiten optimizar la asignación en función de cómo los objetos particulares están diseñados y / o usado. Esto puede ser particularmente útil si se necesita un gran número de pequeños objetos (por poner un ejemplo obvio).

La conclusión es que en este sentido, C proporciona absolutamente ninguna posibilidad de una ventaja sobre C ++. En el peor de los casos, puede hacer exactamente las mismas cosas de la misma manera.

Otros consejos

Hay una característica de C99 que está ausente de C ++ y que potencialmente da ganancias significativas en la velocidad de código procesamiento de datos numéricos pesada, y que es restrict palabra clave. Si puede utilizar un compilador de C ++ que lo soporta, entonces usted tiene una herramienta adicional en el kit cuando se trata de la optimización. Es sólo una ganancia potencial, sin embargo: basta procesos en línea puede permitir que las mismas optimizaciones como restrict y más. También tiene nada que ver con la asignación de memoria.

Si el autor del código puede demostrar una diferencia de rendimiento entre el código C y C ++ asignar una matriz 4-16GB, entonces (a) Me sorprende, pero no está mal, hay una diferencia, y (b) el número de veces es el programa va a destinar este tipo de matrices grandes? ¿Es el programa de realidad va a gastar una cantidad significativa de su tiempo de asignación de memoria, o se pasa la mayor parte de su tiempo Acceso memoria y haciendo cálculos? Se necesita mucho tiempo para realmente lo cualquier cosa con una matriz de 4 GB, en comparación con el tiempo que tomó para asignar, y eso significa que debe estar preocupado por la representación de "nada", no el funcionamiento de la asignación . Velocistas importa mucho la rapidez con que se bajan los bloques. Los corredores de maratón, no tanto.

También hay que tener cuidado de cómo referencia. Usted debe estar comparando por ejemplo malloc(size) contra new char[size]. Si el resultado es malloc(size) contra new char[size]() entonces es una comparación injusta, ya que este último establece la memoria a 0 y el primero no lo hace. Compara contra calloc lugar, pero también señalan que malloc y calloc están ambos disponibles en C ++ en el caso (poco probable) que prueban mensurable más rápido.

En última instancia, sin embargo, si el autor es el "dueño" o inició el proyecto, y prefiere escribir en C en lugar de C ++, entonces no debe justificar esa decisión con demandas de rendimiento probablemente-espurias, debe justificarlo diciendo " yo prefiero C, y eso es lo que estoy usando". Por lo general, cuando alguien hace una afirmación como ésta sobre el desempeño de la lengua, y resulta que en las pruebas de no ser cierto, se descubre que el rendimiento no es la verdadera razón de la preferencia de idioma. La demostración de la falsa reclamación no causar realmente el autor de este proyecto para comenzar repentinamente gusto C ++.

No hay ninguna diferencia real entre C y C ++ en términos de asignación de memoria. C ++ tiene más datos 'ocultos', tales como punteros virtuales y así sucesivamente, si usted eligió tener métodos virtuales en sus objetos. Sin embargo, la asignación de un conjunto de caracteres es tan caro en C como en C ++, de hecho, son probablemente ambos usando malloc para hacerlo. En términos de rendimiento, C ++ llama a un constructor para cada objeto en la matriz. Tenga en cuenta que esto sólo se hace si hay uno, el constructor por defecto no hace nada y se optimiza de distancia.

Mientras que estés preasignar piscinas de datos, para evitar la fragmentación de memoria, que debe ser bueno para ir. Si tiene simples POD-estructuras sin métodos virtuales, y sin constructores, no hay diferencia.

La única cosa en la desaprobación de C ++ es su complejidad adicional - combinar eso con un programador que utiliza de manera incorrecta, y usted puede fácilmente ralentizar notablemente. El uso de un compilador de C ++ y sin características de C ++ le dará el mismo rendimiento. Usando C ++ correctamente, usted tiene algunas posisbilities a ser más rápido.

El idioma no es su problema , la asignación y atravesando grandes matrices es.

El principal error mortal que podría hacer en la asignación (en cualquier idioma) es la asignación de 16G de la memoria, inicializar a cero, sólo para llenarlo con valores reales más adelante.

La mayoría de las ganancias de rendimiento que cabe esperar de optimizaciones algorítmicas que mejoran la localidad de referencia.

Según el sistema operativo subyacente, es posible que también afectan algoritmos de caché - por ejemplo, lo que indica que una gama de memroy sólo se procesa secuencialmente.

Para la asignación de los datos en bruto, no debería haber una diferencia entre C y C ++ en la mayoría de los sistemas, ya que normalmente utilizan tanto los mismos mecanismos de la biblioteca de tiempo de ejecución. Me pregunto si esto era el escollo de referencia clásico en el que también midieron el tiempo de ejecución de las llamadas a constructores en C ++ y convenientemente olvidaron incluyendo el tiempo de ejecución de cualquier tipo de código de inicialización en C.

Además, el "más fiable (en relación con las pérdidas de memoria)" argumento no se sostiene el agua si está usando RAII en C ++ (como debería). A menos que alguien de referirse a lo que es más fugas fiable, utilizando RAII, punteros inteligentes y clases de contenedores reducirán el riesgo de fugas, no aumentarlo.

Mis principales preocupaciones con la asignación de la cantidad de memoria que sería doble:

  • Si estás acercando al límite de memoria física en las máquinas que está ejecutando la simulación de Monte Carlo en adelante, es una buena manera de disminuir el rendimiento porque el disco bien podría comenzar a agitarse cuando las necesidades del sistema de memoria virtual se inicie paginación mucho. La memoria virtual no es "libre" a pesar de que mucha gente piensa que es.
  • necesidades de diseño de datos que deben considerarse cuidadosamente para maximizar el uso de la caché del procesador, de lo contrario se perderá parcialmente los beneficios de mantener los datos en la memoria principal en el primer lugar.

Si la asignación de memoria es un cuello de botella en dicho código, sugeriría más bien el rediseño, no cambiar el lenguaje para la asignación más rápido. Si asigna memoria una vez y luego realizar una gran cantidad de cálculos que sería de esperar esos cálculos a ser un cuello de botella. Si el costo de la asignación es significativo, algo está mal aquí.

Puede utilizar la familia C de las funciones de asignación de memoria en C ++ también:. malloc tanto el estándar y free, realloc para ampliar / Shring matrices y alloca asignar memoria en la pila

Si vas con new, se asignará más memoria que se necesita (en su mayoría durante la depuración) y hacer chequeos adicionales para mantener la coherencia. También llamada al constructor de clases. En un comunicado (-O3) construir la diferencia será insignificante para la mayoría de aplicaciones.

Ahora lo que trae new malloc no es el new en el lugar. Puede asignar previamente un tampón y luego usar el new en el lugar para poner su estructura en la que la memoria intermedia, con lo que "la asignación" se instantáneo.

Con todo, yo no se mantenga alejado de C, debido a problemas de rendimiento. En todo caso, su código será más eficiente porque las clases pasan el puntero this en registros en lugar de parámetros como en el C equivalente. Una verdadera razón para permanecer lejos de C es el tamaño del tiempo de ejecución de C ++. Si desarrolla programas para sistemas empotrados o programas de arranque con carga, no se puede incrustar el tiempo de ejecución ~ 4 Mb. Para aplicaciones normales sin embargo, esto no va a hacer la diferencia.

Si necesita almacenar 4-16 GB de arreglos de datos en la memoria durante el cálculo y su máquina solamente tiene 2 GB de memoria física, entonces, ¿qué?

¿Qué pasa si el equipo tiene 16 GB de memoria física? ¿El sistema operativo no ocupan memoria física?

¿El sistema operativo incluso le permite un espacio de direcciones de 4 GB, 16 GB, etc?

Sugiero que, si el rendimiento es una restricción de la aplicación principal, a continuación, la comprensión de cómo las plataformas, que están destinados a ser utilizados, la función y realizar son mucho más importantes que la cuestión de cualquier diferencia de rendimiento medible entre C y C ++ dado ambientes idénticos y algoritmos.

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