summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Wellons <wellons@nullprogram.com>2017-10-08 13:23:36 -0400
committerChristopher Wellons <wellons@nullprogram.com>2017-10-08 13:23:36 -0400
commit44c750d29b8db54ea2c981bcb495aa464ce4bddd (patch)
treeb649cf1c66b77db32b810cc23aab75ac899c3e2c
parentda86c3076c0adf5d0ae8026b3a44942def657b6a (diff)
Add johannes1971 decoderjohannes1971
-rw-r--r--test/benchmark.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/test/benchmark.c b/test/benchmark.c
index 4e93408..291342e 100644
--- a/test/benchmark.c
+++ b/test/benchmark.c
@@ -111,6 +111,40 @@ utf8_simple(unsigned char *s, long *c)
return next;
}
+static long
+GetChar(unsigned char *Buf, size_t *Offset)
+{ long Result = 0;
+
+ if ((Buf [*Offset] & 0x80) == 0) {
+ Result = Buf [*Offset];
+ ++*Offset;
+ return Result;
+ }
+
+ if ((Buf [*Offset] & 0xE0) == 0xC0 && (Buf [*Offset + 1] & 0xC0) == 0x80) {
+ Result = ((Buf [*Offset] & 0x1F) << 6) | (Buf [*Offset + 1] & 0x3F);
+ *Offset += 2;
+ return Result;
+ }
+
+ if ((Buf [*Offset] & 0xF0) == 0xE0 && (Buf [*Offset + 1] & 0xC0) == 0x80 && (Buf [*Offset + 2] & 0xC0) == 0x80) {
+ Result = ((Buf [*Offset] & 0x0F) << 12) | ((Buf [*Offset + 1] & 0x3F) << 6) | (Buf [*Offset + 2] & 0x3F);
+ *Offset += 3;
+ return Result;
+ }
+
+ if ((Buf [*Offset] & 0xF8) == 0xF0 && (Buf [*Offset + 1] & 0xC0) == 0x80 && (Buf [*Offset + 2] & 0xC0) == 0x80 && (Buf [*Offset + 3] & 0xC0) == 0x80) {
+ Result = ((Buf [*Offset] & 0x07) << 18) | ((Buf [*Offset + 1] & 0x3F) << 12) | ((Buf [*Offset + 2] & 0x3F) << 6) | (Buf [*Offset + 3] & 0x3F);
+ *Offset += 4;
+ return Result;
+ }
+
+ // Not a correctly encoded character; return the replacement character.
+
+ ++*Offset;
+ return -1;
+}
+
int
main(void)
{
@@ -120,6 +154,26 @@ main(void)
unsigned char *buffer = malloc(z);
unsigned char *end = buffer_fill(buffer, z);
+ /* Benchmark johannes1971 decoder */
+ running = 1;
+ signal(SIGALRM, alarm_handler);
+ alarm(SECONDS);
+ errors = n = 0;
+ do {
+ long count = 0;
+ size_t offset = 0;
+ while (buffer + offset < end) {
+ long c = GetChar(buffer, &offset);
+ count++;
+ if (c == -1)
+ errors++;
+ }
+ if (buffer + offset == end) // reached the end successfully?
+ n++;
+ } while (running);
+ rate = n * (end - buffer) / (double)SECONDS / 1024 / 1024;
+ printf("johannes1971: %f MB/s, %ld errors\n", rate, errors);
+
/* Benchmark the branchless decoder */
running = 1;
signal(SIGALRM, alarm_handler);