[Mono-devel-list] String.Replace patch to Managed code.
grompf
grompf at sublimeintervention.com
Tue Jun 1 13:33:31 EDT 2004
Err.. sorry that should be
/* This method is culture insensitive */
public unsafe String Replace (char oldChar, char
newChar)
{
// Change Replace(char, char) to managed code,
because ICU doesn't deal with replacing \0
int pos = this.IndexOf(oldChar);
if(pos == -1)
return this;
string tmp = InternalAllocateStr(length);
fixed(char* s = &start_char, d = tmp) {
CharCopy(s, d, pos);
for(int i = pos; i < length ; i++)
{
if(s[i] == oldChar)
d[i] = newChar;
else
d[i] = s[i];
}
}
return tmp;
}
-kangaroo
On 1-Jun-04, at 1:26 PM, grompf wrote:
> Andreas,
>
> Admittedly and fully understood that what I initially presented
> wasn't optimized. I was working on tackling the bug first (with
> "safe" managed code), before moving it to the optimized unsafe version
> (which you posted for Replace(char, char) and looks pretty good.
>
> Now, that being said, considering your latest patch with IndexOf
> improvments. Your second "optimized" patch, wouldn't it be faster to
> do:
>
> int pos = this.IndexOf(oldChar);
> if(pos == -1)
> return this;
>
> fixed (char *source = &start_char) {
> string tmp = InternalAllocateStr(length);
> CharCopy(source, dest, pos);
> for(int i = 0; i < length; i++) {
> if(source[x] == oldChar)
> dest[x] = newChar;
> else
> dest[x] = source[x];
> }
> return tmp;
> }
>
>
> ??
>
> -kangaroo
>
> On 31-May-04, at 7:06 PM, Andreas Nahr wrote:
>
>> Hi,
>>
>> I'm working on string for quite some time now, but only when I find
>> spare time to do so, so things are progressing relatively slow in
>> that field (especially as things are very performance sensitive in
>> there and need a *lot* of testing)
>>
>> And I think that also a slight problem with your patch. Just from
>> looking at it (without too much testing): The performance of it would
>> be really bad.
>> For the invariant version a relatively fast managed implementation is
>> relatively easy (unfortunatelly it is still a little bit slower than
>> native, but a lot faster than your solution):
>>
>> string tmp = InternalAllocateStr (length);
>> fixed (char* s = &start_char, d = tmp) {
>> char* source = s, dest = d;
>> for (int x = 0; x < length; x++) {
>> if (*source == oldChar)
>> *dest = newChar;
>> else
>> *dest = *source;
>> source++;
>> dest++;
>> }
>> }
>> return tmp;
>>
>>
>>
>> If you like to test things a little bit you could also look at this
>> optimized version (needs the CharCopy patch I submitted to this
>> list):
>>
>> fixed (char* source = &start_char) {
>> for (int x = 0; x < length; x++) {
>> if (source[x] == oldChar) {
>> string tmp = InternalAllocateStr (length);
>> fixed (char* dest = tmp) {
>> CharCopy (source, dest, x);
>> source[x] = newChar;
>> for (; x < length; x++) {
>> if (source[x] == oldChar)
>> dest[x] = newChar;
>> else
>> dest[x] = source[x];
>> }
>> }
>> return tmp;
>> }
>> }
>> }
>> return this;
>>
>>
>>
>> Andreas
>>
>> ----- Original Message -----
>> From: grompf
>> To: mono-devel-list at lists.ximian.com
>> Sent: Monday, May 31, 2004 9:03 PM
>> Subject: [Mono-devel-list] String.Replace patch to Managed code.
>>
>> In my effort to address bug #59274, I tracked the problem down to
>> icu/glib in locales.c not replacing \0.
>>
>> Attached is a patch for String.cs to replace the internal methods
>> with managed code.
>>
>> There is probably a more efficient way of Replace(String, String),
>> but both of these methods have been tested and working for bug #59274
>> as well as other Replace testings. However, I'm a little unsure how
>> to test the culture dependancy of Replace(String, String).
>> Considering the IndexOf call should determine the culture as well, it
>> _should_ be ok as far I understand the culture dependancy stuff.
>>
>> If this looks good, let me know and I'll move on to some other
>> methods (like IndexOf).
>>
>> -kangaroo
>>
>>
>>
>> !DSPAM:40bbba5f248971207617767!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: text/enriched
Size: 8500 bytes
Desc: not available
Url : http://lists.ximian.com/pipermail/mono-devel-list/attachments/20040601/ac57b814/attachment.bin
More information about the Mono-devel-list
mailing list