1395d429a59d731d654de24e91993485b3531a3eeagicsaki/*
2395d429a59d731d654de24e91993485b3531a3eeagicsaki * Copyright (C) 2015 Google Inc.
3395d429a59d731d654de24e91993485b3531a3eeagicsaki *
4395d429a59d731d654de24e91993485b3531a3eeagicsaki * Licensed under the Apache License, Version 2.0 (the "License");
5395d429a59d731d654de24e91993485b3531a3eeagicsaki * you may not use this file except in compliance with the License.
6395d429a59d731d654de24e91993485b3531a3eeagicsaki * You may obtain a copy of the License at
7395d429a59d731d654de24e91993485b3531a3eeagicsaki *
8395d429a59d731d654de24e91993485b3531a3eeagicsaki * http://www.apache.org/licenses/LICENSE-2.0
9395d429a59d731d654de24e91993485b3531a3eeagicsaki *
10395d429a59d731d654de24e91993485b3531a3eeagicsaki * Unless required by applicable law or agreed to in writing, software
11395d429a59d731d654de24e91993485b3531a3eeagicsaki * distributed under the License is distributed on an "AS IS" BASIS,
12395d429a59d731d654de24e91993485b3531a3eeagicsaki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13395d429a59d731d654de24e91993485b3531a3eeagicsaki * See the License for the specific language governing permissions and
14395d429a59d731d654de24e91993485b3531a3eeagicsaki * limitations under the License.
15395d429a59d731d654de24e91993485b3531a3eeagicsaki */
16395d429a59d731d654de24e91993485b3531a3eeagicsaki
17395d429a59d731d654de24e91993485b3531a3eeagicsakipackage benchmarks.regression;
18395d429a59d731d654de24e91993485b3531a3eeagicsaki
19ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffinimport com.google.caliper.BeforeExperiment;
20395d429a59d731d654de24e91993485b3531a3eeagicsakiimport junit.framework.Assert;
21395d429a59d731d654de24e91993485b3531a3eeagicsaki
22395d429a59d731d654de24e91993485b3531a3eeagicsaki/**
23395d429a59d731d654de24e91993485b3531a3eeagicsaki * Benchmarks to measure the performance of String.equals for Strings of varying lengths.
24395d429a59d731d654de24e91993485b3531a3eeagicsaki * Each benchmarks makes 5 measurements, aiming at covering cases like strings of equal length
25395d429a59d731d654de24e91993485b3531a3eeagicsaki * that are not equal, identical strings with different references, strings with different endings,
26395d429a59d731d654de24e91993485b3531a3eeagicsaki * interned strings, and strings of different lengths.
27395d429a59d731d654de24e91993485b3531a3eeagicsaki */
28ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffinpublic class StringEqualsBenchmark {
29395d429a59d731d654de24e91993485b3531a3eeagicsaki    private final String long1 = "Ahead-of-time compilation is possible as the compiler may just"
30395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "convert an instruction thus: dex code: add-int v1000, v2000, v3000 C code: setIntRegter"
31395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "(1000, call_dex_add_int(getIntRegister(2000), getIntRegister(3000)) This means even lid"
32395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "instructions may have code generated, however, it is not expected that code generate in"
33395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "this way will perform well. The job of AOT verification is to tell the compiler that"
34395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "instructions are sound and provide tests to detect unsound sequences so slow path code"
35395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "may be generated. Other than for totally invalid code, the verification may fail at AOr"
36395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "run-time. At AOT time it can be because of incomplete information, at run-time it can e"
37395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "that code in a different apk that the application depends upon has changed. The Dalvik"
38395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "verifier would return a bool to state whether a Class were good or bad. In ART the fail"
39395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "case becomes either a soft or hard failure. Classes have new states to represent that a"
40395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "soft failure occurred at compile time and should be re-verified at run-time.";
41395d429a59d731d654de24e91993485b3531a3eeagicsaki
42395d429a59d731d654de24e91993485b3531a3eeagicsaki    private final String veryLong = "Garbage collection has two phases. The first distinguishes"
43395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "live objects from garbage objects.  The second is reclaiming the rage of garbage object"
44395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "In the mark-sweep algorithm used by Dalvik, the first phase is achievd by computing the"
45395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "closure of all reachable objects in a process known as tracing from theoots.  After the"
46395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "trace has completed, garbage objects are reclaimed.  Each of these operations can be"
47395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "parallelized and can be interleaved with the operation of the applicationTraditionally,"
48395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "the tracing phase dominates the time spent in garbage collection.  The greatreduction i"
49395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "pause time can be achieved by interleaving as much of this phase as possible with the"
50395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "application. If we simply ran the GC in a separate thread with no other changes, normal"
51395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "operation of an application would confound the trace.  Abstractly, the GC walks the h o"
52395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "all reachable objects.  When the application is paused, the object graph cannot change."
53395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "The GC can therefore walk this structure and assume that all reachable objects live."
54395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "When the application is running, this graph may be altered. New nodes may be addnd edge"
55395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "may be changed.  These changes may cause live objects to be hidden and falsely recla by"
56395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "the GC.  To avoid this problem a write barrier is used to intercept and record modifion"
57395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "to objects in a separate structure.  After performing its walk, the GC will revisit the"
58395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "updated objects and re-validate its assumptions.  Without a card table, the garbage"
59395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "collector would have to visit all objects reached during the trace looking for dirtied"
60395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "objects.  The cost of this operation would be proportional to the amount of live data."
61395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "With a card table, the cost of this operation is proportional to the amount of updateat"
62395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "The write barrier in Dalvik is a card marking write barrier.  Card marking is the proce"
63395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "of noting the location of object connectivity changes on a sub-page granularity.  A car"
64395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "is merely a colorful term for a contiguous extent of memory smaller than a page, common"
65395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "somewhere between 128- and 512-bytes.  Card marking is implemented by instrumenting all"
66395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "locations in the virtual machine which can assign a pointer to an object.  After themal"
67395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "pointer assignment has occurred, a byte is written to a byte-map spanning the heap whic"
68395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "corresponds to the location of the updated object.  This byte map is known as a card ta"
69395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "The garbage collector visits this card table and looks for written bytes to reckon the"
70395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "location of updated objects.  It then rescans all objects located on the dirty card,"
71395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "correcting liveness assumptions that were invalidated by the application.  While card"
72395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "marking imposes a small burden on the application outside of a garbage collection, the"
73395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "overhead of maintaining the card table is paid for by the reduced time spent inside"
74395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "garbage collection. With the concurrent garbage collection thread and a write barrier"
75395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "supported by the interpreter, JIT, and Runtime we modify garbage collection";
76395d429a59d731d654de24e91993485b3531a3eeagicsaki
77395d429a59d731d654de24e91993485b3531a3eeagicsaki    private final String[][] shortStrings = new String[][] {
78395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Equal, constant comparison
79395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "a", "a" },
80395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, first character different
81395d429a59d731d654de24e91993485b3531a3eeagicsaki        { ":", " :"},
82395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, last character different, same length
83395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "ja M", "ja N"},
84395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, different lengths
85395d429a59d731d654de24e91993485b3531a3eeagicsaki        {"$$$", "$$"},
86395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Force execution of code beyond reference equality check
87395d429a59d731d654de24e91993485b3531a3eeagicsaki        {"hi", new String("hi")}
88395d429a59d731d654de24e91993485b3531a3eeagicsaki    };
89395d429a59d731d654de24e91993485b3531a3eeagicsaki
90395d429a59d731d654de24e91993485b3531a3eeagicsaki    private final String[][] mediumStrings = new String[][] {
91395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Equal, constant comparison
92395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "Hello my name is ", "Hello my name is " },
93395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, different lengths
94395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "What's your name?", "Whats your name?" },
95395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Force execution of code beyond reference equality check
96395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "Android Runtime", new String("Android Runtime") },
97395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, last character different, same length
98395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "v3ry Cre@tiVe?****", "v3ry Cre@tiVe?***." },
99395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, first character different, same length
100395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "!@#$%^&*()_++*^$#@", "0@#$%^&*()_++*^$#@" }
101395d429a59d731d654de24e91993485b3531a3eeagicsaki    };
102395d429a59d731d654de24e91993485b3531a3eeagicsaki
103395d429a59d731d654de24e91993485b3531a3eeagicsaki    private final String[][] longStrings = new String[][] {
104395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Force execution of code beyond reference equality check
105395d429a59d731d654de24e91993485b3531a3eeagicsaki        { long1, new String(long1) },
106395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, last character different, same length
107395d429a59d731d654de24e91993485b3531a3eeagicsaki        { long1 + "fun!", long1 + "----" },
108395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Equal, constant comparison
109395d429a59d731d654de24e91993485b3531a3eeagicsaki        { long1 + long1, long1 + long1 },
110395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, different lengths
111395d429a59d731d654de24e91993485b3531a3eeagicsaki        { long1 + "123456789", long1 + "12345678" },
112395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, first character different, same length
113395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "Android Runtime" + long1, "android Runtime" + long1 }
114395d429a59d731d654de24e91993485b3531a3eeagicsaki    };
115395d429a59d731d654de24e91993485b3531a3eeagicsaki
116395d429a59d731d654de24e91993485b3531a3eeagicsaki    private final String[][] veryLongStrings = new String[][] {
117395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Force execution of code beyond reference equality check
118395d429a59d731d654de24e91993485b3531a3eeagicsaki        { veryLong, new String(veryLong) },
119395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, different lengths
120395d429a59d731d654de24e91993485b3531a3eeagicsaki        { veryLong + veryLong, veryLong + " " + veryLong },
121395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Equal, constant comparison
122395d429a59d731d654de24e91993485b3531a3eeagicsaki        { veryLong + veryLong + veryLong, veryLong + veryLong + veryLong },
123395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, last character different, same length
124395d429a59d731d654de24e91993485b3531a3eeagicsaki        { veryLong + "77777", veryLong + "99999" },
125395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, first character different
126395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "Android Runtime" + veryLong, "android Runtime" + veryLong }
127395d429a59d731d654de24e91993485b3531a3eeagicsaki    };
128395d429a59d731d654de24e91993485b3531a3eeagicsaki
129395d429a59d731d654de24e91993485b3531a3eeagicsaki    private final String[][] endStrings = new String[][] {
130395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, medium but different lengths
131395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "Hello", "Hello " },
132395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, long but different lengths
133395d429a59d731d654de24e91993485b3531a3eeagicsaki        { long1, long1 + "x"},
134395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, very long but different lengths
135395d429a59d731d654de24e91993485b3531a3eeagicsaki        { veryLong, veryLong + "?"},
136395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, same medium lengths
137395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "How are you doing today?", "How are you doing today " },
138395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different constants, short but different lengths
139395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "1", "1." }
140395d429a59d731d654de24e91993485b3531a3eeagicsaki    };
141395d429a59d731d654de24e91993485b3531a3eeagicsaki
142395d429a59d731d654de24e91993485b3531a3eeagicsaki    private final String tmpStr1 = "012345678901234567890"
143395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "0123456789012345678901234567890123456789"
144395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "0123456789012345678901234567890123456789"
145395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "0123456789012345678901234567890123456789"
146395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "0123456789012345678901234567890123456789";
147395d429a59d731d654de24e91993485b3531a3eeagicsaki
148395d429a59d731d654de24e91993485b3531a3eeagicsaki    private final String tmpStr2 = "z012345678901234567890"
149395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "0123456789012345678901234567890123456789"
150395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "0123456789012345678901234567890123456789"
151395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "0123456789012345678901234567890123456789"
152395d429a59d731d654de24e91993485b3531a3eeagicsaki        + "012345678901234567890123456789012345678x";
153395d429a59d731d654de24e91993485b3531a3eeagicsaki
154395d429a59d731d654de24e91993485b3531a3eeagicsaki    private final String[][] nonalignedStrings = new String[][] {
155395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different non-word aligned medium length strings
156395d429a59d731d654de24e91993485b3531a3eeagicsaki        { tmpStr1, tmpStr1.substring(1) },
157395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different differently non-word aligned medium length strings
158395d429a59d731d654de24e91993485b3531a3eeagicsaki        { tmpStr2, tmpStr2.substring(2) },
159395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different non-word aligned long length strings
160395d429a59d731d654de24e91993485b3531a3eeagicsaki        { long1, long1.substring(3) },
161395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Different non-word aligned very long length strings
162395d429a59d731d654de24e91993485b3531a3eeagicsaki        { veryLong, veryLong.substring(1) },
163395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Equal non-word aligned constant strings
164395d429a59d731d654de24e91993485b3531a3eeagicsaki        { "hello", "hello".substring(1) }
165395d429a59d731d654de24e91993485b3531a3eeagicsaki    };
166395d429a59d731d654de24e91993485b3531a3eeagicsaki
167395d429a59d731d654de24e91993485b3531a3eeagicsaki    private final Object[] objects = new Object[] {
168395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Compare to Double object
169395d429a59d731d654de24e91993485b3531a3eeagicsaki        new Double(1.5),
170395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Compare to Integer object
171395d429a59d731d654de24e91993485b3531a3eeagicsaki        new Integer(9999999),
172395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Compare to String array
173395d429a59d731d654de24e91993485b3531a3eeagicsaki        new String[] {"h", "i"},
174395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Compare to int array
175395d429a59d731d654de24e91993485b3531a3eeagicsaki        new int[] {1, 2, 3},
176395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Compare to Character object
177395d429a59d731d654de24e91993485b3531a3eeagicsaki        new Character('a')
178395d429a59d731d654de24e91993485b3531a3eeagicsaki    };
179395d429a59d731d654de24e91993485b3531a3eeagicsaki
180395d429a59d731d654de24e91993485b3531a3eeagicsaki    // Check assumptions about how the compiler, new String(String), and String.intern() work.
181395d429a59d731d654de24e91993485b3531a3eeagicsaki    // Any failures here would invalidate these benchmarks.
182ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffin    @BeforeExperiment
183ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffin    protected void setUp() throws Exception {
184395d429a59d731d654de24e91993485b3531a3eeagicsaki        // String constants are the same object
185395d429a59d731d654de24e91993485b3531a3eeagicsaki        Assert.assertSame("abc", "abc");
186395d429a59d731d654de24e91993485b3531a3eeagicsaki        // new String(String) makes a copy
187395d429a59d731d654de24e91993485b3531a3eeagicsaki        Assert.assertNotSame("abc" , new String("abc"));
188395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Interned strings are treated like constants, so it is not necessary to
189395d429a59d731d654de24e91993485b3531a3eeagicsaki        // separately benchmark interned strings.
190395d429a59d731d654de24e91993485b3531a3eeagicsaki        Assert.assertSame("abc", "abc".intern());
191395d429a59d731d654de24e91993485b3531a3eeagicsaki        Assert.assertSame("abc", new String("abc").intern());
192395d429a59d731d654de24e91993485b3531a3eeagicsaki        // Compiler folds constant strings into new constants
193395d429a59d731d654de24e91993485b3531a3eeagicsaki        Assert.assertSame(long1 + long1, long1 + long1);
194395d429a59d731d654de24e91993485b3531a3eeagicsaki    }
195395d429a59d731d654de24e91993485b3531a3eeagicsaki
196395d429a59d731d654de24e91993485b3531a3eeagicsaki    // Benchmark cases of String.equals(null)
197395d429a59d731d654de24e91993485b3531a3eeagicsaki    public void timeEqualsNull(int reps) {
198395d429a59d731d654de24e91993485b3531a3eeagicsaki        for (int rep = 0; rep < reps; ++rep) {
199395d429a59d731d654de24e91993485b3531a3eeagicsaki            for (int i = 0; i < mediumStrings.length; i++) {
200395d429a59d731d654de24e91993485b3531a3eeagicsaki                mediumStrings[i][0].equals(null);
201395d429a59d731d654de24e91993485b3531a3eeagicsaki            }
202395d429a59d731d654de24e91993485b3531a3eeagicsaki        }
203395d429a59d731d654de24e91993485b3531a3eeagicsaki    }
204395d429a59d731d654de24e91993485b3531a3eeagicsaki
205395d429a59d731d654de24e91993485b3531a3eeagicsaki    // Benchmark cases with very short (<5 character) Strings
206395d429a59d731d654de24e91993485b3531a3eeagicsaki    public void timeEqualsShort(int reps) {
207395d429a59d731d654de24e91993485b3531a3eeagicsaki        for (int rep = 0; rep < reps; ++rep) {
208395d429a59d731d654de24e91993485b3531a3eeagicsaki            for (int i = 0; i < shortStrings.length; i++) {
209395d429a59d731d654de24e91993485b3531a3eeagicsaki                shortStrings[i][0].equals(shortStrings[i][1]);
210395d429a59d731d654de24e91993485b3531a3eeagicsaki            }
211395d429a59d731d654de24e91993485b3531a3eeagicsaki        }
212395d429a59d731d654de24e91993485b3531a3eeagicsaki    }
213395d429a59d731d654de24e91993485b3531a3eeagicsaki
214395d429a59d731d654de24e91993485b3531a3eeagicsaki    // Benchmark cases with medium length (10-15 character) Strings
215395d429a59d731d654de24e91993485b3531a3eeagicsaki    public void timeEqualsMedium(int reps) {
216395d429a59d731d654de24e91993485b3531a3eeagicsaki        for (int rep = 0; rep < reps; ++rep) {
217395d429a59d731d654de24e91993485b3531a3eeagicsaki            for (int i = 0; i < mediumStrings.length; i++) {
218395d429a59d731d654de24e91993485b3531a3eeagicsaki                mediumStrings[i][0].equals(mediumStrings[i][1]);
219395d429a59d731d654de24e91993485b3531a3eeagicsaki            }
220395d429a59d731d654de24e91993485b3531a3eeagicsaki        }
221395d429a59d731d654de24e91993485b3531a3eeagicsaki    }
222395d429a59d731d654de24e91993485b3531a3eeagicsaki
223395d429a59d731d654de24e91993485b3531a3eeagicsaki    // Benchmark cases with long (>100 character) Strings
224395d429a59d731d654de24e91993485b3531a3eeagicsaki    public void timeEqualsLong(int reps) {
225395d429a59d731d654de24e91993485b3531a3eeagicsaki        for (int rep = 0; rep < reps; ++rep) {
226395d429a59d731d654de24e91993485b3531a3eeagicsaki            for (int i = 0; i < longStrings.length; i++) {
227395d429a59d731d654de24e91993485b3531a3eeagicsaki                longStrings[i][0].equals(longStrings[i][1]);
228395d429a59d731d654de24e91993485b3531a3eeagicsaki            }
229395d429a59d731d654de24e91993485b3531a3eeagicsaki        }
230395d429a59d731d654de24e91993485b3531a3eeagicsaki    }
231395d429a59d731d654de24e91993485b3531a3eeagicsaki
232395d429a59d731d654de24e91993485b3531a3eeagicsaki    // Benchmark cases with very long (>1000 character) Strings
233395d429a59d731d654de24e91993485b3531a3eeagicsaki    public void timeEqualsVeryLong(int reps) {
234395d429a59d731d654de24e91993485b3531a3eeagicsaki        for (int rep = 0; rep < reps; ++rep) {
235395d429a59d731d654de24e91993485b3531a3eeagicsaki            for (int i = 0; i < veryLongStrings.length; i++) {
236395d429a59d731d654de24e91993485b3531a3eeagicsaki                veryLongStrings[i][0].equals(veryLongStrings[i][1]);
237395d429a59d731d654de24e91993485b3531a3eeagicsaki            }
238395d429a59d731d654de24e91993485b3531a3eeagicsaki        }
239395d429a59d731d654de24e91993485b3531a3eeagicsaki    }
240395d429a59d731d654de24e91993485b3531a3eeagicsaki
241395d429a59d731d654de24e91993485b3531a3eeagicsaki    // Benchmark cases with non-word aligned Strings
242395d429a59d731d654de24e91993485b3531a3eeagicsaki    public void timeEqualsNonWordAligned(int reps) {
243395d429a59d731d654de24e91993485b3531a3eeagicsaki        for (int rep = 0; rep < reps; ++rep) {
244395d429a59d731d654de24e91993485b3531a3eeagicsaki            for (int i = 0; i < nonalignedStrings.length; i++) {
245395d429a59d731d654de24e91993485b3531a3eeagicsaki                nonalignedStrings[i][0].equals(nonalignedStrings[i][1]);
246395d429a59d731d654de24e91993485b3531a3eeagicsaki            }
247395d429a59d731d654de24e91993485b3531a3eeagicsaki        }
248395d429a59d731d654de24e91993485b3531a3eeagicsaki    }
249395d429a59d731d654de24e91993485b3531a3eeagicsaki
250395d429a59d731d654de24e91993485b3531a3eeagicsaki    // Benchmark cases with slight differences in the endings
251395d429a59d731d654de24e91993485b3531a3eeagicsaki    public void timeEqualsEnd(int reps) {
252395d429a59d731d654de24e91993485b3531a3eeagicsaki        for (int rep = 0; rep < reps; ++rep) {
253395d429a59d731d654de24e91993485b3531a3eeagicsaki            for (int i = 0; i < endStrings.length; i++) {
254395d429a59d731d654de24e91993485b3531a3eeagicsaki                endStrings[i][0].equals(endStrings[i][1]);
255395d429a59d731d654de24e91993485b3531a3eeagicsaki            }
256395d429a59d731d654de24e91993485b3531a3eeagicsaki        }
257395d429a59d731d654de24e91993485b3531a3eeagicsaki    }
258395d429a59d731d654de24e91993485b3531a3eeagicsaki
259395d429a59d731d654de24e91993485b3531a3eeagicsaki    // Benchmark cases of comparing a string to a non-string object
260395d429a59d731d654de24e91993485b3531a3eeagicsaki    public void timeEqualsNonString(int reps) {
261395d429a59d731d654de24e91993485b3531a3eeagicsaki        for (int rep = 0; rep < reps; ++rep) {
262395d429a59d731d654de24e91993485b3531a3eeagicsaki            for (int i = 0; i < mediumStrings.length; i++) {
263395d429a59d731d654de24e91993485b3531a3eeagicsaki                mediumStrings[i][0].equals(objects[i]);
264395d429a59d731d654de24e91993485b3531a3eeagicsaki            }
265395d429a59d731d654de24e91993485b3531a3eeagicsaki        }
266395d429a59d731d654de24e91993485b3531a3eeagicsaki    }
267395d429a59d731d654de24e91993485b3531a3eeagicsaki}
268