diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2012-10-04 20:59:45 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2012-10-04 20:59:45 (GMT) |
commit | 770e19e0cc1da8a8356613f7d146fa3d0ff8e037 (patch) | |
tree | cd489f5e9abc9310a4a5148b0e00ad48f938cf03 /Objects | |
parent | 90db9c47dca4d105835386fc57d46472b0836820 (diff) | |
download | cpython-770e19e0cc1da8a8356613f7d146fa3d0ff8e037.zip cpython-770e19e0cc1da8a8356613f7d146fa3d0ff8e037.tar.gz cpython-770e19e0cc1da8a8356613f7d146fa3d0ff8e037.tar.bz2 |
Optimize unicode_compare(): use memcmp() when comparing two UCS1 strings
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/unicodeobject.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index b84d888..c28d180 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10443,7 +10443,8 @@ unicode_compare(PyObject *str1, PyObject *str2) { int kind1, kind2; void *data1, *data2; - Py_ssize_t len1, len2, i; + Py_ssize_t len1, len2; + Py_ssize_t i, len; /* a string is equal to itself */ if (str1 == str2) @@ -10455,17 +10456,33 @@ unicode_compare(PyObject *str1, PyObject *str2) data2 = PyUnicode_DATA(str2); len1 = PyUnicode_GET_LENGTH(str1); len2 = PyUnicode_GET_LENGTH(str2); + len = Py_MIN(len1, len2); - for (i = 0; i < len1 && i < len2; ++i) { - Py_UCS4 c1, c2; - c1 = PyUnicode_READ(kind1, data1, i); - c2 = PyUnicode_READ(kind2, data2, i); + if (kind1 == 1 && kind2 == 1) { + int cmp = memcmp(data1, data2, len); + /* normalize result of memcmp() into the range [-1; 1] */ + if (cmp < 0) + return -1; + if (cmp > 0) + return 1; + } + else { + for (i = 0; i < len; ++i) { + Py_UCS4 c1, c2; + c1 = PyUnicode_READ(kind1, data1, i); + c2 = PyUnicode_READ(kind2, data2, i); - if (c1 != c2) - return (c1 < c2) ? -1 : 1; + if (c1 != c2) + return (c1 < c2) ? -1 : 1; + } } - return (len1 < len2) ? -1 : (len1 != len2); + if (len1 == len2) + return 0; + if (len1 < len2) + return -1; + else + return 1; } int |