Hice una biblioteca GUI para juegos. Mi demostración de prueba se ejecuta a 60 fps. Cuando ejecuto esta demostración con la versión estática de mi biblioteca, toma 2-3% de CPU en taskmanager. Cuando uso la versión DLL, usa alrededor del 13-15%. ¿Eso es normal? Es así, ¿cómo podría optimizarlo? Ya le pido que use/O2 para la mayoría de las funciones en línea.¿Es un DLL más lento que un enlace estático?
Respuesta
No inicie su temporizador de rendimiento hasta que la DLL haya tenido la oportunidad de ejecutar su funcionalidad una vez. Esto le da tiempo de cargar en la memoria. Luego, inicie el temporizador y verifique el rendimiento. Básicamente, debería coincidir con la de la lib estática.
También tenga en cuenta que la ubicación de carga de la DLL puede afectar en gran medida la rapidez con que se carga. La dirección base predeterminada para las DLL es 0x400000. Si ya tiene otra DLL en esa ubicación, entonces el proceso de carga debe realizar un costoso paso de redireccionamiento que retrasará aún más el tiempo.
Si tiene un conflicto así, simplemente elija una dirección base diferente en Visual Studio.
+1 por mencionar problemas con la dirección base. –
El problema de la dirección base solo sería un problema en el tiempo de carga. –
Tendrá la sobrecarga de cargar la DLL (debería ser solo una vez al principio). No está enlazado estáticamente con llamadas directas, por lo que esperaría una pequeña cantidad de gastos generales, pero no mucho.
Sin embargo, algunos archivos DLL tendrán gastos generales mucho más altos. Estoy pensando en los objetos COM, aunque puede haber otros ejemplos. COM agrega mucha sobrecarga en llamadas a funciones entre objetos.
No está claro qué está vinculado estático/dinámicamente. ¿Está el DLL de tu librería enlazado estáticamente con sus dependencias? ¿Es posible que la DLL llame a otras DLL (que será lenta)? Tal vez intente ejecutar un generador de perfiles de valgrind en su ejecutable para determinar de dónde viene todo el uso de la CPU.
Si llama a las funciones DLL, no pueden ser inline para la persona que llama. Deberías pensar un poco sobre tus límites de DLL.
Puede ser que sea mejor para su aplicación tener un pequeño ejecutable bootstrap que simplemente ejecuta un bucle principal en su DLL. De esta manera puede evitar mucha sobrecarga para las llamadas a funciones.
- 1. ¿Es más lento que elsif?
- 2. Código de constructor estático funciona más lento
- 3. ¿File_get_contents es más lento que include?
- 4. ¿Por qué es más lento que contiene?
- 5. ¿El método estático es más rápido que el no estático?
- 6. Enlace a un archivo estático de Hamlet
- 7. SSE más lento que FPU?
- 8. Quicksort más lento que Mergesort?
- 9. ¿El monodroid es más lento?
- 10. ¿Es un programa C++ realmente más lento que un programa C similar?
- 11. Dividir un programa en 4 hilos es más lento que un solo hilo
- 12. ¿Por qué escribir en un MemoryStream es más lento que en un archivo?
- 13. Java: VolatileImage más lento que BufferedImage
- 14. ¿Qué es un dll?
- 15. Ventajas de enlace estático
- 16. ¿Drupal 7 es más lento que Drupal 6?
- 17. NHibernate Linq Query es 3 veces más lento que HQL
- 18. Es LINQ generalmente más lento que una instrucción SQL igual
- 19. programa OpenMP es más lento que uno secuencial
- 20. MATLAB parfor es más lento que para - ¿qué pasa?
- 21. ¿Por qué Octave es más lento que MATLAB?
- 22. Cassandra es mucho más lento que Mysql para operaciones simples?
- 23. ¿IntelliJ IDEA Ultimate es más lento que la edición Community?
- 24. Por qué <es más lento que> =
- 25. ¿Por qué el retorno anticipado es más lento que otro?
- 26. ClickOnce .appref-ms más que un enlace al archivo .application?
- 27. ¿Por qué el aplazamiento de EventMachine es más lento que un subproceso de Ruby?
- 28. python: Importación de un archivo que es un enlace simbólico
- 29. Aumentar el enlace estático
- 30. Ruby 1.9 más lento que Ruby 1.8?
¿Olvidó su contraseña? –
Debe hacer un perfil y ver dónde está la diferencia significativa. –
No hay motivo para perfil. Las conjeturas no informadas deberían ser suficientes para determinar dónde podría haber cuellos de botella en su aplicación. Diablos, ni siquiera necesitas mirar el código fuente. –