OSDN Git Service

QuickSearchを最適化した
authorkonekoneko <test2214@hotmail.co.jp>
Thu, 14 Aug 2014 17:13:36 +0000 (02:13 +0900)
committerkonekoneko <test2214@hotmail.co.jp>
Thu, 14 Aug 2014 17:13:36 +0000 (02:13 +0900)
Common/StringBuffer.cs

index 239228c..da718e4 100644 (file)
@@ -234,38 +234,71 @@ namespace FooEditEngine
             int plen = this.patternLength;\r
             int i = start;\r
             int end = buf.Count - plen;\r
-            while (i <= end)\r
+            //最適化のためわざとコピペした\r
+            if (this.caseInsenstive)\r
             {\r
-                int j = 0;\r
-                while (j < plen)\r
+                while (i <= end)\r
                 {\r
-                    bool unmatch;\r
-                    if (this.caseInsenstive)\r
-                        unmatch = CharTool.ToUpperFastIf(buf[i + j]) != this.pattern[j];\r
+                    int j = 0;\r
+                    while (j < plen)\r
+                    {\r
+                        if (CharTool.ToUpperFastIf(buf[i + j]) != this.pattern[j])\r
+                            break;\r
+                        j++;\r
+                    }\r
+                    if (j == plen)\r
+                    {\r
+                        return i;\r
+                    }\r
                     else\r
-                        unmatch = buf[i + j] != this.pattern[j];\r
-                    if (unmatch)\r
-                        break;\r
-                    j++;\r
-                }\r
-                if (j == plen)\r
-                {\r
-                    return i;\r
+                    {\r
+                        int k = i + plen;\r
+                        if (k <= buflen)       //buffer以降にアクセスする可能性がある\r
+                        {\r
+                            int moveDelta;\r
+                            if (this.qsTable.TryGetValue(buf[k], out moveDelta))\r
+                                i += moveDelta;\r
+                            else\r
+                                i += plen;\r
+                        }\r
+                        else\r
+                        {\r
+                            break;\r
+                        }\r
+                    }\r
                 }\r
-                else\r
+\r
+            }\r
+            else\r
+            {\r
+                while (i <= end)\r
                 {\r
-                    int k = i + plen;\r
-                    if (k <= buflen)   //buffer以降にアクセスする可能性がある\r
+                    int j = 0;\r
+                    while (j < plen)\r
                     {\r
-                        int moveDelta;\r
-                        if (this.qsTable.TryGetValue(buf[k], out moveDelta))\r
-                            i += moveDelta;\r
-                        else\r
-                            i += plen;\r
+                        if (buf[i + j] != this.pattern[j])\r
+                            break;\r
+                        j++;\r
+                    }\r
+                    if (j == plen)\r
+                    {\r
+                        return i;\r
                     }\r
                     else\r
                     {\r
-                        break;\r
+                        int k = i + plen;\r
+                        if (k <= buflen)       //buffer以降にアクセスする可能性がある\r
+                        {\r
+                            int moveDelta;\r
+                            if (this.qsTable.TryGetValue(buf[k], out moveDelta))\r
+                                i += moveDelta;\r
+                            else\r
+                                i += plen;\r
+                        }\r
+                        else\r
+                        {\r
+                            break;\r
+                        }\r
                     }\r
                 }\r
             }\r