tdm para mac incluido dev descargar con compilador compila c++ performance mingw codeblocks

c++ - para - ¿Por qué MinGW es muy lento?



dev c++ (4)

Estoy usando el IDE de Code :: Blocks con GCC / MinGW en Windows, y estoy tratando de construir una aplicación wxWidgets que tenga ca. 20k líneas y 40 módulos fuente. Y construye muy muy lento.

La compilación de un módulo de C ++ dura entre 2 y 5 segundos, y la vinculación dura entre 2 y 3 minutos.

Es un código portátil, y este código se compila muy rápido en Linux. No puedo seguir la ventana de mensaje de compilación ... El proceso completo dura menos de 20 segundos.

Intenté los ajustes comunes (por ejemplo, encabezado precompilado, desactivar las optimizaciones, etc.), pero nada funcionó.

¿Por qué es tan lento?


¿Está en un dominio de Active Directory, pero no está conectado inmediatamente a él?

Si bien no tengo la "respuesta" de por qué MinGW sería lento, según mi experiencia, las computadoras que pertenecen a un dominio de AD, pero no pueden acceder al controlador de AD, tienen un retraso en el inicio de los ejecutables (como rxvt.exe) y los que se están ejecutando actualmente experimentan una pausa o tartamudeo (como emacs, que se construye utilizando MinGW).

Todavía estoy investigando para determinar la causa real de este comportamiento, pero pensé que lo mencionaría en caso de que se aplique a usted.


A partir de MSYS 1.0.19-1 , si la cuenta de usuario está en el dominio de Active Directory y no se puede acceder al controlador de dominio (DC), entonces la MSYS DLL introducirá una gran demora antes de iniciar cualquier archivo ejecutable de MSYS (que utiliza la MSYS DLL ). Esto afecta a MSYS make y a todas las utilidades de línea de comandos del paquete CoreUtils, como ls , rm , etc., que normalmente se instalan en C:/MinGW/msys/1.0/bin .

Observaciones:

  • Cuando se inician utilidades desde MSYS bash shell, solo el inicio de la shell se ve afectado por el retraso. Las utilidades lanzadas desde el shell no tienen impacto.

  • El retraso puede variar, en mi caso es de 21 seg.

  • La ejecución de cualquier utilidad de MSYS dentro de 10-20 segundos después del comando retrasado se iniciará sin un nuevo retraso.
  • El problema ocurre cuando la máquina está conectada a una red diferente, cuando está desconectada de su dominio o cuando cambia el nombre de host del controlador de dominio (problema en mi caso). Para verificar si se puede echo %LOGONSERVER% DC, abra cmd y escriba echo %LOGONSERVER% , luego echo %LOGONSERVER% ping o net view con el nombre de host del DC.

¿Por qué es tan lento?

  • El código de MSYS DLL en uinfo.cc internal_getlogin() realiza dos llamadas al sistema para obtener información del usuario. La primera vez que llama a NetUserGetInfo() para recuperar la cuenta de usuario de la máquina local. Falla para los usuarios del dominio, por lo que lo llama por segunda vez con el servidor de DC tomado de la variable LOGONSERVER . Si no se puede acceder de inmediato a este host, se introducirá un retraso prolongado hasta que la llamada falle en el tiempo de espera. La aplicación se iniciará poco después.

Cómo evitar este problema, varias soluciones:

  • Ejecuta todo desde el shell de MSYS, o
  • Si el motivo es el cambio en el nombre de host de DC, un reinicio o un nuevo inicio de sesión resolverá el problema. Windows actualizará automáticamente LOGONSERVER con el host DC correcto.
  • Si las herramientas de MSYS se llaman desde Windows cmd o un script, entonces configure LOGONSERVER en un LOGONSERVER local para evitar el acceso a la red. Por ejemplo, set LOGONSERVER=//LOCALHOST funcionó para mí. Nota: esta variable se establece en el inicio de sesión y cambiarla globalmente en la ventana Variables de entorno de Windows no tiene ningún efecto en comparación con la configuración en cmd o un script.
  • Considero que esto es un error en MinGW / MSYS. El código en MSYS2 y Cygwin es diferente. Revisé MSYS2 y no tiene tal problema.

Puede intentar usar una versión más reciente del conjunto de herramientas. Encontré que esto es útil: http://nuwen.net/mingw.html Tiene todas las herramientas utilizadas por MinGW y las API comunes en un solo paquete grande. Desde el sitio:

Mi distribución de MinGW ("distro") es x64-nativa y actualmente contiene GCC 6.1.0 y Boost 1.61.0.

MinGW es un puerto de GCC a Windows. Es gratuito y fácil de usar (bueno, tan simple como las cadenas de herramientas). Produce ejecutables de Windows independientes que pueden distribuirse de cualquier manera.


Muchas cosas "unixy" en MinGW son extremadamente lentas, porque Windows no tiene una fork() . Windows solo tiene CreateProcess() , que es bastante diferente. Las carcasas de Unix y GNU Make hacen un montón de bifurcaciones, por lo que ejecutarlas en MinGW da como resultado horquillas "emuladas", que son muy lentas.

Otra cosa que sufre de esto es GNU Autotools, por lo que la ejecución de ./configure scripts al crear aplicaciones "unixy" desde fuentes también es muy lenta. Esto puede ser realmente molesto si necesita hacerlo muchas veces (por ejemplo, cuando tiene problemas con la configuración para encontrar todas las bibliotecas).

Esta respuesta explica con más detalle cómo se utilizaron Cygwin y MinGW para simular fork() , y esta respuesta tiene una explicación más actualizada.