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

Side by Side Diff: runtime/lib/string_patch.dart

Issue 209443005: Add optimized _OneByteString.toLowerCase. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: length == 1 case Created 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | sdk/lib/io/http_parser.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 patch class String { 5 patch class String {
6 /* patch */ factory String.fromCharCodes(Iterable<int> charCodes) { 6 /* patch */ factory String.fromCharCodes(Iterable<int> charCodes) {
7 return _StringBase.createFromCharCodes(charCodes); 7 return _StringBase.createFromCharCodes(charCodes);
8 } 8 }
9 9
10 /* patch */ const factory String.fromEnvironment(String name, 10 /* patch */ const factory String.fromEnvironment(String name,
(...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after
771 } else { 771 } else {
772 for (int i = 0; i < delta; i++) { 772 for (int i = 0; i < delta; i++) {
773 for (int j = 0; j < padLength; j++) { 773 for (int j = 0; j < padLength; j++) {
774 result._setAt(index++, padding.codeUnitAt(j)); 774 result._setAt(index++, padding.codeUnitAt(j));
775 } 775 }
776 } 776 }
777 } 777 }
778 return result; 778 return result;
779 } 779 }
780 780
781 // Lower-case conversion table for Latin-1.
782 static const _LC_TABLE = const [
783 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
srdjan 2014/03/25 20:05:37 Why not Uin8List instead? Any performance differen
Anders Johnsen 2014/03/25 20:10:46 I tried, and saw a minor slowdown with a HTTP benc
Lasse Reichstein Nielsen 2014/03/25 20:33:57 It can't be const then, so it will be lazily initi
srdjan 2014/03/25 20:37:15 A static final is quite efficient. Once the optimi
Anders Johnsen 2014/03/25 20:38:26 Putting it into a local final var made it even slo
784 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
785 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
786 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
787 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
788 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
789 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
790 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
791 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
792 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
793 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
794 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
795 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
796 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
797 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
798 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
799 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
800 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
801 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
802 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
803 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
804 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
805 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
806 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
807 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
808 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
809 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7,
810 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf,
811 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
812 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
813 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
814 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
815 ];
816
817 String _toLowerCaseUpperCaseDetected(int firstUpperCaseIndex) {
srdjan 2014/03/25 20:05:37 _toLowerCaseUpperCaseDetectedAt
Lasse Reichstein Nielsen 2014/03/25 20:10:12 The "At" doesn't add anything when the parameter i
Anders Johnsen 2014/03/25 20:10:46 Done.
Anders Johnsen 2014/03/25 20:12:26 No, but it makes the call-site more clear.
srdjan 2014/03/25 20:14:49 It is all about reading the code at call site, whe
818 // String contains upper case characters. Create a new string.
819 final length = this.length;
820 final result = _allocate(length);
821 // First up to firstUpperIndex.
822 int i = 0;
823 for (; i < firstUpperCaseIndex; i++) {
824 result._setAt(i, this.codeUnitAt(i));
825 }
Lasse Reichstein Nielsen 2014/03/25 20:10:12 I tried this split into "known non-uppercase" and
Anders Johnsen 2014/03/25 20:12:26 Will try!
srdjan 2014/03/25 20:14:49 We need to run the benchmarks on a typical set of
826 for (; i < length; i++) {
827 result._setAt(i, _LC_TABLE[this.codeUnitAt(i)]);
828 }
829 if (length == 1) {
830 return result[0];
Lasse Reichstein Nielsen 2014/03/25 20:10:12 I don't think this is necessary. I haven't done it
Anders Johnsen 2014/03/25 20:12:26 But it it fetches the right 'symbol' object? Srdj
srdjan 2014/03/25 20:14:49 I'd remove it.
Anders Johnsen 2014/03/25 20:26:06 Done.
831 }
832 return result;
833 }
834
835 String toLowerCase() {
836 for (int i = 0; i < this.length; i++) {
837 final c = this.codeUnitAt(i);
838 // Ranges: 0x41-0x5a ('A' - 'Z'), 0xc0-0xd6, 0xd8-0xde.
839 if (c != _LC_TABLE[c]) {
840 return _toLowerCaseUpperCaseDetected(i);
841 }
842 }
843 return this;
844 }
845
781 // Allocates a string of given length, expecting its content to be 846 // Allocates a string of given length, expecting its content to be
782 // set using _setAt. 847 // set using _setAt.
783 static _OneByteString _allocate(int length) native "OneByteString_allocate"; 848 static _OneByteString _allocate(int length) native "OneByteString_allocate";
784 849
785 850
786 static _OneByteString _allocateFromOneByteList(List<int> list) 851 static _OneByteString _allocateFromOneByteList(List<int> list)
787 native "OneByteString_allocateFromOneByteList"; 852 native "OneByteString_allocateFromOneByteList";
788 853
789 // This is internal helper method. Code point value must be a valid 854 // This is internal helper method. Code point value must be a valid
790 // Latin1 value (0..0xFF), index must be valid. 855 // Latin1 value (0..0xFF), index must be valid.
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
881 class _CodeUnits extends Object with ListMixin<int>, 946 class _CodeUnits extends Object with ListMixin<int>,
882 UnmodifiableListMixin<int> { 947 UnmodifiableListMixin<int> {
883 /** The string that this is the code units of. */ 948 /** The string that this is the code units of. */
884 String _string; 949 String _string;
885 950
886 _CodeUnits(this._string); 951 _CodeUnits(this._string);
887 952
888 int get length => _string.length; 953 int get length => _string.length;
889 int operator[](int i) => _string.codeUnitAt(i); 954 int operator[](int i) => _string.codeUnitAt(i);
890 } 955 }
OLDNEW
« no previous file with comments | « no previous file | sdk/lib/io/http_parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698