Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Psyke1 en 11 Febrero 2011, 14:31 pm



Título: [SRC] IIfEx [by Mr. Frog ©]
Publicado por: Psyke1 en 11 Febrero 2011, 14:31 pm
Bueno, os traigo esta simple función para reemplazar a IIf(). :)
IIf(), es una función muy cómoda de vb, pero no es recomendable usarla en bucles o si se necesita especial agilidad porque es leeeenta. :-(
La mía funciona exactamente igual, con la ventaja de que los argumentos en caso de ser Falso o Verdadero son opcionales. ;)

Código
  1. Option Explicit
  2.  
  3. Public Static Function IIfEx(ByVal bolExpresion As Boolean, _
  4.                    Optional ByRef varTruePart As Variant, _
  5.                    Optional ByRef varFalsePart As Variant) As Variant
  6.    If bolExpresion Then
  7.        IIfEx = varTruePart
  8.    Else
  9.        IIfEx = varFalsePart
  10.    End If
  11. End Function


Un pequeño ejemplo de velocidad usando CTiming.cls (http://www.xbeat.net/vbspeed/download/CTiming.zip) :

Código
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4. Dim t               As New CTiming
  5. Dim x               As Long
  6. Dim ret             As Variant
  7. Const s             As String = "holaa"
  8. Const sCorrect      As String = s
  9. Const sIncorrect    As String = sCorrect & "a"
  10. Const lngLoops      As Long = 100000
  11.  
  12.    If App.LogMode = 0 Then
  13.        MsgBox "Compile it stupid!", vbCritical
  14.        End
  15.    End If
  16.  
  17.    Me.AutoRedraw = True
  18.  
  19.    Me.Print "True part"
  20.    Me.Print
  21.  
  22.    t.Reset
  23.    For x = 1 To lngLoops
  24.        ret = IIf((s = sCorrect), 123, 1233)
  25.    Next
  26.    Me.Print "IIf", t.sElapsed
  27.  
  28.    t.Reset
  29.    For x = 1 To lngLoops
  30.        ret = IIfEx((s = sCorrect), 123, 1233)
  31.    Next
  32.    Me.Print "IIfEx", t.sElapsed
  33.  
  34.    Me.Print String$(20, "-")
  35.    Me.Print "False part"
  36.    Me.Print
  37.  
  38.    t.Reset
  39.    For x = 1 To lngLoops
  40.        ret = IIf((s = sIncorrect), 123, 1233)
  41.    Next
  42.    Me.Print "IIf", t.sElapsed
  43.  
  44.    t.Reset
  45.    For x = 1 To lngLoops
  46.        ret = IIfEx((s = sIncorrect), 123, 1233)
  47.    Next
  48.    Me.Print "IIfEx", t.sElapsed
  49. End Sub

Resultado (IIfEx = IIIf ; que le cambié el nombre :rolleyes:) :
(http://img109.imageshack.us/img109/1305/dibujobby.jpg)

(http://images1.memegenerator.net/ImageMacro/5008584/Problem.jpg?imageSize=Large&generatorName=Troll-Face)

Nota: Aún así si se necesita especial velocidad mejor usar If.  :rolleyes:

DoEvents! :P


Título: Re: [SRC] IIIf [by Mr. Frog ©]
Publicado por: 79137913 en 11 Febrero 2011, 14:35 pm
HOLA!!!

Muy buena Mr Frog!!!

Me hacen recordar al SI(condicion,ValorVerdadero,ValorFalso) del EXCEL.

Igual ya te lo habia dicho :P.

Re bien, Mejora en un 40% a la iif Original, esta perfecta!

GRACIAS POR LEER!!!


Título: Re: [SRC] IIfEx [by Mr. Frog ©]
Publicado por: Psyke1 en 11 Febrero 2011, 15:15 pm
Gracias, unicamente quería demostrar que para mejorar la velocidad de vb no hace falta romperse la cabeza.

Código
  1. ' Hago un poco de trampa usando otra función de vb, solo es una adaptación para usar MidB() como Mid()... :P
  2. Public Static Function fMid(ByRef sText As String, ByVal lngStart As Long, Optional ByVal lngLength As Long) As String
  3.    fMid = MidB$(sText, 1 + lngStart + lngStart, lngLength + lngLength)
  4. End Function

Código
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4. Dim t               As New CTiming
  5. Dim x               As Long
  6. Dim ret             As String
  7. Dim s               As String
  8. Const lngLoops      As Long = 100000
  9. Const lngStart      As Long = 34566
  10. Const lngLen        As Long = 10000
  11.  
  12.    If App.LogMode = 0 Then
  13.        MsgBox "Compile it stupid!", vbCritical
  14.        End
  15.    End If
  16.  
  17.    Show
  18.    AutoRedraw = True
  19.  
  20.    For x = 0 To 100000
  21.        s = s & ChrW$(Rnd * 255)
  22.    Next
  23.  
  24.    Cls
  25.  
  26.    t.Reset
  27.    For x = 1 To lngLoops
  28.        ret = fMid(s, lngStart, lngLen)
  29.    Next
  30.    Print "fMid", t.sElapsed
  31.  
  32.    ret = vbNullString
  33.  
  34.    t.Reset
  35.    For x = 1 To lngLoops
  36.        ret = Mid$(s, lngStart, lngLen)
  37.    Next
  38.    Print "Mid", t.sElapsed
  39. End Sub

Resultado:
(http://img842.imageshack.us/img842/8358/dibujoowi.jpg)

DoEvents! :P