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

Side by Side Diff: Source/wtf/text/StringImpl.cpp

Issue 1181013008: Optimize StringImpl::lower() for 8-bit strings (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 6 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 | Source/wtf/text/WTFStringTest.cpp » ('j') | Source/wtf/text/WTFStringTest.cpp » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller ( mueller@kde.org ) 4 * (C) 2001 Dirk Mueller ( mueller@kde.org )
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All r ights reserved. 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All r ights reserved.
6 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) 6 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net)
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 return U16_GET_SUPPLEMENTARY(characters16()[i], characters16()[i + 1]); 495 return U16_GET_SUPPLEMENTARY(characters16()[i], characters16()[i + 1]);
496 return 0; 496 return 0;
497 } 497 }
498 498
499 PassRefPtr<StringImpl> StringImpl::lower() 499 PassRefPtr<StringImpl> StringImpl::lower()
500 { 500 {
501 // Note: This is a hot function in the Dromaeo benchmark, specifically the 501 // Note: This is a hot function in the Dromaeo benchmark, specifically the
502 // no-op code path up through the first 'return' statement. 502 // no-op code path up through the first 'return' statement.
503 503
504 // First scan the string for uppercase and non-ASCII characters: 504 // First scan the string for uppercase and non-ASCII characters:
505 bool noUpper = true;
506 UChar ored = 0;
507 if (is8Bit()) { 505 if (is8Bit()) {
508 const LChar* end = characters8() + m_length; 506 unsigned needsLowering = m_length;
tkent 2015/06/15 01:12:56 The name |needsLowering| sounds a boolean. should
509 for (const LChar* chp = characters8(); chp != end; ++chp) { 507 for (unsigned i = 0; i < m_length; ++i) {
510 if (UNLIKELY(isASCIIUpper(*chp))) 508 LChar ch = characters8()[i];
511 noUpper = false; 509 if (UNLIKELY(isASCIIUpper(ch) || ch & ~0x7F)) {
512 ored |= *chp; 510 needsLowering = i;
511 break;
512 }
513 } 513 }
514
514 // Nothing to do if the string is all ASCII with no uppercase. 515 // Nothing to do if the string is all ASCII with no uppercase.
515 if (noUpper && !(ored & ~0x7F)) 516 if (needsLowering == m_length)
516 return this; 517 return this;
517 518
518 RELEASE_ASSERT(m_length <= static_cast<unsigned>(numeric_limits<int32_t> ::max())); 519 LChar* data8;
519 int32_t length = m_length; 520 RefPtr<StringImpl> newImpl = createUninitialized(m_length, data8);
521 memcpy(data8, characters8(), needsLowering);
520 522
521 LChar* data8; 523 for (unsigned i = needsLowering; i < m_length; ++i) {
522 RefPtr<StringImpl> newImpl = createUninitialized(length, data8); 524 LChar ch = characters8()[i];
523 525 data8[i] = UNLIKELY(ch & ~0x7F) ? static_cast<LChar>(Unicode::toLowe r(ch))
524 if (!(ored & ~0x7F)) { 526 : toASCIILower(ch);
525 for (int32_t i = 0; i < length; ++i)
526 data8[i] = toASCIILower(characters8()[i]);
527
528 return newImpl.release();
529 } 527 }
530 528
531 // Do a slower implementation for cases that include non-ASCII Latin-1 c haracters.
532 for (int32_t i = 0; i < length; ++i)
533 data8[i] = static_cast<LChar>(Unicode::toLower(characters8()[i]));
534
535 return newImpl.release(); 529 return newImpl.release();
536 } 530 }
537 531
532 bool noUpper = true;
533 UChar ored = 0;
534
538 const UChar* end = characters16() + m_length; 535 const UChar* end = characters16() + m_length;
539 for (const UChar* chp = characters16(); chp != end; ++chp) { 536 for (const UChar* chp = characters16(); chp != end; ++chp) {
540 if (UNLIKELY(isASCIIUpper(*chp))) 537 if (UNLIKELY(isASCIIUpper(*chp)))
541 noUpper = false; 538 noUpper = false;
542 ored |= *chp; 539 ored |= *chp;
543 } 540 }
544 // Nothing to do if the string is all ASCII with no uppercase. 541 // Nothing to do if the string is all ASCII with no uppercase.
545 if (noUpper && !(ored & ~0x7F)) 542 if (noUpper && !(ored & ~0x7F))
546 return this; 543 return this;
547 544
(...skipping 1575 matching lines...) Expand 10 before | Expand all | Expand 10 after
2123 } else if (localeIdMatchesLang(localeIdentifier, "lt")) { 2120 } else if (localeIdMatchesLang(localeIdentifier, "lt")) {
2124 // TODO(rob.buis) implement upper-casing rules for lt 2121 // TODO(rob.buis) implement upper-casing rules for lt
2125 // like in StringImpl::upper(locale). 2122 // like in StringImpl::upper(locale).
2126 } 2123 }
2127 } 2124 }
2128 2125
2129 return toUpper(c); 2126 return toUpper(c);
2130 } 2127 }
2131 2128
2132 } // namespace WTF 2129 } // namespace WTF
OLDNEW
« no previous file with comments | « no previous file | Source/wtf/text/WTFStringTest.cpp » ('j') | Source/wtf/text/WTFStringTest.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698