You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by so...@apache.org on 2015/06/16 19:45:36 UTC
trafficserver git commit: TS-3673: Remove ink_memchr and friends
Repository: trafficserver
Updated Branches:
refs/heads/master 6c9a642ca -> fc8113b8c
TS-3673: Remove ink_memchr and friends
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/fc8113b8
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/fc8113b8
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/fc8113b8
Branch: refs/heads/master
Commit: fc8113b8c15167f6254298cb14b66d7128a03668
Parents: 6c9a642
Author: Phil Sorber <so...@apache.org>
Authored: Tue Jun 16 11:36:04 2015 -0600
Committer: Phil Sorber <so...@apache.org>
Committed: Tue Jun 16 11:45:28 2015 -0600
----------------------------------------------------------------------
lib/ts/Makefile.am | 4 +-
lib/ts/test_memchr.cc | 171 --------------------
lib/ts/test_strings.cc | 373 --------------------------------------------
3 files changed, 1 insertion(+), 547 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fc8113b8/lib/ts/Makefile.am
----------------------------------------------------------------------
diff --git a/lib/ts/Makefile.am b/lib/ts/Makefile.am
index f30ac9c..66273fd 100644
--- a/lib/ts/Makefile.am
+++ b/lib/ts/Makefile.am
@@ -188,9 +188,7 @@ libtsutil_la_SOURCES = \
# load_http_hdr.cc \
# IntrusivePtrTest.cc \
# IpMapTest.cc \
-# TestHttpHeader.cc \
-# test_memchr.cc \
-# test_strings.cc
+# TestHttpHeader.cc
# Special hacks to generate the parser rules
$(srcdir)/ParseRules.cc: ParseRulesCType
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fc8113b8/lib/ts/test_memchr.cc
----------------------------------------------------------------------
diff --git a/lib/ts/test_memchr.cc b/lib/ts/test_memchr.cc
deleted file mode 100644
index 294207c..0000000
--- a/lib/ts/test_memchr.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-/** @file
-
- A brief file description
-
- @section license License
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
-
-#include <stdio.h>
-
-//
-// fast memchr
-//
-void *
-ink_memchr(const void *as, int ac, size_t an)
-{
- unsigned char c = (unsigned char)ac;
- unsigned char *s = (unsigned char *)as;
-
- // initial segment
-
- int i_len = (int)(((uintptr_t)8 - (uintptr_t)as) & 7);
-
- // too short to concern us
-
- if ((int)an < i_len) {
- for (int i = 0; i < (int)an; i++)
- if (s[i] == c)
- return &s[i];
- return 0;
- }
- // bytes 0-3
-
- switch (i_len & 3) {
- case 3:
- if (*s++ == c)
- return s - 1;
- case 2:
- if (*s++ == c)
- return s - 1;
- case 1:
- if (*s++ == c)
- return s - 1;
- case 0:
- break;
- }
-
- // bytes 4-8
-
- unsigned int ib = c;
- ib |= (ib << 8);
- ib |= (ib << 16);
- unsigned int im = 0x7efefeff;
- if (i_len & 4) {
- unsigned int ibp = *(unsigned int *)s;
- unsigned int ibb = ibp ^ ib;
- ibb = ((ibb + im) ^ ~ibb) & ~im;
- if (ibb) {
- if (s[0] == c)
- return &s[0];
- if (s[1] == c)
- return &s[1];
- if (s[2] == c)
- return &s[2];
- if (s[3] == c)
- return &s[3];
- }
- s += 4;
- }
- // next 8x bytes
- uint64_t m = 0x7efefefefefefeffLL;
- uint64_t b = ((uint64_t)ib);
- b |= (b << 32);
- uint64_t *p = (uint64_t *)s;
- unsigned int n = (((unsigned int)an) - (s - (unsigned char *)as)) >> 3;
- uint64_t *end = p + n;
- while (p < end) {
- uint64_t bp = *p;
- uint64_t bb = bp ^ b;
- bb = ((bb + m) ^ ~bb) & ~m;
- if (bb) {
- s = (unsigned char *)p;
- if (s[0] == c)
- return &s[0];
- if (s[1] == c)
- return &s[1];
- if (s[2] == c)
- return &s[2];
- if (s[3] == c)
- return &s[3];
- if (s[4] == c)
- return &s[4];
- if (s[5] == c)
- return &s[5];
- if (s[6] == c)
- return &s[6];
- if (s[7] == c)
- return &s[7];
- }
- p++;
- }
-
- // terminal segement
-
- i_len = an - (((unsigned char *)p) - ((unsigned char *)as));
- s = (unsigned char *)p;
-
- // n-(4..8)..n bytes
-
- if (i_len & 4) {
- unsigned int ibp = *(unsigned int *)s;
- unsigned int ibb = ibp ^ ib;
- ibb = ((ibb + im) ^ ~ibb) & ~im;
- if (ibb) {
- if (s[0] == c)
- return &s[0];
- if (s[1] == c)
- return &s[1];
- if (s[2] == c)
- return &s[2];
- if (s[3] == c)
- return &s[3];
- }
- s += 4;
- }
- // n-(0..3)..n bytes
-
- switch (i_len & 3) {
- case 3:
- if (*s++ == c)
- return s - 1;
- case 2:
- if (*s++ == c)
- return s - 1;
- case 1:
- if (*s++ == c)
- return s - 1;
- case 0:
- break;
- }
- return 0;
-}
-
-
-#define MEMCHR(_s, _c) ink_memchr(_s, _c, strlen(_s)) ?: ""
-main()
-{
- int i = 0;
- printf("%d %s\n", i++, MEMCHR("a;ldkfjoiwenalkdufla asdfj3i", ' '));
- printf("%d %s\n", i++, MEMCHR("a;ldkfjoiwenalkdufla asdfj3i", '3'));
- printf("%d %s\n", i++, MEMCHR("a;ldkfjoiwenalkdufla asdfj3i", '\n'));
- printf("%d %s\n", i++, MEMCHR("a;ldkfjoiwenalk$uflaE$$dfj3i", '$'));
- printf("%d %s\n", i++, MEMCHR("a;ldkfjoiwenalkd#####asdfj3i", '#'));
- printf("%d %s\n", i++, MEMCHR("a;ldkfjoiwenalkdufla a^^sdfj3i", '^'));
- printf("%d %s\n", i++, MEMCHR("a;ldkfjoiwenalkdufla asd*************fj3i", '*'));
-}
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fc8113b8/lib/ts/test_strings.cc
----------------------------------------------------------------------
diff --git a/lib/ts/test_strings.cc b/lib/ts/test_strings.cc
deleted file mode 100644
index ac32b5b..0000000
--- a/lib/ts/test_strings.cc
+++ /dev/null
@@ -1,373 +0,0 @@
-/** @file
-
- A brief file description
-
- @section license License
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
-
-/* This program tests the speeds of several of the string functions, both
- * from the inktomi library and from the standard library.
- * TODO : add testing for ink_strlcpy ?
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-char *small = "12345";
-char *small2 = "12345";
-int small_len = 5;
-#define SMALL_LEN 5
-
-char *medium = "1234512345123451234512345";
-char *medium2 = "1234512345123451234512345";
-int med_len = 25;
-#define MED_LEN 25
-
-char *large = "111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999";
-char *large2 = "111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999";
-int large_len = 90;
-#define LARGE_LEN 90
-
-int i, iresult, cycles;
-char *sresult;
-char cresult;
-clock_t start, stop;
-
-void *ink_memchr(const void *as, int ac, size_t an);
-
-#define STRLEN_TEST(_func_, _size_) \
- { \
- start = clock(); \
- for (i = 0; i < cycles; i++) { \
- iresult = _func_(_size_); \
- } \
- stop = clock(); \
- printf("%20s\t%10s\t%1.03g usec/op\n", #_func_, #_size_, ((double)stop - start) / ((double)cycles)); \
- }
-
-#define STRCHR_TEST(_func_, _size_, _chr_) \
- { \
- start = clock(); \
- for (i = 0; i < cycles; i++) { \
- sresult = _func_(_size_, _chr_); \
- } \
- stop = clock(); \
- printf("%20s\t%10s\t%1.03g usec/op\t%s\n", #_func_, #_size_, ((double)stop - start) / ((double)cycles), \
- (sresult) ? "found" : "not found"); \
- }
-
-#define JP_MEMCHR_TEST(_func_, _size_, _chr_, _len_) \
- { \
- start = clock(); \
- for (i = 0; i < cycles; i++) { \
- sresult = (char *)ink_memchr(_size_, _chr_, _len_); \
- } \
- stop = clock(); \
- printf("%20s\t%10s\t%1.03g usec/op\t%s\n", "jp_memchr", #_size_, ((double)stop - start) / ((double)cycles), \
- (sresult) ? "found" : "not found"); \
- }
-
-#define STRCMP_TEST(_func_, _size_, _str_) \
- { \
- start = clock(); \
- for (i = 0; i < cycles; i++) { \
- iresult = _func_(_size_, _str_); \
- } \
- stop = clock(); \
- printf("%20s\t%10s\t%1.03g usec/op\t%s\n", #_func_, #_size_, ((double)stop - start) / ((double)cycles), \
- (sresult) ? "not matching" : "matching"); \
- }
-
-#define STRCPY_TEST(_func_, _size_) \
- { \
- char buf[1024]; \
- start = clock(); \
- for (i = 0; i < cycles; i++) { \
- sresult = _func_(buf, _size_); \
- } \
- stop = clock(); \
- printf("%20s\t%10s\t%1.03g usec/op\n", #_func_, #_size_, ((double)stop - start) / ((double)cycles)); \
- }
-
-#define MEMCPY_TEST(_func_, _size_, _len_) \
- { \
- char buf[1024]; \
- start = clock(); \
- for (i = 0; i < cycles; i++) { \
- sresult = (char *)_func_(buf, _size_, _len_); \
- } \
- stop = clock(); \
- printf("%20s\t%10s\t%10s\t%1.03g usec/op\n", #_func_, #_size_, #_len_, ((double)stop - start) / ((double)cycles)); \
- }
-
-/* version from ink_string.h */
-inline char *
-ink_strchr(char *s, char c)
-{
- while (*s) {
- if (*s == c)
- return (s);
- else
- ++s;
- }
- return (0);
-}
-
-inline char *
-ink_memcpy(char *d, char *s, int len)
-{
- for (int i = 0; i < len; i++)
- d[i] = s[i];
- return d;
-}
-
-/* version using ink_memchr */
-inline char *
-jp_strchr(char *s, char c)
-{
- return (char *)ink_memchr(s, c, strlen(s));
-}
-
-void
-strlen_tests()
-{
- printf("strlen:\n");
- STRLEN_TEST(strlen, small);
- STRLEN_TEST(strlen, medium);
- STRLEN_TEST(strlen, large);
- printf("\n");
-}
-
-void
-strchr_tests()
-{
- printf("strchr:\n");
- /* expect to find */
- STRCHR_TEST(strchr, small, '5');
- STRCHR_TEST(ink_strchr, small, '5');
- JP_MEMCHR_TEST(jp_memchr, small, '5', small_len);
- STRCHR_TEST(strchr, medium, '5');
- STRCHR_TEST(ink_strchr, medium, '5');
- JP_MEMCHR_TEST(jp_memchr, medium, '5', med_len);
- STRCHR_TEST(strchr, large, '5');
- STRCHR_TEST(ink_strchr, large, '5');
- JP_MEMCHR_TEST(jp_memchr, large, '5', large_len);
- /* expect NOT to find */
- STRCHR_TEST(strchr, small, 'x');
- STRCHR_TEST(ink_strchr, small, 'x');
- JP_MEMCHR_TEST(jp_memchr, small, 'x', small_len);
- STRCHR_TEST(strchr, medium, 'x');
- STRCHR_TEST(ink_strchr, medium, 'x');
- JP_MEMCHR_TEST(jp_memchr, medium, 'x', med_len);
- STRCHR_TEST(strchr, large, 'x');
- STRCHR_TEST(ink_strchr, large, 'x');
- JP_MEMCHR_TEST(jp_memchr, large, 'x', large_len);
- printf("\n");
-}
-
-void
-strcmp_tests()
-{
- printf("\nstrcmp:\n");
- /* expect to match */
- STRCMP_TEST(strcmp, small, small2);
- STRCMP_TEST(strcmp, medium, medium2);
- STRCMP_TEST(strcmp, large, large2);
- /* expect NOT to match */
- STRCMP_TEST(strcmp, small, "1xx");
- STRCMP_TEST(strcmp, medium, "1xx");
- STRCMP_TEST(strcmp, large, "1xx");
- printf("\n");
-}
-
-void
-strcpy_tests()
-{
- printf("\nstrcpy:\n");
- STRCPY_TEST(strcpy, small);
- STRCPY_TEST(strcpy, medium);
- STRCPY_TEST(strcpy, large);
- printf("\nmemcpy:\n");
- MEMCPY_TEST(memcpy, small, small_len);
- MEMCPY_TEST(memcpy, medium, med_len);
- MEMCPY_TEST(memcpy, large, large_len);
- MEMCPY_TEST(memcpy, small, SMALL_LEN);
- MEMCPY_TEST(memcpy, medium, MED_LEN);
- MEMCPY_TEST(memcpy, large, LARGE_LEN);
-
- MEMCPY_TEST(ink_memcpy, small, small_len);
- MEMCPY_TEST(ink_memcpy, medium, med_len);
- MEMCPY_TEST(ink_memcpy, large, large_len);
- MEMCPY_TEST(ink_memcpy, small, SMALL_LEN);
- MEMCPY_TEST(ink_memcpy, medium, MED_LEN);
- MEMCPY_TEST(ink_memcpy, large, LARGE_LEN);
- printf("\n");
-}
-
-int
-main(int argc, char *argv[])
-{
- if (argc < 2) {
- printf("usage: %s [cycles]\n", argv[0]);
- exit(0);
- }
- cycles = atoi(argv[1]);
- printf("%20s\t%10s\tspeed\n", "function", "str size");
- printf("--------------------\t----------\t------------------\n");
-
- strlen_tests();
- strchr_tests();
- strcmp_tests();
- strcpy_tests();
-}
-
-//
-// fast memchr
-//
-void *
-ink_memchr(const void *as, int ac, size_t an)
-{
- unsigned char c = (unsigned char)ac;
- unsigned char *s = (unsigned char *)as;
-
- // initial segment
-
- int i_len = (int)(((uintptr_t)8 - (uintptr_t)as) & 7);
-
- // too short to concern us
-
- if ((int)an < i_len) {
- for (int i = 0; i < (int)an; i++)
- if (s[i] == c)
- return &s[i];
- return 0;
- }
- // bytes 0-3
-
- switch (i_len & 3) {
- case 3:
- if (*s++ == c)
- return s - 1;
- case 2:
- if (*s++ == c)
- return s - 1;
- case 1:
- if (*s++ == c)
- return s - 1;
- case 0:
- break;
- }
-
- // bytes 4-8
-
- unsigned int ib = c;
- ib |= (ib << 8);
- ib |= (ib << 16);
- unsigned int im = 0x7efefeff;
- if (i_len & 4) {
- unsigned int ibp = *(unsigned int *)s;
- unsigned int ibb = ibp ^ ib;
- ibb = ((ibb + im) ^ ~ibb) & ~im;
- if (ibb) {
- if (s[0] == c)
- return &s[0];
- if (s[1] == c)
- return &s[1];
- if (s[2] == c)
- return &s[2];
- if (s[3] == c)
- return &s[3];
- }
- s += 4;
- }
- // next 8x bytes
- uint64_t m = 0x7efefefefefefeffLL;
- uint64_t b = ((uint64_t)ib);
- b |= (b << 32);
- uint64_t *p = (uint64_t *)s;
- unsigned int n = (((unsigned int)an) - (s - (unsigned char *)as)) >> 3;
- uint64_t *end = p + n;
- while (p < end) {
- uint64_t bp = *p;
- uint64_t bb = bp ^ b;
- bb = ((bb + m) ^ ~bb) & ~m;
- if (bb) {
- s = (unsigned char *)p;
- if (s[0] == c)
- return &s[0];
- if (s[1] == c)
- return &s[1];
- if (s[2] == c)
- return &s[2];
- if (s[3] == c)
- return &s[3];
- if (s[4] == c)
- return &s[4];
- if (s[5] == c)
- return &s[5];
- if (s[6] == c)
- return &s[6];
- if (s[7] == c)
- return &s[7];
- }
- p++;
- }
-
- // terminal segement
-
- i_len = an - (((unsigned char *)p) - ((unsigned char *)as));
- s = (unsigned char *)p;
-
- // n-(4..8)..n bytes
-
- if (i_len & 4) {
- unsigned int ibp = *(unsigned int *)s;
- unsigned int ibb = ibp ^ ib;
- ibb = ((ibb + im) ^ ~ibb) & ~im;
- if (ibb) {
- if (s[0] == c)
- return &s[0];
- if (s[1] == c)
- return &s[1];
- if (s[2] == c)
- return &s[2];
- if (s[3] == c)
- return &s[3];
- }
- s += 4;
- }
- // n-(0..3)..n bytes
-
- switch (i_len & 3) {
- case 3:
- if (*s++ == c)
- return s - 1;
- case 2:
- if (*s++ == c)
- return s - 1;
- case 1:
- if (*s++ == c)
- return s - 1;
- case 0:
- break;
- }
- return 0;
-}