added GNU libunistring benchmark
authorSteven G. Johnson <stevenj@alum.mit.edu>
Sat, 19 Jul 2014 18:55:25 +0000 (14:55 -0400)
committerSteven G. Johnson <stevenj@alum.mit.edu>
Sat, 19 Jul 2014 18:55:25 +0000 (14:55 -0400)
.gitignore
bench/Makefile
bench/unistring.c [new file with mode: 0644]

index df310cf2499b97242157815a1244b9b6b4e99905..31ce623da49daedc3c36f958e5b46e1d14866a57 100644 (file)
@@ -10,5 +10,8 @@
 *.dSYM
 *.txt
 *.out
-bench
-icu
+bench/bench
+bench/icu
+bench/unistring
+
+
index 6fa7085800fa516b15fe714fdde80ddf39f98699..8b63f2c867600edf46e36000956e00f90309c5e8 100644 (file)
@@ -26,8 +26,14 @@ icu: icu.o util.o
 icu.out: $(DATAFILES) icu
        ./icu $(DATAFILES) > $@
 
+unistring: unistring.o util.o
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ unistring.o util.o -lunistring
+
+unistring.out: $(DATAFILES) unistring
+       ./unistring $(DATAFILES) > $@
+
 .c.o:
        $(CC) $(CPPFLAGS) -I.. $(CFLAGS) -c -o $@ $<
 
 clean:
-       rm -rf *.o *.txt bench *.out icu
+       rm -rf *.o *.txt bench *.out icu unistring
diff --git a/bench/unistring.c b/bench/unistring.c
new file mode 100644 (file)
index 0000000..2cc5ce8
--- /dev/null
@@ -0,0 +1,60 @@
+/* comparitive benchmark of GNU libunistring */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* libunistring */
+#include <unistr.h>
+#include <uninorm.h>
+
+#include "util.h"
+
+int main(int argc, char **argv)
+{
+        int i;
+        uninorm_t nf = UNINORM_NFKC;
+
+        for (i = 1; i < argc; ++i) {
+                 if (!strcmp(argv[i], "-nfkc")) {
+                          nf = UNINORM_NFKC;
+                          continue;
+                 }
+                 if (!strcmp(argv[i], "-nfkd")) {
+                          nf = UNINORM_NFKD;
+                          continue;
+                 }
+                 if (!strcmp(argv[i], "-nfc")) {
+                          nf = UNINORM_NFC;
+                          continue;
+                 }
+                 if (!strcmp(argv[i], "-nfd")) {
+                          nf = UNINORM_NFD;
+                          continue;
+                 }
+                 if (argv[i][0] == '-') {
+                          fprintf(stderr, "unrecognized option: %s\n", argv[i]);
+                          return EXIT_FAILURE;
+                 }
+
+                 size_t len;
+                 uint8_t *src = readfile(argv[i], &len);
+                 if (!src) {
+                          fprintf(stderr, "error reading %s\n", argv[i]);
+                          return EXIT_FAILURE;
+                 }
+
+                 size_t destlen;
+                 uint8_t *dest;
+                 mytime start = gettime();
+                 for (int i = 0; i < 100; ++i) {
+                          dest = u8_normalize(nf, src, len, NULL, &destlen);
+                          if (!dest) return EXIT_FAILURE;
+                          free(dest);
+                 }
+                 printf("%s: %g\n", argv[i], elapsed(gettime(), start) / 100);
+                 free(src);
+        }
+
+        return EXIT_SUCCESS;
+}