TStopWatch y cómo medir tiempos con alta precisión con Delphi

Las versiones modernas de Delphi cuentan con la unidad System.Diagnostics que implementa la clase TStopWatch, un cronómetro de alta precisión con el que podemos medir fácilmente el desempeño del código que escribimos, con soporte multiplataforma.

TStopWatch es un registro que tiene métodos para iniciar, pausar y resetear el cronómetro (muy similar a los botones que encontramos en el cronómetro de pulsera promedio).

Cuando digo alta precisión, hablamos de que la resolución del cronómetro suele estar en el orden de los nano-segundos o incluso fracciones de nanosegundo (esta puede variar de un procesador a otro). En mi equipo de desarrollo actual (Corei7 8va Generación/Windows 10), el menor tiempo que he podido medir es de 0.1 nanosegundos, la idea básica sería algo como:

procedure TForm3.Button1Click(Sender: TObject);
var
  SW: TStopwatch;
begin
  SW := TStopwatch.Create;
  SW.Start;
  SW.Stop;
  Memo1.Lines.Add(Format('Ticks: %d, Frequency: %d', [SW.ElapsedTicks, sw.Frequency]));
  Memo1.Lines.Add(SW.Elapsed.ToString);
end;

Ya con esta idea básica podemos medir, entonces, el tiempo que tarde cualquier fragmento de código, por ejemplo:

procedure TForm3.Button1Click(Sender: TObject);
var
  SW: TStopwatch;
  I, J: Integer;
begin
  J := 0;
  SW := TStopwatch.Create;
  SW.Start;
  for I := 1 to 1000000 do
    J := J + I;
  SW.Stop;
  Memo1.Lines.Add(Format('J: %d', [J]));
  Memo1.Lines.Add(Format('Ticks: %d, Frequency: %d, ms: %d, ns: %.6f', [SW.ElapsedTicks, sw.Frequency, SW.ElapsedMilliseconds, SW.ElapsedTicks/sw.Frequency*1000000]));
  Memo1.Lines.Add(SW.Elapsed.ToString);
end;
Resultados de la ejecución del código

Pensando como bibliotecarios, podemos declarar una función que se encargue de realizar la medición de cualquier código por nosotros, por ejemplo:

function MedirTiempoDe(Proc: TProc): TTimeSpan;
var
  SW: TStopwatch;
begin
  SW := TStopwatch.StartNew;
  Proc();
  SW.Stop;
  Result := SW.Elapsed;
end;

En una futura entrada veremos como crear una biblioteca de medición de tiempos robusta basados en TStopWatch.

Y de pronto es julio/2021

Siempre he sentido que el paso del tiempo es una de las mayores condicionantes de la vida. Mi última entrada en este blog data de diciembre de 2015 y no escribo con frecuencia desde mayo de 2014. Son 7 años; la vida ha cambiado drásticamente y, como suele suceder, quedan muchas reflexiones y aprendizajes en el camino.

Ahora estamos en el medio de una pandemia, difícilmente queda alguien que no ha perdido al menos un familiar, amigo o conocido a causa de ella y hay para quienes la vida ha cambiado radicalmente por lo mismo.

No me arrepiento de mis decisiones, sin embargo, hubiese preferido seguir escribiendo en aquel entonces. Pero no estamos para llorar por la leche derramada. Ahora, no tengo la misma disciplina para escribir que tuve antes, pero tengo el deseo de seguir intentando aportar algo a quienes amablemente se pasan por aquí y espero comenzar a hacerlo pronto.

Agradezco su visita y espero que nos leamos pronto, ojalá y con algunos temas de los usuales en esta bitácora.

Hasta entonces, deseo que se todo marche bien para ustedes.

¡Llegó StackOverflow en Español!

esSOSin lugar a dudas, hoy es un día emocionante para la comunidad de programadores de habla hispana. Oficialmente se abre la fase beta pública de StackOverflow en Español.

Ya que muchos de mis seguidores son programadores o de alguna manera están relacionados con el Software, paso por este espacio para invitarles al sitio.

Si han utilizado los viejos sistemas de foros en el pasado, encontrarán un ambiente familiar, y a la vez, si se quedan más de unos cuantos minutos y visitan el sitio unas cuantas veces, encontrarán una la plataforma –en mi humilde opinión– mucho más adecuada para realizar preguntas y respuestas sobre programación.

StackOverflow, sin embargo, no es la plataforma. StackOverflow es la comunidad, y nuestro legado es el contenido que esta comunidad genera, en forma de excelentes preguntas y excelentes respuestas. Esta comunidad será grandiosa –no lo dudo– en la medida en la que se unan a ella personas grandiosas, como tu, estimado lector.

Si vas más allá de lo técnico y además te gusta involucrarte en la comunidad, no olvides darte una vuelta por meta.es.stackoverflow.com.

¡Y pensar que todo empezó hace más de 3 años!

 

El programador “copiar y pegar”

Me gusta habitualmente aprender, reflexionar y aplicar a mi día a día buenas prácticas de programación, ya que indudablemente hacen que mi trabajo sea de mejor calidad en general, logrando productos de software más robustos, eficientes y, sobre todo, fáciles de mantener.

Parte del proceso de aplicar buenas prácticas es, sin duda, identificar las malas prácticas y sustituirlas por buenas. En esa línea de pensamiento, me gustaría hablar hoy del programador “copiar y pegar”.

Menú Copiar y pegar

 

Este programador es aquel chico o chica (muchas veces no tan chico o chica), que en el desarrollo de una tarea X, encuentra un trozo de tamaño arbitrario de código y, sin pensarlo mucho, presiona la temida combinación “ctrl+c”, “ctrl+v”, ajusta el nombre de 2 variables, compila y se va a casa creyendo haber realizado una buena y rápida tarea.

Comienzo aclarando que copiar y pegar no es, en si mismo, una mala práctica, pero encierra dos grandes riesgos:

Sigue leyendo

Código de ejemplo de la sesión de DataSnap en CodeRage América Latina 2014

CodeRage Latinoamérica 2014

En relación a mi presentación en el reciente CodeRage América Latina 2014, titulada:

Aplicaciones iOS y Android con soporte para arquitecturas Multi-capas utilizando DataSnap

Haciendo clic en el botón, puedes descargar el código del ejemplo que se desarrolló durante la misma
Sigue leyendo

Minientrada

Después de pensarlo durante algún tiempo, por fin me decidí a empezar un blog en Inglés, al que he nombrado jachguate’s blog. No abandonaré este, que sigue siendo mi espacio primario y mi intención es que, siempre que lo amerite, el contenido sea publicado en ambos idiomas, mientras que habrá algunos casos donde la audiencia sea distinta y por tanto publique solamente en alguno de ellos.

Mi objetivo no es, sin embargo, el de mantener una traducción de uno de los sitios en el otro, pues para eso ya el traductor de Google hace una decente tarea.

Lo veo más bien como una oportunidad para mejorar mi Inglés y, como lo dije en mi post de presentación ayer, con ello también alcanzar una audiencia distinta, en otros rincones del globo.

Si lees Inglés, te invito a dar una vuelta por allá.

Clase genérica para convertir una enumeración en cadena y viceversa

Una de las cosas que siempre olvido como hacer, y por lo mismo me toca hacer una búsqueda en Google para volver a escribir el código necesario, es como convertir una enumeración en un string y viceversa (EnumToStr, StrToEnum).

Esto es, primero, porque tradicionalmente hay que escribir una rutina distinta para cada tipo de enumeración que nos interesa, o peor aún, escribir una llamada directamente a GetEnumName/GetEnumValue, que son las que hacen el trabajo sucio.

También esto se debe, en parte, porque hasta ahora no se me había ocurrido la idea de valerme de los genéricos para tener un trozo de código que sea re-utilizable y meter mi rutina en alguna biblioteca de las que suelo tener a mano mientras escribo código.

Ya con la idea, y luego de algún esfuerzo, escribí la clase que ahora les comparto, pero primero, veamos su uso, que vendría a ser, por ejemplo:

begin
  Memo1.Lines.Add(
    TEnumConverter<TAlign>.ToString(Self.Align));
end;

Sigue leyendo

Delphi para Android es una realidad

AndroidHelmetHoy, a primera hora de la mañana, Embarcadero ha realizado el anuncio oficial de RAD Studio XE5, la primera versión de RAD Studio y Delphi que incluye soporte para compilar proyectos para Android, la plataforma móvil más utilizada en nuestros días. Este compilador viene a sumarse a los tradicionales compiladores para Win32, Win64, y a los más recientes, para OSX e iOS de la herramienta.

No puedo ocultar que estoy muy emocionado, con grandes expectativas para esta nueva versión de Delphi, sobre la que hay mucho por decir y en la que se enfocarán mis próximas publicaciones.

Por ahora, la idea de esta corta entrada, es hacer eco de la noticia y dejarte estos enlaces oficiales de Embarcadero, donde encontrarás más información (en inglés):

RAD Studio XE4 está aquí

delphihelmet100x100

El día de hoy ha sido anunciado oficialmente el lanzamiento de RAD Studio XE4 y Delphi XE4, cuya principal novedad es el soporte para desarrollo de aplicaciones nativas para iOS, basado en un nuevo compilador, conocido como nextgen que debuta en su versión para procesadores ARM, y utilizando FireMonkey3 como plataforma de desarrollo visual

Por ahora estoy corto de tiempo para entrar en detalles de esta nueva entrega, que son muchos, pero si estas interesado en el desarrollo multi-dispositivo, esta es, con seguridad, la versión de Delphi que estabas esperando, así que te invito a probarla!

Actualización del libro Programación paralela con OmniThreadLibrary

Portada del libroEl día de hoy, luego de algunos meses de espera, se ha publicado la versión actualizada del libro Programación paralela con OmniThreadLibrary.

Esta versión contiene ya culminado el capítulo 5: Sincronización, que habla sobre algunas primitivas de sincronización disponibles en la biblioteca, y vuelve a estar al día con la versión en Inglés. Todos los lectores anteriores pueden realizar la descarga de esta nueva versión sin costo alguno, desde su página de administración de compra, en Leanpub.com.

Si aún no has comprado el libro, ¿qué esperas? 😀