>CLEAR > >SET TALK OFF >SET DECIMALS TO 3 > >SET LIBRARY TO ( HOME( ) + "FoxTools.FLL" ) ADDITIVE > >LOCAL ; > lnPasses > >lnPasses = 100 > >=RunTest( "2", lnPasses ) && 2^2 = 4 spaces >=RunTest( "4", lnPasses ) && 2^4 = 16 spaces >=RunTest( "8", lnPasses ) && 2^8 = 256 spaces >=RunTest( "16", lnPasses ) && 2^16 = 65,536 spaces >=RunTest( "20", lnPasses ) && 2^20 spaces > >RETURN >************************************************************* >FUNCTION RunTest > >LPARAMETERS ; > tcSpacesExponent ; > , tnPasses > >?"Spaces: 2^" + tcSpacesExponent ; > + " Passes: " + LTRIM( STR( tnPasses ) ) ; > + " Milliseconds: " + LTRIM( STR( Reduce_FoxTools( SPACE( EVALUATE( "2^" + tcSpacesExponent ) ), tnPasses ) ) ) ; > + " (REDUCE in FoxTools.FLL)" > >?"Spaces: 2^" + tcSpacesExponent ; > + " Passes: " + LTRIM( STR( tnPasses ) ) ; > + " Milliseconds: " + LTRIM( STR( Reduce_Successive( SPACE( EVALUATE( "2^" + tcSpacesExponent ) ), tnPasses ) ) ) ; > + " (Reduce_Successive)" > >?"Spaces: 2^" + tcSpacesExponent ; > + " Passes: " + LTRIM( STR( tnPasses ) ) ; > + " Milliseconds: " + LTRIM( STR( Reduce_Loop( SPACE( EVALUATE( "2^" + tcSpacesExponent ) ), tnPasses ) ) ) ; > + " (Reduce_Loop)" > >RETURN >************************************************************* >FUNCTION Reduce_FoxTools > >LPARAMETERS ; > tcString ; > , tnPasses > >LOCAL ; > lnSeconds ; > , lnIx ; > , lcString > >lnSeconds = SECONDS( ) > >FOR lnIx = 1 TO tnPasses STEP 1 > lcString = tcString > > =REDUCE( lcString ) > >ENDFOR > >RETURN ( SECONDS( ) - lnSeconds ) * 1000 > >ENDFUNC >************************************************************* >FUNCTION Reduce_Successive > >LPARAMETERS ; > tcString ; > , tnPasses > >LOCAL ; > lnSeconds ; > , lnIx ; > , lcString > >lnSeconds = SECONDS( ) > >FOR lnIx = 1 TO tnPasses STEP 1 > lcString = tcString > > * Code below handles spaces up to 2^20 long (fails on 2^20 + 1) > > lcString = STRTRAN( lcString, [ ], [ ] ) > lcString = STRTRAN( lcString, [ ], [ ] ) > lcString = STRTRAN( lcString, [ ], [ ] ) > lcString = STRTRAN( lcString, [ ], [ ] ) > lcString = STRTRAN( lcString, [ ], [ ] ) > lcString = STRTRAN( lcString, [ ], [ ] ) > lcString = STRTRAN( lcString, [ ], [ ] ) > lcString = STRTRAN( lcString, [ ], [ ] ) > >ENDFOR > >RETURN ( SECONDS( ) - lnSeconds ) * 1000 > >ENDFUNC >************************************************************* >FUNCTION Reduce_Loop > >LPARAMETERS ; > tcString ; > , tnPasses > >LOCAL ; > lnSeconds ; > , lnIx ; > , lcString > >lnSeconds = SECONDS( ) > >FOR lnIx = 1 TO tnPasses STEP 1 > lcString = tcString > > DO WHILE [ ] $ lcString > lcString = STRTRAN( lcString, [ ], [ ] ) > > ENDDO > >ENDFOR > >RETURN ( SECONDS( ) - lnSeconds ) * 1000 > >ENDFUNC >************************************************************* >>The only thing I'm not completely happy about is that the times are also measuring how long it takes to reassign lcString = tcString for the desired number of passes. However, this overhead is exactly the same for all 3 methods.
>Spaces: 2^2 Passes: 100 Milliseconds: 2 (REDUCE in FoxTools.FLL) >Spaces: 2^2 Passes: 100 Milliseconds: 1 (Reduce_Successive) >Spaces: 2^2 Passes: 100 Milliseconds: 1 (Reduce_Loop) >Spaces: 2^4 Passes: 100 Milliseconds: 2 (REDUCE in FoxTools.FLL) >Spaces: 2^4 Passes: 100 Milliseconds: 1 (Reduce_Successive) >Spaces: 2^4 Passes: 100 Milliseconds: 1 (Reduce_Loop) >Spaces: 2^8 Passes: 100 Milliseconds: 4 (REDUCE in FoxTools.FLL) >Spaces: 2^8 Passes: 100 Milliseconds: 2 (Reduce_Successive) >Spaces: 2^8 Passes: 100 Milliseconds: 9 (Reduce_Loop) >Spaces: 2^16 Passes: 100 Milliseconds: 469 (REDUCE in FoxTools.FLL) >Spaces: 2^16 Passes: 100 Milliseconds: 132 (Reduce_Successive) >Spaces: 2^16 Passes: 100 Milliseconds: 1739 (Reduce_Loop) >Spaces: 2^20 Passes: 100 Milliseconds: 9906 (REDUCE in FoxTools.FLL) >Spaces: 2^20 Passes: 100 Milliseconds: 4611 (Reduce_Successive) >Spaces: 2^20 Passes: 100 Milliseconds: 32510 (Reduce_Loop) >>These results are for only 100 passes, rather than 1,000. They are all basically identical for small numbers of spaces. However, when you get into larger numbers of spaces, my technique is fastest, followed by REDUCE in FoxTools, then Chuck's looping technique.
CLEAR ? 2^20,LEN(Reduce_Successive(SPACE(456718+1))) FUNCTION Reduce_Successive LPARAMETERS lcString lcString = STRTRAN( lcString, [ ], [ ] ) lcString = STRTRAN( lcString, [ ], [ ] ) lcString = STRTRAN( lcString, [ ], [ ] ) lcString = STRTRAN( lcString, [ ], [ ] ) lcString = STRTRAN( lcString, [ ], [ ] ) lcString = STRTRAN( lcString, [ ], [ ] ) lcString = STRTRAN( lcString, [ ], [ ] ) lcString = STRTRAN( lcString, [ ], [ ] ) RETURN m.lcString