Buenas!.

En este test se demuestra que un array dinámico que se inicializa y se asignan su elementos es más rápido:

- Que añadir elementos a un array dinámico uno a uno.
- Que un array estático.

' gambas module file

Const NUMELEMTOS As Integer = 20000
Const NVECES As Integer = 50

'No puedo añadir la constante como número de elementos del array. Provoca error de sintaxis por el tipo admitido
'Public ematriz[NUMELEMTOS] As Integer

'Este tipo de array debe ser público
Private ematriz[20000] As Integer

'Array de array sin necesidad de inicializar cada uno de los nuevos arrays internos.
Private valoresbucles As Float[][] = [[], [], []]

Public Sub Main()

Repeticiones(NVECES)
Comparar(valoresbucles)

End

Public Sub Comparar(valores As Float[][])

Dim cuentavalores As Integer[] = [0, 0, 0]
Dim j As Integer
Dim vencedor As Integer
Dim losparticipantes As String[] = ["Array dinámico con inicialzacion y asignación", "Añadiendo elementos al array uno a uno", "Array estático"]
Dim cparticipantes As New Collection
Dim valor As String

For j = 0 To valores[0].Max 'Miden todos igual
If valores[0][j] < valores[1][j] And valores[1][j] < valores[2][j] Then
cuentavalores[0] += 1
Else If valores[1][j] < valores[0][j] And valores[1][j] < valores[2][j] Then
cuentavalores[1] += 1
Else
cuentavalores[2] += 1
Endif
Next
'
If cuentavalores[0] > cuentavalores[1] And cuentavalores[0] > cuentavalores[2] Then
vencedor = 1
Else If cuentavalores[1] > cuentavalores[0] And cuentavalores[1] > cuentavalores[2] Then
vencedor = 2
Else
vencedor = 3
Endif

Print "Bucle " & vencedor & " es el más rápido!.\n"

Print "Despues de ejecutar: "; NVECES; " veces cada uno de los búcles. Se demuestra que:"
Print "Dimensionar un array dinámico y asignar valores es más rapido que añadir uno a uno elementos"
Print "a un array dinámico y es más rápido que un array estático.\n"


For j = 0 To valoresbucles.Max
cparticipantes.Add(valoresbucles[j].Sort()[j], losparticipantes[j])
Next

For Each valor In cparticipantes
Print "El tiempo mínimo del bucle " & cparticipantes.Key & " fue de "; valor; " uS"

Next

End

Public Sub Repeticiones(n As Integer)

Dim i As Integer
Dim comienzo As Float
Dim diferenciadetiempo As Float

' Tiempo en microsegundos

For i = 1 To n
comienzo = Timer
Bucle1(NUMELEMTOS)
diferenciadetiempo = Timer - comienzo
valoresbucles[0].Add(diferenciadetiempo * 1000000)

comienzo = Timer
Bucle2(NUMELEMTOS)
diferenciadetiempo = Timer - comienzo
valoresbucles[1].Add(diferenciadetiempo * 1000000)

comienzo = Timer
Bucle3
diferenciadetiempo = Timer - comienzo
valoresbucles[2].Add(diferenciadetiempo * 1000000)
Next

End

Public Sub Bucle1(ielementos As Integer)

Dim matriz As New Integer[ielementos]
Dim i As Integer

For i = 0 To matriz.Max
matriz[i] = Rand(0, 65000)
Next

End

Public Sub Bucle2(ielementos As Integer)

Dim matriz As New Integer[]
Dim i As Integer

For i = 0 To ielementos
matriz.Add(Rand(0, 65000))
Next

End

Public Sub Bucle3()

Dim i As Integer

For i = 0 To ematriz.Max
ematriz[i] = Rand(0, 65000)
Next

End


Respuesta:

Citar:

Bucle 1 es el más rápido!.

Despues de ejecutar: 50 veces cada uno de los búcles. Se demuestra que:
Dimensionar un array dinámico y asignar valores es más rapido que añadir uno a uno elementos
a un array dinámico y es más rápido que un array estático.

El tiempo mínimo del bucle Array dinámico con inicialzacion y asignación fue de 913.189996936126 uS
El tiempo mínimo del bucle Añadiendo elementos al array uno a uno fue de 1531.51999984402 uS
El tiempo mínimo del bucle Array estático fue de 2124.17999864556 uS


A los que bajéis el código, compilarlo y fijaros que gambas advierte de el array estático no se ha inicializado.

Subo el ejemplo:

Bien. Si sabemos de antemano cuantos valores va a contener nuestro array dinámico podemos acelerar un poco.
Si no lo sabemos y vamos añadiendo uno a uno ( de ahí dinámico ) la respuesta será algo más lenta.

Saludos