#include #include #include #include "String.h" #include "ZTimer.h" int nErrors = 0; int nCharacters = 0; void dump(int* a,int n) { printf("int[] length: %d chars:",n); for (int i = 0; i < n; ++i) { printf(" %08x",a[i]); } printf("\n"); } void dump(UCS::String& s) { int n = s.length(); int* a = s.asChars(); printf("UCS string length: %d chars:",n); for (int i = 0; i < n; ++i) { printf(" %08x",a[i]); } printf("\n"); } void dump(UTF8::String& s) { int n = s.length(); char* a = s.asChars(); printf("UTF8 string length: %d chars:",n); for (int i = 0; i < n; ++i) { printf(" %02x",255 & a[i]); } printf("\n"); } const char* fillAscending(char* s,int c,int n) { for (int i = 0; i < n; ++i) { int v = 255 & (c + i); s[i] = v; } return s; } const int* fillAscending(int* s,int c,int n) { for (int i = 0; i < n; ++i) { int v = c + i; s[i] = v; } return s; } void runTests() { int s[1024]; int n = 16; int v = 16; for (; 0 < v; v <<= 1) { printf("test v: %x\n",v); fillAscending(s,v-7,n); UCS::String s1; UTF8::String s2; UCS::String s3; UTF8::String s4; UTF8::String s5; s1.from(s,n); s2.convertFrom(s1); s2.convertTo(s3); s4.convertFrom(s3); s5.from(s4.asChars()); s5.recode(); nCharacters += n; if (s1.compare(s3) || s2.compare(s4) || s4.compare(s5)) { ++nErrors; dump(s,n); dump(s1); dump(s2); dump(s3); dump(s4); dump(s5); printf("\n\n== ERROR\n"); printf("Compare: %d\n",s1.compare(s3)); printf("Compare: %d\n",s2.compare(s4)); printf("Compare: %d\n",strcmp(s2.asChars(),s4.asChars())); printf("Compare: %d\n",strcmp(s4.asChars(),s5.asChars())); exit(1); } } printf("\n\n%d characters, %d errors\n",nCharacters,nErrors); } void runTimes() { enum { N = 1024 * 1024 }; int s[N]; int i = 16; for (; i < 0x50000000; i += (32 * N)) { fillAscending(s,i,N); UCS::String s1; UTF8::String s2; s1.from(s,N); s2.upsize(N * 6); { int n = 0; ZTimer t; for (;;) { s2.convertFrom(s1); ++n; int dt = t.split(); if (1000 < dt) { break; } } double v = N * (double) n; v /= 1024 * 1024; v /= t.elapsed(); v *= 1000; printf("base %08x : %6.1lf MB/s UCS to UTF8 conversion\n",i,v); } { int n = 0; ZTimer t; for (;;) { s2.convertTo(s1); ++n; int dt = t.split(); if (1000 < dt) { break; } } double v = N * (double) n; v /= 1024 * 1024; v /= t.elapsed(); v *= 1000; printf("base %08x : %6.1lf MB/s UTF8 to UCS conversion\n",i,v); } { int n = 0; ZTimer t; for (;;) { s2.recode(); ++n; int dt = t.split(); if (1000 < dt) { break; } } double v = N * (double) n; v /= 1024 * 1024; v /= t.elapsed(); v *= 1000; printf("base %08x : %6.1lf MB/s UTF8 recode\n",i,v); } } } int main() { //runTests(); runTimes(); return 0; }