Get Character At?
Frits van Bommel
fvbommel at REMwOVExCAPSs.nl
Wed Apr 25 06:52:45 PDT 2007
Derek Parnell wrote:
> On Wed, 25 Apr 2007 13:41:25 +1000, Daniel Keep wrote:
>
>> Incidentally, I don't suppose you know anything about the relative
>> performance of your method up there ^^ and the one in my article down
>> here vv:
>
> It seems that your routine is about 3 times slower than the one I had
> shown. Here is my test program ... I modified your routine slightly because
> the idiom "if (x++ == n)" is a dangerous one as it is unclear if 'x' gets
> incremented before or after the comparision. I changed it to be more clear.
How is it unclear? Postfix-increment clearly means that the value before
incrementation is returned (and thus compared to n in that expression).
> I also changed my routine to output a dchar rather than a char[] and to
> test for invalid position input.
>
> //-----------------------------
> import std.perf;
> import std.stdio;
> import std.utf;
>
>
> dchar getCharAt(T)(T pText, int pPos)
> {
> size_t lUTF_Index;
> uint lStride;
>
> if (pPos < 0 || pPos >= pText.length)
> return dchar.init;
> // Firstly, find out where the character starts in the string.
> lUTF_Index = std.utf.toUTFindex(pText, pPos);
>
> // Then find out its width (in bytes)
> lStride = std.utf.stride(pText, lUTF_Index);
>
> // Return the character encoded in UTF format.
> return std.utf.toUTF32(
> pText[lUTF_Index .. lUTF_Index + lStride])[0];
I think you can change these last two statements to just:
---
return pText.decode(lUTF_Index);
---
(that's std.utf.decode, just to be clear)
That changes the index variable passed, but that doesn't matter here.
> }
[snip]
> //-----------------------------
>
> On my machine (Intel Core 2 6600 @ 2.40GHz, 2GB RAM) I got this result ...
>
> c:\temp>test
> Derek Parnell: 7939664
> Daniel Keep: 26683373
With mine added: (and obviously on _my_ machine)
---
urxae at urxae:~/tmp$ dmd -O -release -inline -run test.d
Derek Parnell: 17693368
Daniel Keep: 54037341
Frits van Bommel: 12045495
urxae at urxae:~/tmp$ gdc -O3 -finline -frelease -o test test.d && ./test
Derek Parnell: 19567337
Daniel Keep: 26750383
Frits van Bommel: 14332419
---
(My machine & compilers: AMD Sempron 3200+, 1GB RAM, 64-bit Ubuntu 6.10,
running DMD 1.013 and GDC 0.23/x86_64)
So my version is even faster (about 30%), at least on my machine. And
IMHO it's also more readable. No need to know what "stride" is, for example.
More information about the Digitalmars-d-learn
mailing list