Hi, looking at ooRexx's implemetation of x2c I find the original code much easier to understand and to reason about. Instead of hand-tuning an implementation I'd like to know why the native implementation is slower than your approach. I'd suspect it's because it's using strchr to validate each character against a set of valid characters. Might want to improve that instead...
It might be good to use VTune to do the actual performance analysis because that will give a cycle-accurate break-down of instructions. Cheers, Moritz On Fri, Apr 19, 2019 at 4:18 PM Rony G. Flatscher <rony.flatsc...@wu.ac.at> wrote: > Double-checked the test hex strings and their positions of illegal > whitespace chars, here the native routine with the corrected position: > > int64_t hex2char(RexxCallContext *rcc, CSTRING hexData, size_t len, char > *data) > { > // check for trailing whitespace > char tmp=(hexData[len-1]); // get last character (must not be > whitespace) > if (tmp==' ' || tmp=='\t') > rcc->ThrowException1(93931, rcc->UnsignedInt64ToObject(len)); > > size_t dIdx=0; > > for (size_t i=0; i<len; i++) > { > > if (hexData[i]>='0' && hexData[i]<='9') tmp=hexData[i]-'0'; > else if (hexData[i]>='A' && hexData[i]<='F') tmp=hexData[i]-'A'+10; > else if (hexData[i]>='a' && hexData[i]<='f') tmp=hexData[i]-'a'+10; > else > { > // check for leading whitespace > if (dIdx==0 && (hexData[i]==' ' || hexData[i]=='\t') ) > rcc->ThrowException1(93931, rcc->Int32ToObject(1)); > > if (hexData[i]==' ' || hexData[i]=='\t') continue; // skip on > whitespace > > // illegal hex digit > char buf[64]; > snprintf(buf, 64, "%c\0", hexData[i]); > rcc->ThrowException1(93933, rcc->NewStringFromAsciiz(buf)); > } > tmp<<=4; // shift to high order nibble > i++; // position on next hex digit > > if (i==len) // we are beyond the hex string and missing the second > hex digit > { > char buf[256]; > snprintf(buf, 256, "Hexadecimal string incomplete: hexadecimal > pair starting with the character \"%c\" in position %zd is missing the second > hexadecimal digit\0", hexData[i-1], len); > rcc->ThrowException1(93900,rcc->NewStringFromAsciiz(buf)); > } > > > if (hexData[i]>='0' && hexData[i]<='9') tmp|=hexData[i]-'0'; > else if (hexData[i]>='A' && hexData[i]<='F') tmp|=hexData[i]-'A'+10; > else if (hexData[i]>='a' && hexData[i]<='f') tmp|=hexData[i]-'a'+10; > else if (hexData[i]==' ' || hexData[i]=='\t') // also whitespace not > allowed in between of a hex pair > rcc->ThrowException1(93931, > rcc->UnsignedInt64ToObject(i*+1*)); > else // illegal hex digit > { > char buf[64]; > snprintf(buf, 64, "%c\0", hexData[i]); > rcc->ThrowException1(93933, rcc->NewStringFromAsciiz(buf)); > } > data[dIdx++]=tmp; > } > data[dIdx]='\0'; > return (int64_t)dIdx; // return number or characters in data > } > > > ---rony > _______________________________________________ > Oorexx-devel mailing list > Oorexx-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/oorexx-devel > -- Moritz Hoffmann; http://antiguru.de/
_______________________________________________ Oorexx-devel mailing list Oorexx-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/oorexx-devel