
visitas desde el 22/Sep/02
|
|
Trucos en .NET
|
| Última actualización: 4 de Marzo de 2008 |
|
|
Trucos de rendimiento para Visual Studio 2008
|
|
No
hay herramienta de desarrollo que no pueda ser optimizada en rendimiento. VS 2008
no es una excepción y lo mismo es válido para el tipo de aplicaciones que se pueden
construir con ella. Como todos tenemos que hacer demos en nuestras presentaciones
y queremos que funcionen lo más rápidamente posible, es interesante revisar algunos
de los trucos más relevantes desde dos puntos de vista: la herramienta misma, y
las aplicaciones que podemos construir con ella.
Además,
para que cada uno pueda indagar con más profundidad en cada tema de su interés y
por razones de espacio (porque sino esto sería un libro y no un artículo de la Cueva
del Desarrollo), añado recomendaciones en forma de enlaces para distintos escenarios
y características de optimización.
Bajo el punto de vista de VS 2008, he dado con algunos trucos interesantes:
Acerca de las condiciones de los discos duros: Scott Guthrie
sugiere algunos trucos curiosos en: "
Tip/Trick: Hard Drive Speed and Visual Studio Performance" y el Jefe de la
División de Desarrollo en MS-Redmond, Soma Somasegar, también añade los siguientes:
·
Reconstruir un proyecto Visual Basic y ejecutar el compilador en “background” es 3 veces
más rápido y utiliza un tercio de memoria menos. Más datos sobre esto
aquí.
Recorrer ficheros grandes en C# con el Editor es 100% más rápido que antes, mientras
que teclear texto nuevo es 50% más rápido.
El tiempo de respuesta de Intellisense con tipos grandes en C# es 10 veces
más rápido que antes
La compilación incremental se realiza 90% más rápido en soluciones C++/CLI que anteriormente.
Más datos sobre esto en este
enlace
Los ficheros de Office Word y Excel, se procesan 20 veces más rápido en el servidor.
El proceso de comandos del control de versión de Team Foundation Server ha sido
reescrito para soportar operaciones sin límite de carga en los comandos principales
y sin depender de la memoria disponible en el servidor. En las pruebas, los comandos
se ejecutaban del 10% al 60% más rápido, con las mejoras más notables asociadas
con los proyectos más grandes. Puede leerse más acerca de las mejoras en escalabilidad
del TFS
aquí y
aquí
También
existen mejoras de rendimiento que explotan el hardware “multi-core”, por ejemplo
el soporte multi-hilo añadido a MSBuild. Además, utilizando el switch
/MP switch,
puede mejorarse significativamente el tiempo de compilación en proyectos C++ -ellos
afirman que se botienen rendimientos de mejora del 30% en la construcción de un
Front-End C++ cuando se dispone de este tipo de hardware dual-core. Otras mejoras
siginificativas del rendimiento afectan al runtime de NET 3.5 a la hora de gestionar
los hilos de ejecución del CLR en aplicaciones multi-hilo de todas clases.
Estos cambios arquitectónicos, cuando se combinan con los cambios en las API’s de sockets,
mejoran notablemente los procesos de entrada salida con sockets asíncronos, llegando
hasta un 70% con un procesador dual-core disponible. Las implicaciones de estas
mejoras en el rendimiento están disponibles
aquí.
Por otra parte, o sea, en la optimización de aplicaciones, existen numerosas referencias
de interés, dependiendo, otra vez, del tipo de aplicación que se quiere construir.
Uno de los mejores sitios sobre optimización de aplicaciones que he visto es el
sitio web dotnetslackers.com
en su página Performance.
Es una colección de enlaces, (incluyendo algunos
de los mencionados más arriba) sobre muchísimos trucos y técnicas de optimización.
|
-
El recolector de basura no reordena los objetos en memoria
:
Cuando el GC decide realizar una recolección no reorganiza los objetos activos
al estilo de un defragmentador de disco. Antes bien, lo que hace, es deslizar
los objetos a una ubicación conjunta para liberar espacio en el segmento actual
- El GC tiende a asignar memoria a partir del final de la -actualmente- utilizada:
Los objetos del montón (heap
) administrado, son empaquetados juntos, sin espacio libre entre ellos y las
ubicaciones consecutivas tienden a incrementar la dirección de memoria.
- Como corolario a lo anterior dos "casi-reglas" (siempre hay
excepciones):
-
Nunca llames a GC.Collect
()
-
No incluyas métodos Finalize() en tu código
- Cómo saber si el usuario de la aplicación está el en grupo de administradores:
Podemos utilizar el éste sencillo código:
- if (new
WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator))
-
{ Console.WriteLine("Soy Administrador"); }
Como recuperar la configuración de IIS después de una
desinstalación/reinstalación
Cuando se ha instalado .NET previamente a la instalación de IIS, las
aplicaciones se niegan a ejecutar indicando un mensaje del tipo No se puede
ejecutar el proyecto en modo compartido... La solución se basa en lo
siguiente:
Desde una línea de comandos, llamar a
"%windir%\Microsoft.NET\Framework\(version)\aspnet_regiis.exe" -i
En caso de que -además- fuese necesario el registro correcto del fichero que se
encarga de los filtros ISAPI (aspnet_isapi.dll), debe de registrarse
manualmente mediante:
REGSVR32 "%windir%\Microsoft.NET\Framework\(version)\aspnet_isapi.dll"
-
Como facilitar la edición de ficheros individuales con Visual Studio .NET
Un típico problema de las asociaciones de ficheros
es cuando abrimos un fichero aislado de cualquier lenguaje y se abre todo el
Visual Studio, con el tiempo que conlleva. Don Box,
ha publicado un truco directamente de los creadores, consistente en modificar
el registro para cada extensión que nos interese, y añadirle lo siguiente:
Hay que cambiar la clave original:
[HKEY_CLASSES_ROOT\VisualStudio.csfile.7.1\shell\Open.VisualStudio.7.1\command]
@="\"
C:\\...\\devenv.exe \
" /dde
por ésta:
En éste ejemplo está hecho para C#.
Afortunadamente, las posiciones de las extensiones en el Registro ocupan una
misma zona, si se editan con RegEdit.exe y resulta fácil localizarlas, a partir
de la primera.
-
Ejecutar instalación silenciosa de .NET a partir del fichero dotnetfx
(redistribuible)
Para el runtime redistribuible: dotnetfx.exe /q /c:"install.exe /q"
Para el .NET SDK completo: setup.exe /q /c:"install.exe /q"
-
Utilizar los estilos Visuales de Windows XP.
Se basa en el uso alternativo de la librería de sistema (NO redistribuible, y
por lo tanto, no utilizable en otros sistemas), CommCtrl32.DLL, versión 6.0.
Por defecto, tanto .NET como otras aplicaciones utilizan la versión anterior.
La forma de utilizar dichos estilos se basa en la inclusión de un fichero
.manifest en el directorio del ejecutable (o incorporado al mismo ejecutable),
y en algunas opciones de configuración (si los controles de esa librería
disponen de una propiedad FlatStyle, hay que seleccionar System, si no la parte
visual se asume automáticamente). En el sitio Web del Guille, tenéis
un extenso artículo sobre cómo utilizarlo en .NET, tanto en la versión
1.0, como en la 1.1, utilizando .manifest y también sin él.
Además de esto, el otro día
descubrí que se podían utilizar los estilos visuales directamente desde el
Visual Studio, o sea, viendo los estilos desde la propia ventana de diseño, si
añadimos simplemente el siguiente manifiesto ( devenv.exe.manifest.zip) al directorio donde reside el IDE de Visual
Studio (Devenv.exe). El efecto es inmediato, y facilita el diseño sin
tener que esperar a la ejecución para ver los estilos en funcionamiento:
PD: No obstante, hay que añadir que se han detectado comportamientos
anormales bajo alguna configuración concreta (en las versiones 1.0 y 1.1, no en la 2.0)
utilizando esto, especialmente al acceder a archivos de recursos.
El siguiente
documento,
es una publicación que recoge algunas de las mejores sugerencias para
migración.
| Trucos para Visual Studio .NET
|
-
Visual Studio actúa como un Editor de Recursos internos de cualquier
ejecutable:
En efecto, si arrastramos un
ejecutable a la ventana del Explorador de Soluciones de Visual Studio .NET (o
lo seleccionamos mediante "Añadir Referencia") y posteriormente hacemos doble
clic sobre él, el IDE lo "destripa", ofreciéndonos la posibilidad de editar sus
iconos, menús, tablas de recursos, e incluso su información de copyright, tal y
como se ve en la figura adjunta.
¡Ah! y si seleccionamos cualquiera de estos elementos podemos sustituirlos por
los equivalentes .NET que tengamos en la Caja de Herramientas..
-
Ventanas acoplables: Más que un truco es una característica
del entorno, pero es importante: Acostumbrarse a manejar el entorno de ventanas
acoplables nos puede dejar toneladas de espacio libre para el código fuente
(gracias a las marcas ).
También otro detalle se agradece: cuando hacemos doble clic en una de las
ventana acoplables se presenta en su totalidad en el centro de la pantalla
(útil en presentaciones y clases sobre todo), y un nuevo doble clic la devuelve
a la posición en que se encontraba.
-
Llamar a un documento editable o a una página ASP.NET o HTML directamente,
desde la línea de comandos: Visual Studio permite ser invocado
desde la línea de comandos mediante la opción ejecutar de Menú de Inicio,
pasándole como argumento una página HTML o ASP.NET. El IDE mostrará la página
en edición, sin pertenecer a ningún proyecto.
Ej: Menu Inicio/Ejecutar: devenv.exe <Path>\página.htm ó incluso
devenv.exe <Fichero.exe>...
Y cuando tenemos que hacer una presentación o clase, otra opción permite
seleccionar el tamaño del Tipo de Letra desde la línea de comandos. Por
ejemplo: devenv.exe /fs 14, selecciona tipo de letra de 14 puntos.
-
Abrir un ensamblado con otros editores: Examinador de Objetos, Editor
Binario, etc.
Podemos abrir un ensamblado con diferentes editores, incluso si estamos
trabajando en el proyecto al que pertenece: basta con seleccionar "Ver todos
los archivos" en la Ventana de Soluciones, y seleccionar el EXE/DLL com botón
derecho/ Abrir con... Nos saldrá una ventana con todos los editores que el
objeto admite: incluso podemos seleccionar otros objetos adicionales, como el
excelente visor de clases de Lutz Roeder. La ventana es la
siguiente:
-
El editor de código fuente es visualmente sensible a las directivas #debug
y #trace
Tampoco es un truco, sino una característica, pero está muy bien: Si usamos
esas directivas, el código fuente correspondiente que no se vaya a ejecutar se
pone en gris automáticamente. IntelliSense a tope...
-
El Cuadro de Herramientas como depósito de código: No sólo
podemos crear nuestras propias fichas en el Cuadro de Herramientas, sino que
funcionan como almacenadores de código. Si marcamos una sección de código y
posteriormente la arrastramos a nuestra ficha o a la General, queda almacenado
allí como elemento general de Visual Studio (para cualquier aplicación).
Posteriormente, doble clic sobre la entrada (que podemos llamar como queramos)
nos copiará el código fuente en el punto de inserción de código que tengamos
activo (y si existe código seleccionado, lo sustituye con el del depósito).
Todavía hay otra característica nueva: si en lugar de pegar con CTL-V lo
hacemos con CTL-SHIFT-V iremos recorriendo el Anillo del Portapapeles, a través
de todos los elementos copiados en secuencia...
-
CTL-S funciona en cualquiera de las ventanas de salida: output, debug, etc,
permitiendo guardar todo el contenido de la ventana en un fichero de texto.
ideal para salidas complejas y/o monitorización de procesos de
compilación.
-
La ventana de Asociar Procesos de Depuración, nos llevará
automáticamente al depurador nativo de cada clase (CLR, T-SQL, Script, etc.) si
en lugar de pulsar el botón asociar y luego seleccionar el depurador pulsamos
directamente CTL+Asociar.
-
Se puede acelerar la carga del IDE eliminado el navegador por defecto,
seleccionando en la Página de Inicio, Mi Perfil, y ahí, "Perfil Personalizado",
y "Mostrar entorno vacío". Si además cerramos las ventanas de la Ayuda en el
Explorador de Soluciones, el IDE entra como un tiro...
-
Haciendo doble clic sobre una solapa de edición de un fichero,
podemos dividir la ventana del editor en tantos grupos como queramos y mover
los elementos de un grupo a otro. Similar a Word, o Excel.
-
El fichero <Aplicacion>.config puede ser llevado automáticamente al
directorio de salida del compilador cambiando su nombre por el de
App.Config.
-
Existe una opción ideal para la depuración de aplicaciones Cliente/Servidor
que consiste en que podemos seleccionar dentro de una solución con más de un
proyecto, la opción "Establecer proyectos de Inicio" / "Proyectos de Inicio
Múltiples" indicando cómo deseamos al ejecución de cada uno de ellos. Al lanzar
la ejecución se lanzarán las dos aplicaciones.
-
Las combinaciones de teclas (Atajos) son siempre una gran
ayuda para los nerviosos (como yo), que preferimos, a veces, la rapidez del
teclado en vez de las búsquedas con el ratón. La siguiente es una buena lista
de combinaciones de teclas.
Atajos de teclado pertenecientes a Visual Studio .NET
|
Funcionalidad
|
Comando
|
Atajo 1
|
Atajo 2
|
|
Bookmark
|
Clear All
|
CTRL + K
|
CTRL + L
|
|
Bookmark
|
Toggle Bookmark
|
CTRL + K
|
CTRL + K
|
|
Bookmark
|
Next Bookmark
|
CTRL + K
|
CTRL + N
|
|
Bookmark
|
Previous Bookmark
|
CTRL + K
|
CTRL + P
|
|
Debug
|
Autos Window
|
CTRL + ALT + V
|
A
|
|
Debug
|
Break All
|
CTRL + ALT + Break
|
|
|
Debug
|
Breakpoints Window
|
CTRL + ALT + B
|
|
|
Debug
|
Call Stack Window
|
CTRL + ALT + C
|
|
|
Debug
|
Clear All Breakpoints
|
CTRL + SHIFT + F9
|
|
|
Debug
|
Immediate Window
|
CTRL + ALT + I
|
|
|
Debug
|
Locals Window
|
CTRL + ALT + V
|
L
|
|
Debug
|
Quick Watch
|
CTRL + ALT + Q
|
|
|
Debug
|
Restart
|
CTRL + SHIFT + F5
|
|
|
Debug
|
Run to Cursor
|
CTRL + F10
|
|
|
Debug
|
Set Next Statement
|
CTRL + SHIFT + F10
|
|
|
Debug
|
Start
|
F5
|
|
|
Debug
|
Start without debug
|
CTRL + F5
|
|
|
Debug
|
Toggle Breakpoint
|
F9
|
|
|
Debug
|
Lanza el compilador |
CTRL + SHIFT + B
|
|
|
Documents
|
Save All
|
CTRL + SHIFT + S
|
|
|
Find
|
IDE Combo
|
CTRL + D
|
|
|
Find
|
Incremental
|
CTRL + I
|
|
|
Find
|
Next Selected
|
CTRL + F3
|
|
|
Find
|
Previous Selected
|
CTRL + SHIFT + F3
|
|
|
Layout
|
Move (Grid)
|
??
|
|
|
Layout
|
Move (Pixel)
|
CTRL + ??
|
|
|
Layout
|
Size (Grid)
|
SHIFT + ??
|
|
|
Layout
|
Size (Pixel)
|
CTRL + SHIFT + ??
|
|
|
Outlining
|
Collapse to Definitions
|
CTRL + M
|
CTRL + O
|
|
Outlining
|
Hide Selection
|
CTRL+M
|
CTRL+H
|
|
Outlining
|
Unhide Selection
|
CTRL + M
|
CTRL + U
|
|
Outlining
|
Toggle All
|
CTRL + M
|
CTRL + L
|
|
Outlining
|
Toggle Current
|
CTRL + M
|
CTRL + M
|
|
Project
|
Add Existing Item
|
SHIFT + ALT + A
|
|
|
Project
|
Add New Item
|
CTRL + SHIFT + A
|
|
|
Project
|
New Project
|
CTRL + SHIFT + N
|
|
|
Project
|
Open Project
|
CTRL + SHIFT + O
|
|
|
Query
|
Run
|
CTRL + E
|
|
|
Query
|
Run Selected Text
|
CTRL + Q
|
|
|
Query
|
Step Into
|
ALT + F5
|
|
|
Text
|
Block Extend
|
SHIFT + ALT + ??
|
|
|
Text
|
Comment Selection
|
CTRL + K
|
CTRL + C
|
|
Text
|
Uncomment Selection
|
CTRL + K
|
CTRL + U
|
|
Text
|
Select Current Word
|
CTRL + W
|
|
|
Text
|
Cycle CB Ring
|
CTRL + SHIFT + V
|
|
|
Text
|
Format Document (tabs)
|
CTRL + K
|
CTRL + D
|
|
Text
|
Format Selection (tabs)
|
CTRL + K
|
CTRL + F
|
|
Text
|
Line Cut
|
CTRL + L
|
|
|
Text
|
Line Delete
|
CTRL + SHIFT + L
|
|
|
Text
|
Line Insert Above
|
CTRL + Enter
|
|
|
Text
|
Line Insert Below
|
CTRL + SHIFT + Enter
|
|
|
Text
|
Select to last Edit point
|
CTRL + =
|
|
|
Text
|
Toggle Word Wrap
|
CTRL + R
|
CTRL + R
|
|
Text
|
Scroll
|
CTRL + ?
|
|
|
Text
|
Transpose Characters
|
CTRL + T
|
|
|
Text
|
Transpose Lines
|
SHIFT + ALT + T
|
|
|
View
|
Code
|
F7
|
|
|
View
|
Designer
|
SHIFT + F7
|
|
|
View
|
Full Screen
|
SHIFT + ALT + Enter
|
|
|
Windows
|
Class View
|
CTRL + SHIFT + C
|
|
|
Windows
|
Command Window
|
CTRL + ALT + A
|
|
|
Windows
|
Debug - Autos
|
CTRL + ALT + V
|
A
|
|
Windows
|
Debug - Breakpoints
|
CTRL + ALT + B
|
|
|
Windows
|
Debug - Call Stack
|
CTRL + ALT + C
|
|
|
Windows
|
Debug - Immediate
|
CTRL + ALT + I
|
|
|
Windows
|
Debug - Locals
|
CTRL + ALT + V
|
L
|
|
Windows
|
Locals Window
|
CTRL + ALT + L
|
|
|
Windows
|
Object Browser
|
CTRL + ALT + J
|
|
|
Windows
|
Properties Window
|
F4
|
|
|
Windows
|
Server Explorer
|
CTRL + ALT + S
|
|
|
Windows
|
Task List
|
CTRL + ALT + K
|
|
|
Windows
|
Toolbox
|
CTRL + ALT + X
|
|
|
Novedades a Noviembre/2003 |
|
Text |
Seleccióna rectángulos de código (no líneas) |
ALT + DRAG |
|
|
Text
|
Navegación por código tipo I. Explorer |
CTRL + - |
(SHIFT + CTRL + -) |
El siguiente fichero contiene las definiciones de teclas como un complemento de
Visual Studio: KeyMap. Basta
con registrarlo como un servidor COM y la próxima vez que se abra Visual
Studio, en la Ayuda, tendremos el complemento disponible.
También podemos crear nuestras propias Listas
de Tareas (no sólo TODO, etc) en la opción Herramientas/Opciones/Lista de
Tareas, escribimos un nuevo nombre de tarea, le seleccionamos una prioridad y
pulsamos Agregar.
-
La ventana de Excepciones, nos permite definir como queremos tratar la
depuración de una Excepción determinada, independientemente de
cómo se trate el resto. En Depurar/Excepciones, podemos seleccionar o buscar la
excepción por su nombre o por parte de él y seleccionar el tratamiento
adecuado:
-
La lista completa de comandos en línea que acepta Visual Studio .NET
Puede obtenerse la lista de comandos completa que el fichero correspondiente al
IDE acepta. En una ventana del DOS tecleamos:
C:\> devenv /?
y el resultado es el siguiente:
Uso:
devenv [archivosolución | archivoproyecto | cualquierarchivo.ext]
[modificadores]
Puede invocar a devenv con un primer argumento para especificar un
archivo de solución o de proyecto. También puede invocar a devenv con un
primer argumento que puede ser cualquier tipo de archivo que sólo desee abrir
en un editor. Si proporciona un archivo de proyecto, el IDE lo abre en
el contexto de una solución buscando un archivo
.sln con el mismo nombre base que el archivo de proyecto y en el
directorio primario desde el archivo de proyecto. Si dicho archivo .sln no
existe, el IDE busca un único archivo .sln que haga referencia al
proyecto. Si no existe ese archivo .sln único, el IDE crea una solución
sin guardar con un nombre de archivo .sln predeterminado que tenga el mismo
nombre base que el archivo de proyecto.
Sintaxis de la línea de comandos:
devenv archivosoluciones.sln /build configuraciónsolución [ /project
nombreproyectooarchivo [ /projectconfig nombre ] ]
Modificadores de la línea de comandos disponibles:
/build genera la configuración de soluciones especificada
/project especifica el proyecto que desea generar en vez de la solución
debe especificar /build para usar /project
/projectconfig especifica la configuración del proyecto que desea
generar
debe especificar /project para utilizar /projectconfig
/out guarda los resultados de la generación en un archivo especificado
/rebuild igual que /build pero, previamente, realiza una limpieza
/clean limpia los resultados de la generación
/deploy genera la configuración de soluciones especificada y, a
continuación, la implementa
/run ejecuta la configuración de soluciones especificada
/runexit ejecuta la configuración de soluciones especificada y, a
continuación, finaliza
/command ejecuta la línea de comandos interna especificada después del
inicio
/mditabs utiliza la organización por fichas
/mdi utiliza la interfaz MDI
/fn utiliza el nombre de fuente especificado
/fs utiliza el tamaño de fuente especificado
/LCID utiliza el id. de idioma especificado
/noVSIP deshabilita la clave de licencia de programadores de VSIP para
las pruebas de VSIP
/safemode sólo carga el entorno y servicios predeterminados para una
mayor estabilidad
/resetskippkgs permite una nueva carga de VsPackages cuando ya se han
producido errores
en la carga
Modificadores específicos del producto:
/debugexe Abrir el archivo ejecutable especificado que se va a depurar.
El resto de la línea de comandos se pasa a este
archivo ejecutable como sus argumentos.
/useenv Utilizar las variables de entorno PATH, INCLUDE, LIBPATH y LIB
en lugar de las rutas de acceso IDE para generaciones de VC++.
Para asociar el depurador desde la línea de comandos, utilice:
vs7jit.exe -p
|
|


Grab this badge here!
|