Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Side by Side Diff: src/runtime.cc

Issue 1100002: String search performance improvements: (Closed)
Patch Set: Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 2335 matching lines...) Expand 10 before | Expand all | Expand 10 after
2346 } 2346 }
2347 2347
2348 return -1; 2348 return -1;
2349 } 2349 }
2350 2350
2351 2351
2352 template <typename schar> 2352 template <typename schar>
2353 static inline int SingleCharIndexOf(Vector<const schar> string, 2353 static inline int SingleCharIndexOf(Vector<const schar> string,
2354 schar pattern_char, 2354 schar pattern_char,
2355 int start_index) { 2355 int start_index) {
2356 if (sizeof(schar) == 1) {
2357 schar* pos = reinterpret_cast<schar*>(
2358 memchr(string.start() + start_index,
2359 pattern_char,
2360 string.length() - start_index));
2361 if (pos == NULL) return -1;
2362 return pos - string.start();
2363 }
2356 for (int i = start_index, n = string.length(); i < n; i++) { 2364 for (int i = start_index, n = string.length(); i < n; i++) {
2357 if (pattern_char == string[i]) { 2365 if (pattern_char == string[i]) {
2358 return i; 2366 return i;
2359 } 2367 }
2360 } 2368 }
2361 return -1; 2369 return -1;
2362 } 2370 }
2363 2371
2364 2372
2365 template <typename schar> 2373 template <typename schar>
(...skipping 27 matching lines...) Expand all
2393 2401
2394 // We know our pattern is at least 2 characters, we cache the first so 2402 // We know our pattern is at least 2 characters, we cache the first so
2395 // the common case of the first character not matching is faster. 2403 // the common case of the first character not matching is faster.
2396 pchar pattern_first_char = pattern[0]; 2404 pchar pattern_first_char = pattern[0];
2397 for (int i = idx, n = subject.length() - pattern.length(); i <= n; i++) { 2405 for (int i = idx, n = subject.length() - pattern.length(); i <= n; i++) {
2398 badness++; 2406 badness++;
2399 if (badness > 0) { 2407 if (badness > 0) {
2400 *complete = false; 2408 *complete = false;
2401 return i; 2409 return i;
2402 } 2410 }
2403 if (subject[i] != pattern_first_char) continue; 2411 if (sizeof(schar) == 1 && sizeof(pchar) == 1) {
2412 schar* pos = reinterpret_cast<schar*>(memchr(subject.start() + i,
2413 pattern_first_char,
2414 n - i + 1));
2415 if (pos == NULL) {
2416 *complete = true;
2417 return -1;
2418 }
2419 i = pos - subject.start();
2420 } else {
2421 if (subject[i] != pattern_first_char) continue;
2422 }
2404 int j = 1; 2423 int j = 1;
2405 do { 2424 do {
2406 if (pattern[j] != subject[i+j]) { 2425 if (pattern[j] != subject[i+j]) {
2407 break; 2426 break;
2408 } 2427 }
2409 j++; 2428 j++;
2410 } while (j < pattern.length()); 2429 } while (j < pattern.length());
2411 if (j == pattern.length()) { 2430 if (j == pattern.length()) {
2412 *complete = true; 2431 *complete = true;
2413 return i; 2432 return i;
2414 } 2433 }
2415 badness += j; 2434 badness += j;
2416 } 2435 }
2417 *complete = true; 2436 *complete = true;
2418 return -1; 2437 return -1;
2419 } 2438 }
2420 2439
2421 // Simple indexOf that never bails out. For short patterns only. 2440 // Simple indexOf that never bails out. For short patterns only.
2422 template <typename pchar, typename schar> 2441 template <typename pchar, typename schar>
2423 static int SimpleIndexOf(Vector<const schar> subject, 2442 static int SimpleIndexOf(Vector<const schar> subject,
2424 Vector<const pchar> pattern, 2443 Vector<const pchar> pattern,
2425 int idx) { 2444 int idx) {
2426 pchar pattern_first_char = pattern[0]; 2445 pchar pattern_first_char = pattern[0];
2427 for (int i = idx, n = subject.length() - pattern.length(); i <= n; i++) { 2446 for (int i = idx, n = subject.length() - pattern.length(); i <= n; i++) {
2428 if (subject[i] != pattern_first_char) continue; 2447 if (sizeof(schar) == 1 && sizeof(pchar) == 1) {
2448 schar* pos = reinterpret_cast<schar*>(memchr(subject.start() + i,
2449 pattern_first_char,
2450 n - i + 1));
2451 if (pos == NULL) return -1;
2452 i = pos - subject.start();
2453 } else {
2454 if (subject[i] != pattern_first_char) continue;
2455 }
2429 int j = 1; 2456 int j = 1;
2430 do { 2457 do {
2431 if (pattern[j] != subject[i+j]) { 2458 if (pattern[j] != subject[i+j]) {
2432 break; 2459 break;
2433 } 2460 }
2434 j++; 2461 j++;
2435 } while (j < pattern.length()); 2462 } while (j < pattern.length());
2436 if (j == pattern.length()) { 2463 if (j == pattern.length()) {
2437 return i; 2464 return i;
2438 } 2465 }
(...skipping 6934 matching lines...) Expand 10 before | Expand all | Expand 10 after
9373 } else { 9400 } else {
9374 // Handle last resort GC and make sure to allow future allocations 9401 // Handle last resort GC and make sure to allow future allocations
9375 // to grow the heap without causing GCs (if possible). 9402 // to grow the heap without causing GCs (if possible).
9376 Counters::gc_last_resort_from_js.Increment(); 9403 Counters::gc_last_resort_from_js.Increment();
9377 Heap::CollectAllGarbage(false); 9404 Heap::CollectAllGarbage(false);
9378 } 9405 }
9379 } 9406 }
9380 9407
9381 9408
9382 } } // namespace v8::internal 9409 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698