]> git.kaiwu.me - njs.git/commitdiff
Added fast path in njs_chb_utf8_length() for ASCII input.
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 24 May 2024 05:50:19 +0000 (22:50 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 24 May 2024 05:50:19 +0000 (22:50 -0700)
src/njs_chb.h
src/test/njs_benchmark.c

index 8501072846c56cd532894677c1ab7c8778115857..3dbe5ac9e56fd93e414db0b8ff09367e3b7a9b41 100644 (file)
@@ -96,6 +96,8 @@ njs_chb_size(njs_chb_t *chain)
 njs_inline int64_t
 njs_chb_utf8_length(njs_chb_t *chain)
 {
+    u_char          *p, *p_end;
+    size_t          size;
     int64_t         len, length;
     njs_chb_node_t  *n;
 
@@ -107,6 +109,23 @@ njs_chb_utf8_length(njs_chb_t *chain)
 
     length = 0;
 
+    while (n != NULL) {
+        p = n->start;
+        size = njs_chb_node_size(n);
+        p_end = p + size;
+
+        while (p < p_end && *p < 0x80) {
+              p++;
+        }
+
+        if (p != p_end) {
+            break;
+        }
+
+        length += size;
+        n = n->next;
+    }
+
     while (n != NULL) {
         len = njs_utf8_length(n->start, njs_chb_node_size(n));
         if (njs_slow_path(len < 0)) {
index 523aa46e11711ae3be211832fe0b07c130469057..f957dc5669f70055c1377d872c1f618d95883b74 100644 (file)
@@ -305,6 +305,21 @@ static njs_benchmark_test_t  njs_test[] =
       njs_str("undefined"),
       1 },
 
+    { "string create chb 'x'.repeat(256)",
+      njs_str("benchmark.string('chb', 'x'.repeat(256), 10000)"),
+      njs_str("undefined"),
+      1 },
+
+    { "string create chb 'Д'.repeat(128)",
+      njs_str("benchmark.string('chb', 'Д'.repeat(128), 10000)"),
+      njs_str("undefined"),
+      1 },
+
+    { "string create chb 'x'.repeat(128) + 'Д'.repeat(64)",
+      njs_str("benchmark.string('chb', 'x'.repeat(128) + 'Д'.repeat(64), 10000)"),
+      njs_str("undefined"),
+      1 },
+
     { "JSON.parse",
       njs_str("JSON.parse('{\"a\":123, \"XXX\":[3,4,null]}').a"),
       njs_str("123"),
@@ -696,6 +711,7 @@ njs_benchmark_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused, njs_value_t *retval)
 {
     int64_t      i, n;
+    njs_chb_t    chain;
     njs_str_t    s, mode;
     njs_value_t  value;
 
@@ -718,6 +734,23 @@ njs_benchmark_string(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
             njs_string_create(vm, &value, s.start, s.length);
         }
 
+    } else if (memcmp(mode.start, "chb", 3) == 0) {
+
+        NJS_CHB_MP_INIT(&chain, vm);
+
+        njs_chb_append_literal(&chain, "abc");
+        njs_chb_append(&chain, s.start, s.length);
+        njs_chb_append_literal(&chain, "abc");
+        njs_chb_append(&chain, s.start, s.length);
+        njs_chb_append_literal(&chain, "abc");
+        njs_chb_append(&chain, s.start, s.length);
+
+        for (i = 0; i < n; i++) {
+            njs_string_create_chb(vm, &value, &chain);
+        }
+
+        njs_chb_destroy(&chain);
+
     } else {
         njs_type_error(vm, "unknown mode \"%V\"", &mode);
         return NJS_ERROR;