197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes/*
297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Copyright (C) 2011 Google Inc.
397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes *
497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * you may not use this file except in compliance with the License.
697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * You may obtain a copy of the License at
797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes *
897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0
997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes *
1097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Unless required by applicable law or agreed to in writing, software
1197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
1297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * See the License for the specific language governing permissions and
1497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * limitations under the License.
1597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes */
1697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
1797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughespackage benchmarks.regression;
1897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
1997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport java.util.Locale;
2097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport com.google.caliper.Param;
2197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport com.google.caliper.SimpleBenchmark;
2297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
2397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughespublic class StringCaseMappingBenchmark extends SimpleBenchmark {
2497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    enum Inputs {
2597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        EMPTY(""),
2697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
2797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        // TODO: include hairy inputs like turkish and greek.
2897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        // TODO: locale makes a difference too.
2997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
3097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        LOWER2(lower(2)),
3197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        UPPER2(upper(2)),
3297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        MIXED2(mixed(2)),
3397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
3497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        LOWER8(lower(8)),
3597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        UPPER8(upper(8)),
3697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        MIXED8(mixed(8)),
3797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
3897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        LOWER32(lower(32)),
3997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        UPPER32(upper(32)),
4097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        MIXED32(mixed(32)),
4197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
4297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        LOWER512(lower(512)),
4397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        UPPER512(upper(512)),
4497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        MIXED512(mixed(512)),
4597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
4697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        LOWER2048(lower(2048)),
4797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        UPPER2048(upper(2048)),
4897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        MIXED2048(mixed(2048)),
4997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
5097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        LOWER_1M(lower(1024*1024)),
5197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        UPPER_1M(upper(1024*1024)),
5297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        MIXED_1M(mixed(1024*1024));
5397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
5497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        final String value;
5597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        private Inputs(String value) { this.value = value; }
5697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        private static String lower(int length) {
5797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            return makeString(length, "a0b1c2d3e4f5g6h7i8j9klmnopqrstuvwxyz");
5897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
5997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        private static String upper(int length) {
6097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            return makeString(length, "A0B1C2D3E4F5G6H7I8J9KLMNOPQRSTUVWXYZ");
6197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
6297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        private static String mixed(int length) {
6397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            return makeString(length, "Aa0Bb1Cc2Dd3Ee4Ff5Gg6Hh7Ii8Jj9KkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz");
6497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
6597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        private static String makeString(int length, String alphabet) {
6697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            StringBuilder sb = new StringBuilder(length);
6797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            for (int i = 0; i < length; ++i) {
6897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                sb.append(alphabet.charAt(i % alphabet.length()));
6997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            }
7097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            return sb.toString();
7197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
7297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
7397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    @Param private Inputs s;
7497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
7597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    public void timeToUpperCase_US(int reps) {
7697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        for (int i = 0; i < reps; ++i) {
7797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            s.value.toUpperCase(Locale.US);
7897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
7997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
8097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
8197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    public void timeToLowerCase_US(int reps) {
8297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        for (int i = 0; i < reps; ++i) {
8397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            s.value.toUpperCase(Locale.US);
8497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
8597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
8697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
8797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    public void timeToUpperCase_Ascii(int reps) {
8897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        for (int i = 0; i < reps; ++i) {
8997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            toUpperCaseAscii(s.value);
9097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
9197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
9297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
9397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    public void timeToLowerCase_Ascii(int reps) {
9497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        for (int i = 0; i < reps; ++i) {
9597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            toUpperCaseAscii(s.value);
9697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
9797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
9897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
9997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    public void timeToUpperCase_ICU(int reps) {
10097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        for (int i = 0; i < reps; ++i) {
10197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            libcore.icu.ICU.toUpperCase(s.value, Locale.US.toString());
10297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
10397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
10497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
10597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    public void timeToLowerCase_ICU(int reps) {
10697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        for (int i = 0; i < reps; ++i) {
10797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            libcore.icu.ICU.toLowerCase(s.value, Locale.US.toString());
10897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
10997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
11097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
11197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    public static String toUpperCaseAscii(String s) {
11297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        for (int i = 0, length = s.length(); i < length; i++) {
11397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            char c = s.charAt(i);
11497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            if (c < 'a' || c > 'z') {
11597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                continue; // fast path avoids allocation
11697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            }
11797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
11897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            // slow path: s contains lower case chars
11997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            char[] result = s.toCharArray();
12097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            for (; i < length; i++) {
12197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                c = result[i];
12297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                if (c >= 'a' && c <= 'z') {
12397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                    result[i] -= ('a' - 'A');
12497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                }
12597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            }
12697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            return new String(result);
12797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
12897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        return s;
12997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
13097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
13197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    public static String toLowerCaseAscii(String s) {
13297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        for (int i = 0, length = s.length(); i < length; i++) {
13397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            char c = s.charAt(i);
13497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            if (c < 'A' || c > 'Z') {
13597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                continue; // fast path avoids allocation
13697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            }
13797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes
13897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            // slow path: s contains upper case chars
13997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            char[] result = s.toCharArray();
14097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            for (; i < length; i++) {
14197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                c = result[i];
14297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                if (c >= 'A' && c <= 'Z') {
14397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                    result[i] += ('a' - 'A');
14497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes                }
14597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            }
14697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes            return new String(result);
14797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        }
14897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes        return s;
14997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes    }
15097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes}
151