[Mono-devel-list] String.Replace patch to Managed code.
Andreas Nahr
ClassDevelopment at A-SoftTech.com
Tue Jun 1 17:36:06 EDT 2004
If I would have to guess (without testing!) this should be faster than my first (simple) solution and slower that the second one, however the code looks nicer and is more readable ;)
You could also write:
if(this.IndexOf(oldChar); == -1)
return this;
to save a variable.
However the additional function call is going to suck away a good amount of speed.
Andreas
----- Original Message -----
From: grompf
To: Andreas Nahr
Cc: mono-devel-list at lists.ximian.commono-devel-list@lists.ximian.com
Sent: Tuesday, June 01, 2004 7:33 PM
Subject: Re: [Mono-devel-list] String.Replace patch to Managed code.
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 --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20040601/03ac3d08/attachment.html
More information about the Mono-devel-list
mailing list