Como calcula BASpeed la velocidad de tu conexión

Se de buena tinta que muchos de vosotros os estáis preguntando desde hace mucho que es lo que hace BASpeed internamente para calcular la velocidad. Voy a explicarlo teniendo en cuenta el código fuente del test de velocidad de BASpeed v10 que es casi idéntico al código de BASpeed 2018 y además el código fuente de esa versión es completante "open source" (de código abierto), por lo que cualquiera puede utilizarlo y modificarlo a su antojo.

Vamos ahora con el primer paso, que es obtener el código fuente de BASpeed v10. El código está alojado en GitHub.com, en concreto podéis acceder a el a través de este enlace. 
Una vez descargado el código, los usuarios novatos en programación Object Pascal, deberán abrir el archivo principal.pas que es el que contiene todo el código fuente del test de velocidad, así como el test de ping y el test de tracert aunque nosotros en este artículo nos vamos a centrar en el test de velocidad.

Cuando abráis el archivo veréis que he intentado documentar todo el código fuente linea a linea para que incluso una persona sin conocimientos de programación pueda intentar seguir el desarrollo de todos los algoritmos que hay dentro del código.

La rutina que calcula la velocidad del test de velocidad está dentro del procedure TDescarga.CalculaDatos. Ahí dentro veréis el algoritmo de se usa para calcular la velocidad de la conexión. Y eso es lo que voy a intentar explicar en este artículo para que comprendáis un poco algo del código interno de BASpeed. Vamos a ir linea por linea, de manera que no se pierda nadie en las explicaciones.

El código del algoritmo está dispuesto entre la palabra clave begin y la palabra clave end del procedure TDescarga.CalculaDatos. La primera linea es:

if (AWorkMode=TworkMode.wmRead) and (cancelartestvelocidad=False)then

Lo cual quiere decir que si el modo de trabajo del objeto HTTP es de lectura, y no se ha cancelado el test, siga con las siguientes instrucciones. Lo que van dentro de esa estructura condicional es el cálculo de la velocidad, que es lo que nos interesa.
La siguiente linea de código dentro del condicional if es:

mem.Seek(0,0);

Mem es un bloque de memoria de un tamaño de 512 Kilobytes (varía en función del valor de la constante TAM_BUFFER, declarada al principio del código fuente del programa). La linea de código que estamos analizando, le dice al programa que debe apuntar al inicio de ese bloque de memoria.

La siguiente instrucción del código fuente es :

tf:=gettickcount64;

Gettickcount es una función que nos devuelve el tiempo en ticks de reloj interno del ordenador que ha transcurrido desde que se encendió por última vez. TF es el acrónimo de "tiempo final", y por supuesto existe un "tiempo inicial" ti que guarda el valor con la misma función cuando se pulsa el botón de Iniciar test de velocidad.

La siguiente linea de código es:

tt:=tf-ti;

Esa instrucción le dice al programa que en la variable tt ("tiempo total"), debe guardar el valor de la resta entre la variable tf ("tiempo final") y ti ("tiempo inicial"), de forma que el valor resultante es el tiempo transcurrido desde el inicio del test hasta que se ha llenado esta vez el buffer de lectura (variable mem).

La siguiente instrucción es una de las más importantes, y es la que realmente nos interesa aunque necesitamos todas las demás para llegar a este cálculo:

velocidad:=(AWorkCount div tt) * 8;

Ahí está el algoritmo que calcula la velocidad de la conexión. AWorkCount es el número de bytes descargados del servidor al que se está haciendo el test de velocidad, y tt ya sabemos lo que es ya que lo hemos explicado antes aunque sólo debemos quedarnos con la idea de que representa el tiempo total transcurrido desde el inicio del test hasta que se ha llenado esta vez el buffer de lectura (variable mem).
La idea principal para obtener la velocidad es que la velocidad es igual al número de datos totales, dividido entre el tiempo total. En nuestro caso el tamaño de los datos viene dado por la variable AWorkCount, y el tiempo por la variable tt.
Se multiplica por 8 para pasar de bytes por segundo a bits por segundo. El resultado de esa ecuación es la velocidad media del test de velocidad. En su día se expuso en bandaancha.eu el porqué elegí la velocidad media y no la velocidad instantánea. 

A grandes rasgos elegí la velocidad media porque es la mejor forma de ver como varía la velocidad de la conexión con el paso del tiempo. La velocidad instantánea está muy bien para ver la velocidad en un instante determinado pero no sirve para ver como funciona la descarga a pleno rendimiento durante un periodo de tiempo determinado.
De todas formas y como información a navegantes, si en vez de velocidad media queréis que BASpeed os mida la velocidad instantánea es tan sencillo como añadir la siguiente linea justo antes de acabar el procedure TDescarga.CalculaDatos:

ti:=tf;

Y con esa linea y volviendo a compilar el programa BASpeed os calculará la velocidad instantánea en vez de la velocidad media, aunque ya os digo que para ver la velocidad real de descarga el mejor metodo es ver la velocidad media de descarga durante un periodo de tiempo.

La última linea del algoritmo es:

tpc:=(AworkCount*100) div tam;

Esa instrucción le dice al programa que calcule el tanto por ciento descargado del archivo del servidor. Para ello sabemos el valor de tam ("tamaño") que es el tamaño total del archivo en el servidor, y de AWorkCount que es la cantidad de bytes descargados de ese mismo archivo. Con esa fórmula se calcula el tanto por ciento del archivo que ya está descargado, y que luego se trasladará a la barra de progreso del test.

Y así es como BASpeed calcula la velocidad de la conexión. Como véis no tiene mucho misterio, y mucho menos es cosa de magia. Se que quizás esta explicación es muy técnica, aunque he intentado acercaros una pequeña parte del código de BASpeed a vosotros que sois lo que usáis el programa y posiblemente no tengáis conocimientos de programación aunque si os gusta saber como funcionan por dentro las cosas.

Cualquier comentario que queráis hacerme será siempre bienvenido, y si queréis que os explique cualquier otra cosa sobre BASpeed no tenéis más que dejarme un comentario aquí mismo y os lo intentaré explicar para que lo entendáis.

Un saludo a todos :)

 

 

Esta entrada fue actualizada el domingo, 29 abril 2018

Comentarios