Jump to content

Recommended Posts

Posted (edited)

Don't you just love it when a regular expression comes out on top?! I know I do..

Local $hTimer = 0

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_1('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_2('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_1($sDrive)
    Local $aArray = [@HomeDrive, _
            @ProgramFilesDir, _
            @SystemDir, _
            @WindowsDir]
    For $sFilePath In $aArray
        If StringLeft($sFilePath, 1) = $sDrive Then
            Return True
        EndIf
    Next
    Return False
EndFunc   ;==>_IsSystemDrive

Func _IsSystemDrive_Test_2($sDrive)
    Return StringRegExp(@HomeDrive & '|' & @ProgramFilesDir & '|' & @SystemDir & '|' & @WindowsDir, '(?<=^|\|)(?:' & $sDrive & ')') = 1
EndFunc   ;==>_IsSystemDrive

I am no expert at regular expressions, but what I have managed to learn has proved very useful over the last couple of years.

Edited by guinness

UDF List:

  Reveal hidden contents

Updated: 22/04/2018

Posted

101 % agree :D

BTW you can save 2 ms more by removing the '=1' which makes your code test twice (1st with the regex, 2nd by interpreting the func return)

Local $hTimer = 0

$hTimer = TimerInit()
For $i = 1 To 10000
    $s = _IsSystemDrive_Test_2('C')
Next
ConsoleWrite($s & @CRLF & TimerDiff($hTimer) & @CRLF)

$hTimer = TimerInit()
For $i = 1 To 10000
    $s = _IsSystemDrive_Test_3('C')
Next
ConsoleWrite($s & @CRLF & TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_2($sDrive)
    Return StringRegExp(@HomeDrive & '|' & @ProgramFilesDir & '|' & @SystemDir & '|' & @WindowsDir, _
        '(?<=^|\|)(?:' & $sDrive & ')') = 1
EndFunc   ;==>_IsSystemDrive

Func _IsSystemDrive_Test_3($sDrive)
    Return StringRegExp(@HomeDrive & '|' & @ProgramFilesDir & '|' & @SystemDir & '|' & @WindowsDir, _
        '(?<=^|\|)(?:' & $sDrive & ')')
EndFunc   ;==>_IsSystemDrive
Posted (edited)

I like it better when it does not.

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_3('C:')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_3($sDrive)
    Return StringInStr(@HomeDrive , $sDrive) And StringInStr(@ProgramFilesDir , $sDrive) And StringInStr(@SystemDir , $sDrive) And StringInStr(@WindowsDir , $sDrive)
EndFunc   ;==>_IsSystemDrive
Edited by JohnOne

AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Posted

Especially when the tests are fair.

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_4('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_4($sDrive)
    Return StringLeft(@HomeDrive , 1) = $sDrive And StringLeft(@ProgramFilesDir , 1) = $sDrive And StringLeft(@SystemDir , 1) = $sDrive And StringLeft(@WindowsDir , 1) = $sDrive
EndFunc   ;==>_IsSystemDrive

AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Posted

I record the 1st function as quicker by approx 10 ms. Interesting what a small change does to alter the result.

Global $hTimer = 0
Global $aArray = [ _
 @HomeDrive, _
 @ProgramFilesDir, _
 @SystemDir, _
 @WindowsDir _
]

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_1('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_2('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_1($sDrive)
    For $sFilePath In $aArray
        If StringLeft($sFilePath, 1) = $sDrive Then
            Return True
        EndIf
    Next
    Return False
EndFunc   ;==>_IsSystemDrive

Func _IsSystemDrive_Test_2($sDrive)
    Return StringRegExp($aArray[0] & '|' & $aArray[1] & '|' & $aArray[2] & '|' & $aArray[3], '(?<=^|\|)(?:' & $sDrive & ')') = 1
EndFunc   ;==>_IsSystemDrive
Posted
  On 5/26/2014 at 11:06 AM, mikell said:

Hum :blink:

JO the 2nd code is not faster than the regex, but the 1st one looks like a "learn when not to use regex" (in this particular case)

They both register faster for me.

But you're right, I've been dodging regex since I started AutoIt, I just don't get it, I've tried but it's like an alien language to me.

AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Posted
  On 5/26/2014 at 11:28 AM, MHz said:

I record the 1st function as quicker by approx 10 ms. Interesting what a small change does to alter the result.

Global $hTimer = 0
Global $aArray = [ _
 @HomeDrive, _
 @ProgramFilesDir, _
 @SystemDir, _
 @WindowsDir _
]

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_1('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

$hTimer = TimerInit()
For $i = 1 To 10000
    _IsSystemDrive_Test_2('C')
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

Func _IsSystemDrive_Test_1($sDrive)
    For $sFilePath In $aArray
        If StringLeft($sFilePath, 1) = $sDrive Then
            Return True
        EndIf
    Next
    Return False
EndFunc   ;==>_IsSystemDrive

Func _IsSystemDrive_Test_2($sDrive)
    Return StringRegExp($aArray[0] & '|' & $aArray[1] & '|' & $aArray[2] & '|' & $aArray[3], '(?<=^|\|)(?:' & $sDrive & ')') = 1
EndFunc   ;==>_IsSystemDrive

Too many Global variables like that makes my head hurt.

UDF List:

  Reveal hidden contents

Updated: 22/04/2018

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...