Ben,

Agreed, the Len/Pos array loops are ugly and a pain to deal with.   
Hence my attempts to bypass all of that by finding a way to pass the  
backreference directly in reReplace... :-)

Got around to running timers comparing reFind and your reMatchGroups  
function against each other.    The first set ran both options  
together in the same function and produced significantly faster  
results for rematchGroups.   The next 5 sets were done in a loop with  
both functions side by side.    reMatchGroups came out ahead again on  
the average.

When I ran each timer by itself,   revmoving the other from the  
function, reFind() came out faster on both sets (plus a few more  
attempts I didn't capture in these results).

While not exactly scientific, the timer results are included below  
(tab separated - sorry for the formatting in plain text):

Timer Run       Using ReFind(ms)        Using RematchGroups(ms)
Base Run        5276    2879
Loop 1  4241    3434
Loop 2  4109    3284
Loop3   3440    3080
Loop 4  3290    2894
Loop 5  2994    3209
Solo Run 1      3975    4675
Solo Run 2      3501    3556
Average 3853.25 3376.375
Difference      -14.12% 12.38%
Machine Info:  CF8 | 2GHz Macbook Pro 2GB RAM

  Based on the results, It seems that reMatchGroups has a speed  
advantage with a high load, but reFind seems to perform better in a  
single request.  There were no database calls in the timers to cloud  
the results.

Interesting stuff!

Jon

On Nov 16, 2007, at 8:42 AM, Ben Nadel wrote:

> Jon,
>
> My recommendation AGAINST using REFind() in a loop is that I feel like
> it has to keep revaluating the string. The Java Pattern matcher  
> which is
> what powers the REMatchGroups() UDF is designed to iterate over  
> pattern
> matches and as such I assume that it is really good at it. Plus, I  
> think
> that you will find that dealing with the Len[] and Pos[] arrays is  
> going
> to look less than elegant. I don't think there is anyone who has even
> enjoyed dealing with them :)
>
> This is all theory though, I have never checked the performance.
>
>
> ......................
> Ben Nadel
> Certified Advanced ColdFusion MX7 Developer
> www.bennadel.com
>
> Need ColdFusion Help?
> www.bennadel.com/ask-ben/
>
> -----Original Message-----
> From: Jon Clausen [mailto:[EMAIL PROTECTED]
> Sent: Thursday, November 15, 2007 8:17 PM
> To: CF-Talk
> Subject: Re: Using reReplace Backreference as StructKey or Argument
>
> Ben,
>
> Thanks for the reply.  I had sent a response to Ben's reply earlier
> today, but I guess it didn't go through.
>
> I figured the order of execution was the issue.  I was hoping for a  
> way
> to "trick" the execution order and tried writing the function call  
> in a
> bunch of different ways other than the example I provided, but no
> dice.   Ben posted a nice response, though looping with reFind() does
> the job for now.
>
> Thanks again,
>
> Jon
>
>
> On Nov 15, 2007, at 10:02 AM, Ben Doom wrote:
>
>> Sorry, you can't do that.  Here's why:
>>
>> Coldfusion hands strings off to the regex engine.  CF allows you to
>> used functions, variables, etc. in the string, but it executes them
>> *before*
>> the regex runs.  So, in your first code sample, it's trying to find
>> the literal key \1 in appSettings, and then passing the result as the
>> replace value.
>>
>> --Ben Doom
>>
>> Jon Clausen wrote:
>>> I'm sure it's something simple that I'm missing, but I want to use a
>>> regex backreference as the struct key (i.e. - struct["key"])  or as
>>> an argument (i.e. - function("argument") ) but I've failed in all my
>>> attempts so far.
>>>
>>> For now I've written the code out using a loop with reFind(),
>>> returning subexpressions, mid(), etc. but it seems to me there  
>>> should
>
>>> be a way to do this using reReplace() and pass the backreference as
>>> an argument/key.  Usage of evaluate() would probably be a
>>> deal-breaker since it would be less expensive to perform the loop.
>>>
>>> Here's examples of what i'm trying to do:
>>>
>>> <!--- Trying to use backref passed as struct key ---> <cfset pageOut
>>> = reReplace(pageContent,"<%show:([a-zA-Z0-9_]+)
>>> %>",appSettings["\1"],"ALL")/>
>>>
>>> <!--- Trying to use backref passed as argument ---> <cfset pageOut =
>>> reReplace(pageContent,"<%getModule:([a-zA-Z0-9_]+)
>>> %>",controller.getModule("\1"),"ALL")/>
>>>
>>> Thoughts?
>>>
>>> Jon
>>>
>>>
>>>
>>
>>
>
>
>
> 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Download the latest ColdFusion 8 utilities including Report Builder,
plug-ins for Eclipse and Dreamweaver updates.
http;//www.adobe.com/cfusion/entitlement/index.cfm?e=labs%5adobecf8%5Fbeta

Archive: 
http://www.houseoffusion.com/groups/CF-Talk/message.cfm/messageid:293474
Subscription: http://www.houseoffusion.com/groups/CF-Talk/subscribe.cfm
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4

Reply via email to