2009-05-19 Maciej Stachowiak <mjs@apple.com>
authormjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 May 2009 08:01:22 +0000 (08:01 +0000)
committermjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 May 2009 08:01:22 +0000 (08:01 +0000)
        Reviewed by Gavin Barraclough.

        - speed up string comparison, especially for short strings

        ~1% on SunSpider

        * JavaScriptCore.exp:
        * runtime/UString.cpp:
        * runtime/UString.h:
        (JSC::operator==): Inline UString's operator==, since it is called from
        hot places in the runtime. Also, specialize 2-char strings in a similar way to
        1-char, since we're taking the hit of a switch anyway.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@43856 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/JavaScriptCore.exp
JavaScriptCore/runtime/UString.cpp
JavaScriptCore/runtime/UString.h

index eb72a3890c1ed1d40600c767e82fb4fa86a99689..a582f81b165ee97650fdd923f85930318ca80952 100644 (file)
@@ -1,3 +1,18 @@
+2009-05-19  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Gavin Barraclough.
+        
+        - speed up string comparison, especially for short strings
+        
+        ~1% on SunSpider
+
+        * JavaScriptCore.exp:
+        * runtime/UString.cpp:
+        * runtime/UString.h:
+        (JSC::operator==): Inline UString's operator==, since it is called from
+        hot places in the runtime. Also, specialize 2-char strings in a similar way to
+        1-char, since we're taking the hit of a switch anyway.
+
 2009-05-18  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Gavin Barraclough.
index c17a869a3cba4cd769510ba0cd18ef61443a91bb..86da732f7038f9d53c562172af825d83c94e1efd 100644 (file)
@@ -271,7 +271,6 @@ __ZN3JSC9StructureC1ENS_7JSValueERKNS_8TypeInfoE
 __ZN3JSC9StructureD1Ev
 __ZN3JSC9constructEPNS_9ExecStateENS_7JSValueENS_13ConstructTypeERKNS_13ConstructDataERKNS_7ArgListE
 __ZN3JSCeqERKNS_7UStringEPKc
-__ZN3JSCeqERKNS_7UStringES2_
 __ZN3JSCgtERKNS_7UStringES2_
 __ZN3JSCltERKNS_7UStringES2_
 __ZN3WTF10fastCallocEmm
index e2d641f7ebef1f83f1b0b3029e0cc93a0ff58836..eb6a57c0afb25897c8f658d4fca6306ffbe34c3a 100644 (file)
@@ -1566,19 +1566,6 @@ UString UString::substr(int pos, int len) const
     return UString(Rep::create(m_rep, pos, len));
 }
 
-bool operator==(const UString& s1, const UString& s2)
-{
-    int size = s1.size();
-    switch (size) {
-        case 0:
-            return !s2.size();
-        case 1:
-            return s2.size() == 1 && s1.data()[0] == s2.data()[0];
-        default:
-            return s2.size() == size && memcmp(s1.data(), s2.data(), size * sizeof(UChar)) == 0;
-    }
-}
-
 bool operator==(const UString& s1, const char *s2)
 {
     if (s2 == 0)
index 36a8fd3934338224473be28dcad2d5af1455606e..9384d600c02534138cbcbfeb8248980a00eb2e80 100644 (file)
@@ -355,7 +355,26 @@ namespace JSC {
     PassRefPtr<UString::Rep> concatenate(UString::Rep*, int);
     PassRefPtr<UString::Rep> concatenate(UString::Rep*, double);
 
-    bool operator==(const UString&, const UString&);
+    inline bool operator==(const UString& s1, const UString& s2)
+    {
+        int size = s1.size();
+        switch (size) {
+        case 0:
+            return !s2.size();
+        case 1:
+            return s2.size() == 1 && s1.data()[0] == s2.data()[0];
+        case 2: {
+            if (s2.size() != 2)
+                return false;
+            const UChar* d1 = s1.data();
+            const UChar* d2 = s2.data();
+            return (d1[0] == d2[0]) & (d1[1] == d2[1]);
+        }
+        default:
+            return s2.size() == size && memcmp(s1.data(), s2.data(), size * sizeof(UChar)) == 0;
+        }
+    }
+
 
     inline bool operator!=(const UString& s1, const UString& s2)
     {