¿Qué es un software eficiente? Un software eficiente no sólo debería ejecutarse más rápido que el software que realiza la misma función, sino que también debería consumir menos recursos del sistema. Este artículo reúne parte de la experiencia acumulada por el autor al usar VB para el desarrollo de software y utiliza algunos ejemplos simples para mostrarle cómo escribir código VB eficiente. Contiene algunas técnicas que pueden resultar muy útiles para los programadores de VB. Antes de comenzar, permítanme aclarar algunos conceptos.
Deje que el código tome forma de inmediato: entre los programadores con los que he entrado en contacto, a muchas personas les gusta escribir el código primero de acuerdo con los requisitos funcionales y luego optimizar el código sobre esta base. Al final, descubrieron que para lograr la optimización, tenían que reescribir el código. Por eso le sugiero que considere los problemas de optimización antes de escribir código.
Comprenda la relación entre los resultados de la optimización y el trabajo requerido: normalmente, cuando se completa un fragmento de código, es necesario inspeccionarlo y modificarlo. En el proceso de inspección del código, es posible que descubra que la eficiencia del código en algunos bucles se puede mejorar aún más. En este caso, muchos programadores que buscan la perfección pueden modificar el código inmediatamente. Mi sugerencia es que si cambiar este código acorta el tiempo de ejecución del programa en un segundo, puedes cambiarlo. Si sólo puede lograr una mejora del rendimiento de 10 milisegundos, no se realizarán cambios. Esto se debe a que reescribir un fragmento de código inevitablemente introducirá nuevos errores y depurar código nuevo definitivamente le llevará una cierta cantidad de tiempo. Los programadores deben encontrar un equilibrio entre el rendimiento del software y la cantidad de trabajo necesario para desarrollarlo, y 10 milisegundos es una diferencia que los usuarios no pueden apreciar.
Intente utilizar métodos orientados a objetos cuando los necesite; el mecanismo proporcionado por VB no es totalmente compatible con el diseño y la codificación orientados a objetos, pero VB proporciona clases simples. La mayoría de la gente cree que el uso de objetos dará como resultado un código menos eficiente. Personalmente tengo opiniones diferentes sobre este punto; la eficiencia del código no se puede evaluar únicamente desde la perspectiva de la velocidad de ejecución. Los recursos ocupados por el software también son uno de los factores a considerar. El uso de clases puede ayudarle a mejorar el rendimiento general de su software, lo cual explicaré en detalle en ejemplos posteriores.
Cuando escriba código VB, espero que pueda utilizar los puntos anteriores como principios para guiar su codificación. Dividí el artículo en dos partes: cómo mejorar la velocidad de ejecución del código y optimización de la compilación.
Cómo hacer que tu código se ejecute más rápido
Los siguientes métodos pueden ayudarle a mejorar la velocidad de su código:
1. Utilice números enteros (Integer) y enteros largos (Long)
La forma más sencilla de hacer que su código se ejecute más rápido es utilizar los tipos de datos correctos. Puede que no lo creas, pero elegir el tipo de datos correcto puede mejorar enormemente el rendimiento de tu código. En la mayoría de los casos, los programadores pueden reemplazar las variables de tipo simple, doble y moneda con variables de tipo entero o largo, porque la capacidad de VB para manejar enteros y largos es mucho mayor que la de otros tipos de datos.
En la mayoría de los casos, la razón por la que los programadores eligen usar Single o Double es por su capacidad para guardar decimales. Pero los decimales también se pueden almacenar en variables de tipo Integer. Por ejemplo, si hay tres decimales acordados en el programa, entonces solo necesita dividir el valor almacenado en la variable Entero por 1000 para obtener el resultado. En mi experiencia, el código puede ejecutarse casi 10 veces más rápido usando Integer y Long en lugar de Single, Double y Currency.
2. Evite el uso de variantes
Para un programador de VB, esto es obvio. Las variables de tipos variantes requieren 16 bytes de espacio para almacenar datos, mientras que un número entero (Entero) solo requiere 2 bytes. Por lo general, el propósito de usar tipos variantes es reducir la carga de trabajo de diseño y la cantidad de código. Algunos programadores también lo usan para evitar problemas. Pero si un software está estrictamente diseñado y codificado según las especificaciones, se puede evitar por completo el uso de tipos variantes.
Por cierto, el mismo problema también existe para los objetos Object. Por favor mire el código a continuación:
mFSO
SetFSO=NuevoScripting.FileSystemObject
o
DimFSO como objeto
SetFSO=NuevoScripting.FileSystemObject
Dado que el código anterior no especifica el tipo de datos al declarar, se desperdiciará memoria y tiempo de CPU durante la asignación. El código correcto debería verse así:
DimFSOasNewFileSystemObjeto
3. Intenta evitar el uso de atributos.
En el código diario, el código ineficiente más común es usar propiedades repetidamente cuando se pueden usar variables, especialmente en bucles. Debes saber que la velocidad de acceso a las variables es aproximadamente 20 veces mayor que la de acceso a los atributos. Muchos programadores utilizan el siguiente código en sus programas:
DimintConasEntero
ForintCon=0toUbound(SomVar())
Texto1.Texto=Texto1.Texto&vbcrlf&SomeVar(intCon)
SiguienteintCon
El siguiente código se ejecuta 20 veces más rápido que el código anterior.
DimintConasEntero
DimsOutputasString
ForintCon=0toUbound(AlgunaVar())
sSalida=sSalida&vbCrlf&
AlgunaVar(intCon)
Próximo
Texto1.Texto=sSalida
4. Intente utilizar matrices y evite el uso de conjuntos.
A menos que debas usar una colección, siempre debes usar una matriz. Según las pruebas, la velocidad de acceso de las matrices puede alcanzar 100 veces la de las colecciones. Este número suena un poco impactante, pero si consideras que una colección es un objeto, entenderás por qué la diferencia es tan grande.
5. Expanda el cuerpo del bucle pequeño.
Al codificar, puede encontrarse con esta situación: el cuerpo de un bucle solo se repetirá 2 o 3 veces y el cuerpo del bucle consta de varias líneas de código. En este caso, puedes desenrollar el bucle. La razón es que el bucle consume tiempo adicional de CPU. Pero si el bucle es más complejo, no es necesario hacer esto.
6. Evite utilizar funciones muy cortas
Al igual que con el uso de bucles pequeños, no es económico llamar a una función con solo unas pocas líneas de código; llamar a la función puede llevar más tiempo que ejecutar el código en la función. En este caso, puede copiar el código de la función al lugar donde se llamó originalmente la función.
7. Reducir las referencias a subobjetos.
En VB, las referencias a objetos se implementan usando . Por ejemplo:
Formulario1.Texto1.Texto
En el ejemplo anterior, el programa hace referencia a dos objetos: Formulario1 y Texto1. Cotizar utilizando este método es ineficaz. Pero lamentablemente no hay forma de evitarlo. Lo único que puede hacer el programador es usar With o guardar el objeto hijo (Texto1) con otro objeto.
Nota: Usar con
WithfrmMain.Text1
.Text="AprenderVB"
.Alineación=0
.Tag="Esmivida"
.BackColor=vbNegro
.ForeColor=vbBlanco
terminar con
o
Nota: Utilice otro objeto para guardar el objeto secundario.
DimtxtTextBoxasTextBox
SettxtTextBox=frmMain.Text1
TxtTextBox.Text="AprenderVB"
TxtTextBox.Alineación=0
TxtTextBox.Tag="Es mi vida"
TxtTextBox.BackColor=vbNegro
TxtTextBox.ForeColor=vbBlanco
Tenga en cuenta que el método mencionado anteriormente solo es aplicable cuando necesita operar en subobjetos de un objeto. El siguiente código es incorrecto:
ConTexto1
.Text="AprenderVB"
.Alineación=0
.Tag="Esmivida"
.BackColor=vbNegro
.ForeColor=vbBlanco
terminar con
Desafortunadamente, a menudo podemos encontrar código similar al anterior en el código real. Hacerlo sólo hará que el código se ejecute más lentamente. La razón es que el bloque With formará una rama después de la compilación, lo que agregará trabajo de procesamiento adicional.
8. Compruebe si la cadena está vacía.
La mayoría de los programadores utilizan el siguiente método para comprobar si una cadena está vacía:
IfText1.Text=""entonces
Nota: realizar una acción
endif
Desafortunadamente, hacer comparaciones de cadenas requiere incluso más procesamiento que leer propiedades. Por lo tanto te sugiero que utilices el siguiente método:
SiLen(Texto1.Texto)=0entonces
Nota: realizar una acción
endif
9. Nombre de la variable después de eliminar la palabra clave Siguiente
Agregar el nombre de la variable después de la palabra clave Siguiente hará que la eficiencia del código disminuya. No sé por qué sucede esto, es sólo una experiencia. Pero creo que muy pocos programadores irían tan lejos como para agregar información superflua. Después de todo, la mayoría de los programadores son personas que aprecian las palabras como el oro.
Comentario: código incorrecto
ForiCount=1a10
Nota: realizar una acción
SiguienteiCount
Nota: código correcto
ForiCount=1a10
Nota: realizar una acción
Próximo
10. Utilice matrices en lugar de múltiples variables
Cuando tenga varias variables que contengan datos similares, considere reemplazarlas con una matriz. En VB, las matrices son una de las estructuras de datos más eficientes.
11. Utilice matrices dinámicas en lugar de matrices estáticas
El uso de matrices dinámicas no tendrá un gran impacto en la velocidad de ejecución del código, pero en algunos casos puede ahorrar muchos recursos.
12. Destruir objetos
No importa qué tipo de software esté escrito, los programadores deben considerar liberar el espacio de memoria ocupado por el software después de que el usuario decide finalizarlo. Pero desafortunadamente, a muchos programadores no parece importarles mucho esto. El enfoque correcto es destruir los objetos utilizados en el programa antes de salir del programa. Por ejemplo:
DimFSOasNewFileSystemObjeto
Nota: realizar una acción
Nota: Destruye el objeto.
EstablecerFSO=Nada
Para formularios, puede desinstalar:
DescargarfrmPrincipal
o
SetfrmMain=Nada
13. Cadenas de longitud variable y de longitud fija
Técnicamente hablando, las cadenas de longitud fija requieren menos tiempo y espacio de procesamiento que las cadenas de longitud variable. Sin embargo, la desventaja de las cadenas de longitud fija es que, en muchos casos, es necesario llamar a la función Trim para eliminar el carácter nulo al final de la cadena, lo que reducirá la eficiencia del código. Entonces, a menos que la longitud de la cadena no cambie, use cadenas de longitud variable.
14. Utilice módulos de clase en lugar de controles ActiveX
A menos que los controles ActiveX impliquen interfaces de usuario, intente utilizar objetos ligeros como clases. Hay una gran diferencia en eficiencia entre los dos.
15. Utilice objetos internos
Cuando se trata de utilizar controles ActiveX y DLL, a muchos programadores les gusta compilarlos y luego agregarlos al proyecto. Le aconsejaría que no haga esto porque conectarse a un objeto externo desde VB requiere mucha potencia de procesamiento de la CPU. Cada vez que llamas a un método o accedes a una propiedad, desperdicias muchos recursos del sistema. Si tiene el código fuente de un control ActiveX o DLL, conviértalos en objetos privados en el proyecto.
16. Reducir el número de módulos.
A algunas personas les gusta mantener funciones comunes en módulos y estoy de acuerdo con eso. Pero escribir sólo veinte o treinta líneas de código en un módulo es un poco ridículo. Si realmente no necesita un módulo, intente no usarlo. La razón de esto es que VB carga módulos en la memoria solo cuando se llaman funciones o variables en el módulo; estos módulos se descargan de la memoria cuando se cierra la aplicación VB. Si solo hay un módulo en el código, VB solo realizará una operación de carga, por lo que mejorará la eficiencia del código; por el contrario, si hay varios módulos en el código, VB realizará múltiples operaciones de carga y la eficiencia de; el código se reducirá.
17. Utilice matrices de objetos
Al diseñar interfaces de usuario, los programadores deberían intentar utilizar matrices de objetos para controles del mismo tipo. Puedes hacer un experimento: agrega 100 PictureBoxes a la ventana, cada uno con un nombre diferente, y ejecuta el programa. Luego cree un nuevo proyecto, agregue también 100 PictureBoxes a la ventana, pero esta vez use una matriz de objetos, ejecute el programa, puede notar la diferencia en el tiempo de carga de los dos programas.
18. Utilice el método Mover
Al cambiar la posición de un objeto, a algunos programadores les gusta usar las propiedades Ancho, Alto, Superior e Izquierda. Por ejemplo:
Imagen1.Ancho=100
Imagen1.Altura=100
Imagen1.Arriba=0
Imagen1.Izquierda=0
De hecho, esto es muy ineficiente, porque el programa modifica cuatro propiedades y, después de cada modificación, la ventana se volverá a dibujar. El enfoque correcto es utilizar el método Move:
Imagen1.Move0,0,100,100
19. Reducir el uso de imágenes
Las imágenes ocuparán mucha memoria y su procesamiento también consumirá muchos recursos de la CPU. En el software, si es posible, considere usar colores de fondo en lugar de imágenes; por supuesto, esta es solo la perspectiva de un técnico sobre este tema.
20. Utilice ActiveXDLL en lugar de controles ActiveX
Si el objeto ActiveX que está diseñando no implica una interfaz de usuario, utilice ActiveXDLL.
Optimización de la compilación
Muchos programadores de VB que he conocido nunca han usado opciones de compilación ni han intentado descubrir las diferencias entre las opciones. Echemos un vistazo al significado específico de cada opción.
1.Código P (pseudocódigo) y código nativo
Puede optar por compilar el software en código P o código nativo. La opción predeterminada es el código nativo. Entonces, ¿qué son el código P y el código nativo?
Código P: al ejecutar código en VB, VB primero compila el código en código P y luego interpreta y ejecuta el código P compilado. En un entorno compilado, usar este código es más rápido que el código nativo. Después de seleccionar P-Code, VB coloca el pseudocódigo en un archivo EXE al compilar.
Código nativo: el código nativo es una opción introducida solo después de VB6. Cuando se compila en un archivo EXE, el código nativo se ejecuta más rápido que el código P. Después de seleccionar el código nativo, VB utiliza instrucciones de la máquina para generar un archivo EXE al compilar.
Al compilar con código nativo, encuentro que a veces se introducen errores inexplicables. Mi código se ejecuta completamente correctamente en el entorno de compilación, pero el archivo EXE generado con la opción de código nativo no se ejecuta correctamente. Por lo general, esto sucede cuando se descarga una ventana o aparece una ventana de impresión. Resolví este problema agregando una declaración DoEvent al código. Por supuesto, la posibilidad de que esto suceda es muy rara. Quizás algunos programadores de VB nunca lo hayan encontrado, pero existe.
También hay varias opciones en código nativo:
a) Optimización de la velocidad del código: esta opción puede compilar un archivo ejecutable más rápido, pero el archivo ejecutable es más grande. Recomendado
b) Optimización del tamaño del código: esta opción puede compilar un archivo ejecutable más pequeño, pero no se recomienda a expensas de la velocidad.
c) Sin optimización: esta opción solo convierte el código P en código nativo sin ninguna optimización. Se puede utilizar al depurar código.
d) Optimizado para Pentium Pro: Aunque esta opción no es la opción predeterminada en el código nativo, normalmente uso esta opción. El programa ejecutable compilado con esta opción puede ejecutarse más rápido en máquinas PentiumPro y Pentium2 o superiores, pero será un poco más lento en máquinas más antiguas. Teniendo en cuenta que el uso de Pentium2 ya está desactualizado, se recomienda que todos utilicen esta opción.
e) Generar información de depuración simbólica: este elemento genera cierta información de depuración durante el proceso de compilación, lo que permite a los usuarios utilizar herramientas como Visual C++ para depurar el código compilado. El uso de esta opción genera un archivo .pdf que registra la información de la bandera en el archivo ejecutable. Esta opción es útil cuando el programa tiene funciones API o llamadas DLL.
2. Optimización avanzada
La configuración de Optimización avanzada puede ayudarte a mejorar la velocidad de tu software, pero a veces puede introducir algunos errores, por lo que te recomiendo que la uses con el mayor cuidado posible. Si hay cuerpos de bucle relativamente grandes u operaciones matemáticas complejas en el código, seleccionar ciertos elementos en la optimización avanzada mejorará en gran medida el rendimiento del código. Si utiliza funciones de optimización avanzadas, le recomiendo probar rigurosamente los archivos compilados.
a) No asumir ningún alias: puede mejorar la eficiencia de ejecución del código en el cuerpo del bucle, pero si el valor de la variable se cambia a través de la referencia de la variable, como llamar a un método, la referencia de la variable se utiliza como parámetro del método. y el valor de la variable se cambia en el método, se generará un error. Puede ser simplemente que el resultado devuelto sea incorrecto o puede ser un error grave que haga que el programa se interrumpa.
b) Cancelar la verificación de enlace de matriz, cancelar la verificación de desbordamiento de enteros y cancelar la verificación de errores de punto flotante: cuando el programa se está ejecutando, si se encuentran errores a través de estas comprobaciones, el código de manejo de errores manejará estos errores. Pero si se cancelan estas comprobaciones, el programa no podrá manejar un error. Debe utilizar estas opciones sólo si está seguro de que los errores anteriores no se producirán en su código. Mejorarán enormemente el rendimiento del software.
c) Permitir operaciones de punto flotante sin redondeo: seleccionar esta opción permite que el programa compilado procese operaciones de punto flotante más rápido. Su única desventaja es que puede generar resultados incorrectos al comparar dos números de coma flotante.
d) Cancelar la verificación de seguridad de PentiumFDIV: esta opción está configurada para algunos chips Pentium antiguos y ahora parece estar desactualizada