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