Cita de: Karcrack en 25 Enero 2013, 15:07 PM
La más rápida es sacar el resultado precalculado con un print
Exactamente!¡.
P.D.: @Psyke1 aun no se va dolores ¿Que hago con ella?.
Dulces Lunas!¡.
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCita de: Karcrack en 25 Enero 2013, 15:07 PM
La más rápida es sacar el resultado precalculado con un print
Tiempo 7913 930.892 msec
Resultado 7913 233168
Tiempo dany 1,693.349 msec
Resultado dany 233168
Tiempo Spyke1 521.769 msec
Resultado Spyke1 233168
Tiempo BlackZeroX V1 234.119 msec
Resultado BlackZeroX V1 233168
Tiempo BlackZeroX V2 130.859 msec
Resultado BlackZeroX V2 233168
Tiempo BlackZeroX V3 6.550 msec
Resultado BlackZeroX V3 233168
Tiempo MCKSys Argentina 10.054 msec
Resultado MCKSys Argentina 233168
Public Function mul3and5_Ver3(Optional ByVal dwBelowTo As Long = &H3E8&) As Long
Dim N As Long
Dim M As Long
Dim I As Long
If (dwBelowTo < &H4) Then Exit Function
dwBelowTo = (dwBelowTo - &H1)
N = dwBelowTo \ &H3
M = dwBelowTo \ &H5
I = M \ &H3
mul3and5_Ver3 = (&H3 * N * (N + &H1) \ &H2) + (&H5 * ((M * (M + &H1) \ &H2) - &H3 * (I * (I + &H1) \ &H2)))
End Function
Cita de: MCKSys Argentina en 24 Enero 2013, 12:14 PM
Creo que fue buena idea sacrificar los bucles por las multiplicaciones y divisiones...
Cita de: MCKSys Argentina en 24 Enero 2013, 11:59 AM
Me parece que están al revés. Euler_1 es mi función y mul3and5 es la tuya.
If (i > dwBelowTo) Then Exit Function
If (i >= dwBelowTo) Then Exit Function
a << 1 // Desplazamiento de 1 a la izquierda en C/C++.
a * 2 // Simulación en vb6 y en cualquier lenguaje.
a << 4 // Desplazamiento de 4 bits a la izquierda en C/C++.
a * 16 // Simulacion en vb6 y en cualquier lenguaje.
a >> 1 // Desplazamiento de 1 bit a la derecha en C/C++
a \ 2 // No ocupar / ya que devuelve decimales...
a >> 4 // Desplazamiento de 4 bits a la derecha en C/C++
a \ 16 // No ocupar / ya que devuelve decimales...
Tiempo 7913 872.496 msec
Resultado 7913 233168
Tiempo dany 1,650.228 msec
Resultado dany 233168
Tiempo Spyke1 480.171 msec
Resultado Spyke1 233168
Tiempo BlackZeroX V1 202.318 msec
Resultado BlackZeroX V1 233168
Tiempo BlackZeroX V2 129.462 msec
Resultado BlackZeroX V2 233168
Tiempo MCKSys Argentina 7.249 msec
Resultado MCKSys Argentina 233168
Cita de: MCKSys Argentina en 24 Enero 2013, 10:58 AM
PD: Mirando el ASM generado, veo que el secreto está en no usar multiplicaciones ni divisiones.
Const MAX_FOR As Long = 10000
Dim i as long
For i = 1 To MAX_FOR
If Not (PE_1(i) = Euler_1(i)) Then
Debug.Print "BlackZeroX Error: "; i
End If
Next
For i = 1 To MAX_FOR
If Not (PE_1(i) = mul3and5(i)) Then
Debug.Print "MCKSys Argentina Error: "; i
End If
Next
MCKSys Argentina Error: 7038
MCKSys Argentina Error: 7053
MCKSys Argentina Error: 7068
MCKSys Argentina Error: 7083
MCKSys Argentina Error: 7098
MCKSys Argentina Error: 7113
MCKSys Argentina Error: 7128
MCKSys Argentina Error: 7143
MCKSys Argentina Error: 7158
MCKSys Argentina Error: 7173
MCKSys Argentina Error: 7188
MCKSys Argentina Error: 7203
MCKSys Argentina Error: 7218
MCKSys Argentina Error: 7233
MCKSys Argentina Error: 7248
MCKSys Argentina Error: 7263
MCKSys Argentina Error: 7278
MCKSys Argentina Error: 7293
MCKSys Argentina Error: 7308
MCKSys Argentina Error: 7323
MCKSys Argentina Error: 7338
MCKSys Argentina Error: 7353
MCKSys Argentina Error: 7368
MCKSys Argentina Error: 7383
MCKSys Argentina Error: 7398
MCKSys Argentina Error: 7413
MCKSys Argentina Error: 7428
MCKSys Argentina Error: 7443
MCKSys Argentina Error: 7458
MCKSys Argentina Error: 7473
MCKSys Argentina Error: 7488
MCKSys Argentina Error: 7503
MCKSys Argentina Error: 7518
MCKSys Argentina Error: 7533
MCKSys Argentina Error: 7548
MCKSys Argentina Error: 7563
MCKSys Argentina Error: 7578
MCKSys Argentina Error: 7593
MCKSys Argentina Error: 7608
MCKSys Argentina Error: 7623
MCKSys Argentina Error: 7638
MCKSys Argentina Error: 7653
MCKSys Argentina Error: 7668
MCKSys Argentina Error: 7683
MCKSys Argentina Error: 7698
MCKSys Argentina Error: 7713
MCKSys Argentina Error: 7728
MCKSys Argentina Error: 7743
MCKSys Argentina Error: 7758
MCKSys Argentina Error: 7773
MCKSys Argentina Error: 7788
MCKSys Argentina Error: 7803
MCKSys Argentina Error: 7818
MCKSys Argentina Error: 7833
MCKSys Argentina Error: 7848
MCKSys Argentina Error: 7863
MCKSys Argentina Error: 7878
MCKSys Argentina Error: 7893
MCKSys Argentina Error: 7908
MCKSys Argentina Error: 7923
MCKSys Argentina Error: 7938
MCKSys Argentina Error: 7953
MCKSys Argentina Error: 7968
MCKSys Argentina Error: 7983
MCKSys Argentina Error: 7998
MCKSys Argentina Error: 8013
MCKSys Argentina Error: 8028
MCKSys Argentina Error: 8043
MCKSys Argentina Error: 8058
MCKSys Argentina Error: 8073
MCKSys Argentina Error: 8088
MCKSys Argentina Error: 8103
MCKSys Argentina Error: 8118
MCKSys Argentina Error: 8133
MCKSys Argentina Error: 8148
MCKSys Argentina Error: 8163
MCKSys Argentina Error: 8178
MCKSys Argentina Error: 8193
MCKSys Argentina Error: 8208
MCKSys Argentina Error: 8223
MCKSys Argentina Error: 8238
MCKSys Argentina Error: 8253
MCKSys Argentina Error: 8268
MCKSys Argentina Error: 8283
MCKSys Argentina Error: 8298
MCKSys Argentina Error: 8313
MCKSys Argentina Error: 8328
MCKSys Argentina Error: 8343
MCKSys Argentina Error: 8358
MCKSys Argentina Error: 8373
MCKSys Argentina Error: 8388
MCKSys Argentina Error: 8403
MCKSys Argentina Error: 8418
MCKSys Argentina Error: 8433
MCKSys Argentina Error: 8448
MCKSys Argentina Error: 8463
MCKSys Argentina Error: 8478
MCKSys Argentina Error: 8493
MCKSys Argentina Error: 8508
MCKSys Argentina Error: 8523
MCKSys Argentina Error: 8538
MCKSys Argentina Error: 8553
MCKSys Argentina Error: 8568
MCKSys Argentina Error: 8583
MCKSys Argentina Error: 8598
MCKSys Argentina Error: 8613
MCKSys Argentina Error: 8628
MCKSys Argentina Error: 8643
MCKSys Argentina Error: 8658
MCKSys Argentina Error: 8673
MCKSys Argentina Error: 8688
MCKSys Argentina Error: 8703
MCKSys Argentina Error: 8718
MCKSys Argentina Error: 8733
MCKSys Argentina Error: 8748
MCKSys Argentina Error: 8763
MCKSys Argentina Error: 8778
MCKSys Argentina Error: 8793
MCKSys Argentina Error: 8808
MCKSys Argentina Error: 8823
MCKSys Argentina Error: 8838
MCKSys Argentina Error: 8853
MCKSys Argentina Error: 8868
MCKSys Argentina Error: 8883
MCKSys Argentina Error: 8898
MCKSys Argentina Error: 8913
MCKSys Argentina Error: 8928
MCKSys Argentina Error: 8943
MCKSys Argentina Error: 8958
MCKSys Argentina Error: 8973
MCKSys Argentina Error: 8988
MCKSys Argentina Error: 9003
MCKSys Argentina Error: 9018
MCKSys Argentina Error: 9033
MCKSys Argentina Error: 9048
MCKSys Argentina Error: 9063
MCKSys Argentina Error: 9078
MCKSys Argentina Error: 9093
MCKSys Argentina Error: 9108
MCKSys Argentina Error: 9123
MCKSys Argentina Error: 9138
MCKSys Argentina Error: 9153
MCKSys Argentina Error: 9168
MCKSys Argentina Error: 9183
MCKSys Argentina Error: 9198
MCKSys Argentina Error: 9213
MCKSys Argentina Error: 9228
MCKSys Argentina Error: 9243
MCKSys Argentina Error: 9258
MCKSys Argentina Error: 9273
MCKSys Argentina Error: 9288
MCKSys Argentina Error: 9303
MCKSys Argentina Error: 9318
MCKSys Argentina Error: 9333
MCKSys Argentina Error: 9348
MCKSys Argentina Error: 9363
MCKSys Argentina Error: 9378
MCKSys Argentina Error: 9393
MCKSys Argentina Error: 9408
MCKSys Argentina Error: 9423
MCKSys Argentina Error: 9438
MCKSys Argentina Error: 9453
MCKSys Argentina Error: 9468
MCKSys Argentina Error: 9483
MCKSys Argentina Error: 9498
MCKSys Argentina Error: 9513
MCKSys Argentina Error: 9528
MCKSys Argentina Error: 9543
MCKSys Argentina Error: 9558
MCKSys Argentina Error: 9573
MCKSys Argentina Error: 9588
MCKSys Argentina Error: 9603
MCKSys Argentina Error: 9618
MCKSys Argentina Error: 9633
MCKSys Argentina Error: 9648
MCKSys Argentina Error: 9663
MCKSys Argentina Error: 9678
MCKSys Argentina Error: 9693
MCKSys Argentina Error: 9708
MCKSys Argentina Error: 9723
MCKSys Argentina Error: 9738
MCKSys Argentina Error: 9753
MCKSys Argentina Error: 9768
MCKSys Argentina Error: 9783
MCKSys Argentina Error: 9798
MCKSys Argentina Error: 9813
MCKSys Argentina Error: 9828
MCKSys Argentina Error: 9843
MCKSys Argentina Error: 9858
MCKSys Argentina Error: 9873
MCKSys Argentina Error: 9888
MCKSys Argentina Error: 9903
MCKSys Argentina Error: 9918
MCKSys Argentina Error: 9933
MCKSys Argentina Error: 9948
MCKSys Argentina Error: 9963
MCKSys Argentina Error: 9978
MCKSys Argentina Error: 9993
[code]
Dulces Lunas!¡.
[/code]
Tiempo 7913 978.902 msec
Resultado 7913 233168
Tiempo dany 1,647.315 msec
Resultado dany 233168
Tiempo Spyke1 488.101 msec
Resultado Spyke1 233168
Tiempo BlackZeroX V1 205.944 msec
Resultado BlackZeroX V1 233168
Tiempo BlackZeroX V2 125.884 msec
Resultado BlackZeroX V2 233168
Option Explicit
Option Base 0
Sub main()
Const LIM As Long = 1000&
Const MAX_FOR As Long = 100000
Dim i As Long
Dim ct As New CTiming
Dim obj As Object
MsgBox "Empezara luego del Ok"
ct.Reset
For i = 1 To MAX_FOR
mul3and5_Ver2 LIM
Next
Debug.Print "Tiempo BlackZeroX V2", ct.sElapsed
Debug.Print "Resultado BlackZeroX V2", mul3and5_Ver2(LIM) & vbCrLf
ct.Reset
For i = 1 To MAX_FOR
mul3and5 LIM
Next
Debug.Print "Tiempo BlackZeroX V1", ct.sElapsed
Debug.Print "Resultado BlackZeroX V1", mul3and5(LIM) & vbCrLf
ct.Reset
For i = 1 To MAX_FOR
mul5and3below1000
Next
Debug.Print "Tiempo 7913", ct.sElapsed
Debug.Print "Resultado 7913", mul5and3below1000() & vbCrLf
ct.Reset
For i = 1 To MAX_FOR
mul_3_5
Next
Debug.Print "Tiempo dany", ct.sElapsed
Debug.Print "Resultado dany", mul_3_5() & vbCrLf
ct.Reset
For i = 1 To MAX_FOR
PE_1 LIM
Next
Debug.Print "Tiempo Spyke1", ct.sElapsed
Debug.Print "Resultado Spyke1", PE_1(LIM) & vbCrLf
End Sub
Private Function mul5and3below1000() As Long
Dim ct As Long
Dim aux As Long
Dim aux2 As Long
Do
mul5and3below1000 = mul5and3below1000 + aux + aux2
ct = ct + 1
aux = ct + ct + ct
aux2 = ct + ct + ct + ct + ct
Loop While aux2 < 1000
Do
mul5and3below1000 = mul5and3below1000 + aux
ct = ct + 1
aux = ct + ct + ct
Loop While aux < 1000
ct = 0
aux = 0
Do
mul5and3below1000 = mul5and3below1000 - aux
ct = ct + 1
aux = ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct + ct
Loop While aux < 1000
End Function
Function mul_3_5() As Long
Dim i As Integer
For i = 1 To 999
If (i Mod 3) < 1 Or (i Mod 5) < 1 Then
mul_3_5 = mul_3_5 + i
End If
Next i
End Function
Public Static Function PE_1(ByVal lNum As Long) As Long
Dim Q As Long
If lNum And &H80000000 Then Exit Function
lNum = lNum - 1
For Q = 3 To lNum Step 3
PE_1 = PE_1 + Q
Next Q
For Q = 5 To lNum Step 5
If Q Mod 3 Then PE_1 = PE_1 + Q
Next Q
End Function
Public Function mul3and5(Optional ByVal dwBelowTo As Long = &H3E8&) As Long
Dim i As Long
Dim dwNewMax As Long
If (dwBelowTo And &H80000000) Then Exit Function
dwNewMax = (dwBelowTo + &HFFFFFFFF)
dwNewMax = (dwNewMax - (dwNewMax Mod &HF&))
For i = &H5& To dwNewMax Step &HF&
mul3and5 = mul3and5 + i + i + &HFFFFFFFE
Next
For i = &HA& To dwNewMax Step &HF&
mul3and5 = mul3and5 + i + i + i + &HFFFFFFFB
Next
For i = &HF& To dwNewMax Step &HF&
mul3and5 = mul3and5 + i + i + &HFFFFFFFD
Next
i = (dwNewMax + &H3&):
If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
i = (i + &H2&): If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
i = (i + &H1&): If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
i = (i + &H3&): If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
i = (i + &H1&): If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
i = (i + &H2&): If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
End Function
Public Function mul3and5_Ver2(Optional ByVal dwBelowTo As Long = &H3E8&) As Long
Dim i As Long
Dim dwNewMax As Long
Dim dwNewMaxFast As Long
If (dwBelowTo And &H80000000) Then Exit Function
dwNewMax = (dwBelowTo + &HFFFFFFFF)
dwNewMax = (dwNewMax - (dwNewMax Mod &HF&))
If (dwNewMax > &H1E&) Then
dwNewMaxFast = (dwNewMax - (dwNewMax Mod &H1E&))
For i = &H5& To dwNewMaxFast Step &H1E&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + i + i + &H1A&
Next
For i = &HA& To dwNewMaxFast Step &H1E&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + i + i + i + i + &H23&
Next
For i = &HF& To dwNewMaxFast Step &H1E&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + i + i + &H18&
Next
End If
For i = dwNewMaxFast + &H5& To dwNewMax Step &HF&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + &HFFFFFFFE
Next
For i = dwNewMaxFast + &HA& To dwNewMax Step &HF&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + i + &HFFFFFFFB
Next
For i = dwNewMaxFast + &HF& To dwNewMax Step &HF&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + &HFFFFFFFD
Next
i = (dwNewMax + &H3&):
If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
i = (i + &H2&): If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
i = (i + &H1&): If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
i = (i + &H3&): If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
i = (i + &H1&): If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
i = (i + &H2&): If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
End Function
Public Function mul3and5(Optional ByVal dwBelowTo As Long = &H3E8&) As Long
Dim i As Long
Dim dwNewMax As Long
If (dwBelowTo And &H80000000&) Then Exit Function
dwNewMax = (dwBelowTo + &HFFFFFFFF&)
dwNewMax = (dwNewMax - (dwNewMax Mod &HF&))
For i = &H5& To dwNewMax Step &HF&
mul3and5 = mul3and5 + i + i + &HFFFFFFFE&
Next
For i = &HA& To dwNewMax Step &HF&
mul3and5 = mul3and5 + i + i + i + &HFFFFFFFB&
Next
For i = &HF& To dwNewMax Step &HF&
mul3and5 = mul3and5 + i + i + &HFFFFFFFD&
Next
i = (dwNewMax + &H3&):
If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
i = (i + &H2&): If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
i = (i + &H1&): If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
i = (i + &H3&): If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
i = (i + &H1&): If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
i = (i + &H2&): If (i >= dwBelowTo) Then Exit Function
mul3and5 = mul3and5 + i
End Function
Public Function mul3and5_Ver2(Optional ByVal dwBelowTo As Long = &H3E8&) As Long
Dim i As Long
Dim dwNewMax As Long
Dim dwNewMaxFast As Long
If (dwBelowTo And &H80000000) Then Exit Function
dwNewMax = (dwBelowTo + &HFFFFFFFF)
dwNewMax = (dwNewMax - (dwNewMax Mod &HF&))
If (dwNewMax > &H1E&) Then
dwNewMaxFast = (dwNewMax - (dwNewMax Mod &H1E&))
For i = &H5& To dwNewMaxFast Step &H1E&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + i + i + &H1A&
Next
For i = &HA& To dwNewMaxFast Step &H1E&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + i + i + i + i + &H23&
Next
For i = &HF& To dwNewMaxFast Step &H1E&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + i + i + &H18&
Next
End If
For i = dwNewMaxFast + &H5& To dwNewMax Step &HF&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + &HFFFFFFFE&
Next
For i = dwNewMaxFast + &HA& To dwNewMax Step &HF&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + i + &HFFFFFFFB
Next
For i = dwNewMaxFast + &HF& To dwNewMax Step &HF&
mul3and5_Ver2 = mul3and5_Ver2 + i + i + &HFFFFFFFD
Next
i = (dwNewMax + &H3&):
If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
i = (i + &H2&): If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
i = (i + &H1&): If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
i = (i + &H3&): If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
i = (i + &H1&): If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
i = (i + &H2&): If (i >= dwBelowTo) Then Exit Function
mul3and5_Ver2 = mul3and5_Ver2 + i
End Function
sub main()
Dim path as string
path = "c:\Dir\Dir2\" & TextoAleatorio("a-z", "-", 5, 10) & ".bat" ' Esto genera un texto aleatoria que comprende las letras desde "a" hasta "z" TODAS minusculas segun el codigo asccii con longitud minima de 5 caracteres y 10 como máximo.
' Más codigo
end sub
Private Sub NormalizePath(ByRef sData As String)
sData = IIf(Right$(sData, 1) = "\", sData, sData & "\")
End Sub
Function TextoAleatorio(StrRango As String, Separador As String, Optional LENTEXTMIN As Long = 1, Optional LENTEXTMAX As Long = -1) As String
Dim spli() As String
Dim i As Double
If InStr(StrRango, Separador) > 0 Then
spli = Split(StrRango, Separador)
LENTEXTMAX = LENTEXTMIN + Int(IIf(LENTEXTMAX = -1, NumeroAleatorio(1, 100), LENTEXTMAX))
For i = LENTEXTMIN To LENTEXTMAX
TextoAleatorio = TextoAleatorio & Chr(NumeroAleatorio(Asc(spli(0)), Asc(spli(1))))
Next i
End If
End Function
Public Function NumeroAleatorio(MinNum As Long, MaxNum As Long) As Long
Dim Tmp As Long
If MaxNum < MinNum Then: Tmp = MaxNum: MaxNum = MinNum: MinNum = Tmp
Randomize: NumeroAleatorio = CLng((MinNum - MaxNum + 1) * Rnd + MaxNum)
End Function