[VB6+ASM] FastSqr - Clase para hacer raices enteras raaapidamente ;D

Iniciado por Karcrack, 22 Agosto 2010, 20:27 PM

0 Miembros y 1 Visitante están viendo este tema.

Karcrack

Código (vb) [Seleccionar]
'---------------------------------------------------------------------------------------
' Module    : cFastSqr
' Author    : Karcrack
' Now       : 22/08/2010 20:25
' Purpose   : Fast alternative for Integer Sqr
' History   : 22/08/2010 First cut .........................................................
'---------------------------------------------------------------------------------------

Option Explicit
Private sCode       As String

'NTDLL
Private Declare Sub RtlMoveMemory Lib "NTDLL" (Destination As Any, Source As Any, ByVal Length As Long)

Public Function FastSqr(ByVal lValue As Long) As Long
    ' Filled with ASM later
End Function

Private Sub Class_Initialize()
    Dim sCode       As String
    Dim lPtr        As Long
   
    sCode = ChrW$(&H548B) & ChrW$(&HC24) & ChrW$(&H448B) & ChrW$(&H824) & ChrW$(&HFF2) & ChrW$(&HC02A) & ChrW$(&HFF2) & ChrW$(&HC051) & ChrW$(&HFF2) & ChrW$(&HC02D) & ChrW$(&H289) & ChrW$(&HC031) & ChrW$(&HCC2) & ChrW$(&H0)
   
    Call RtlMoveMemory(lPtr, ByVal ObjPtr(Me), 4)
    Call RtlMoveMemory(ByVal lPtr + &H1C, StrPtr(sCode), 4)
End Sub

Codigo ASM utilizado:
http://karcrack.pastebin.com/CLSZPR5d

Para calcular el rendimiento:
Sub Main()
    Dim cFS         As New cFastSqr
    Dim cT          As New CTiming
    Dim i           As Long
    Dim x           As Long
   
    cT.Reset
    For i = 1 To 10000000
        x = cFS.FastSqr(i)
    Next i
    MsgBox cT.sElapsed
   
    cT.Reset
    For i = 1 To 10000000
        x = CLng(Sqr(i))
    Next i
    MsgBox cT.sElapsed
End Sub


Es aproximadamente el doble de rapida en el calculo de Raices enteras :)

Saludos ;)

Psyke1

Dudas:
1.-Porque FastSqr esta vacio?
2.-Porque haces un clase para una sola funcion?¿

Gracias!

DoEvents¡! :P

Novlucker

1- Lo dice en el propio código
'Filled with ASM later
:http://karcrack.pastebin.com/CLSZPR5d
2- Supongo que viene por lo de los retos, y buscar la manera más rápida de realizar una operación.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Karcrack

Es una de las formas de ejecutar codigo ASM, la mas rapida.

Se utiliza una clase, y como cada objeto en VB6 tiene una vTable, donde estan los punteros de las funciones, lo que se hace es añadir la funcion, y cuando la clase se inicializa se cambia el puntero a nuestro codigo en ASM, asi que cuando se llame a ese funcion en realidad se salta al codigo ASM :D

Estoy haciendo un tutorial de como ejecutar codigo ASM en VB... a ver si lo acabo, que es un tema muy interesante ;)

Psyke1

Gracias a ambos! ;)
Si Karcrack, me interesa mucho ese tuto!! ;-)

DoEvents¡! :P

Tokes

¡Karcrack, por favor termínalo! ¡Por favooooooooooooor!

            Gracias.

Karcrack

Bueno, ahora mismo he retomado la escritura del tuto y tengo una mala noticia para algunos... he decidido reescribir el tuto en Ingles... espero que no suponga mucha dificultad usar el traductor de Google :P

He aqui el indice para los impacientes :laugh:
Summary:

1.Brief introduction
2.What should I know before reading this paper?
3.Loading code onto the memory.
   1.Single variables.
   2.Arrays.
   3.Strings.
4.Executing the code:
   1.CallWindowProcA/W()
   2.Virtual Function Table (VFT) patch
   3.Zombie_AddRef() or Zombie_ReleaseRef()
   4.__vbaGoSubReturn()
5.Thanks and References

Psyke1

Perfecto  ;-)
Nah, el inglés no es problema, o si no le pido ayuda a mi primo... :laugh: :laugh: :laugh: :laugh:
Tienes alguna fecha aproximada de publicacion?¿
Gracias

DoEvents¡! :P

Karcrack

Cita de: *PsYkE1* en 24 Agosto 2010, 20:52 PMTienes alguna fecha aproximada de publicacion?¿
Bueno, me gustaria tenerlo para antes de Septiembre, si no es posible estara para la primera semana ;)

Tu tranki que tu primo seguro que se las arregla :laugh:

xmbeat92

Cita de: Karcrack en 24 Agosto 2010, 20:00 PM
Bueno, ahora mismo he retomado la escritura del tuto y tengo una mala noticia para algunos... he decidido reescribir el tuto en Ingles... espero que no suponga mucha dificultad usar el traductor de Google :P

He aqui el indice para los impacientes :laugh:
Summary:

1.Brief introduction
2.What should I know before reading this paper?
3.Loading code onto the memory.
   1.Single variables.
   2.Arrays.
   3.Strings.
4.Executing the code:
   1.CallWindowProcA/W()
   2.Virtual Function Table (VFT) patch
   3.Zombie_AddRef() or Zombie_ReleaseRef()
   4.__vbaGoSubReturn()
5.Thanks and References

me va a interesar mucho ese tuto!!!
Aunque este en ingles....(parte del cuerpo en que se unen el muslo con el torso)
El hombre encuentra a Dios detrás de cada puerta que la ciencia logra abrir. -Einstein