Прочитав хабротопик О разворачивании строк в .Net/C# и не только, меня заинтересовало а как обстоят дела с той же проблемой в Java.
Не имея под руками машины с медленной памятью пришлось ограничится тестами на одной.
Времени проводить такое количество тестов как автор произвел в оригинале нету поэтому ограничусь проверкой нескольких мыслей однако тенденция в Java соблюдается — StringBuilder самый медленный результат.
Параметры машины: Intel® Core(TM) 2 Duo CPU E4600 @2.40GHz; 4GB Ram DDR2 (частоту к сожалению не скажу)
Своп напрочь отключён ОС — WinXP SP2.
Результаты в попугаях:
Код тестов:
Не имея под руками машины с медленной памятью пришлось ограничится тестами на одной.
Времени проводить такое количество тестов как автор произвел в оригинале нету поэтому ограничусь проверкой нескольких мыслей однако тенденция в Java соблюдается — StringBuilder самый медленный результат.
Параметры машины: Intel® Core(TM) 2 Duo CPU E4600 @2.40GHz; 4GB Ram DDR2 (частоту к сожалению не скажу)
Своп напрочь отключён ОС — WinXP SP2.
Результаты в попугаях:
Java version | StringBuilder To Array | StringBuilder CharAt | Array To Array | Reflection To Array |
Java HotSpot(TM) Client VM (build 1.5.0_14-b03, mixed mode) | 1667 | 1914 | 923 | 692 |
Java HotSpot(TM) Server VM (build 1.5.0_14-b03, mixed mode) | 1805 | 1374 | 1064 | 717 |
Java HotSpot(TM) Client VM (build 10.0-b23, mixed mode, sharing) | 1458 | 1309 | 756 | 517 |
Код тестов:
Copy Source | Copy HTML
- private String testString = "";
-
- protected void setUp() throws Exception {
- int charCount = 50 * 1024 * 1024;
- Random rnd = new Random();
- byte chars[] = new byte[charCount * 2];
- rnd.nextBytes(chars);
- testString = new String(chars);
- }
-
- public long _testStringBuilderToArray() {
- long start = System.currentTimeMillis();
- StringBuilder builder = new StringBuilder(testString.length());
- char data[] = testString.toCharArray();
- int len = testString.length();
- for (int i = len - 1; i >= 0 ; i--) {
- builder.append(data[i]);
- }
- String reverse = builder.toString();
- if ((reverse.charAt(2) == 'd') && (len == 1)) {
- //To avoid compiler optimization
- return 0;
- }
- long end = System.currentTimeMillis();
- return (end - start);
- }
-
- public long _testStringBuilderCharAt() {
- long start = System.currentTimeMillis();
- StringBuilder builder = new StringBuilder(testString.length());
- int len = testString.length();
- for (int i = len - 1; i >= 0 ; i--) {
- builder.append(testString.charAt(i));
- }
- String reverse = builder.toString();
- if ((reverse.charAt(2) == 'd') && (len == 1)) {
- //To avoid compiler optimization
- return 0;
- }
- long end = System.currentTimeMillis();
- return (end - start);
- }
-
- public long _testArrayToArray() {
- long start = System.currentTimeMillis();
- char reverseBytes[] = new char[testString.length()];
- char data[] = testString.toCharArray();
- int len = testString.length();
- for (int i = len - 1; i >= 0 ; i--) {
- reverseBytes[len - i - 1] = data[i];
- }
- String reverse = new String(reverseBytes);
- if ((reverse.charAt(2) == 'd') && (len == 1)) {
- //To avoid compiler optimization
- return 0;
- }
- long end = System.currentTimeMillis();
- return (end - start);
- }
-
- public long _testReflectionToArray() throws Exception {
- long start = System.currentTimeMillis();
-
- Field stringClassValueField = String.class.getDeclaredField("value");
- stringClassValueField.setAccessible(true);
- char reverseBytes[] = new char[testString.length()];
- char data[] = (char[])stringClassValueField.get(testString);
- int len = testString.length();
- for (int i = len - 1; i >= 0 ; i--) {
- reverseBytes[len - i - 1] = data[i];
- }
- String reverse = new String(reverseBytes);
- if ((reverse.charAt(2) == 'd') && (len == 1)) {
- //To avoid compiler optimization
- return 0;
- }
- long end = System.currentTimeMillis();
- return (end - start);
- }
-
-
- public void testRunner() throws Exception {
- long value = 0;
- int testCount = 20;
-
- //StringBuilderToArray
- value = 0;
- for (int i = 0; i < testCount; i++) {
- value += _testStringBuilderToArray();
- }
- System.out.println("_testStringBuilderToArray - " + (value / testCount));
-
- //_testStringBuilderCharAt
- value = 0;
- for (int i = 0; i < testCount; i++) {
- value += _testStringBuilderCharAt();
- }
- System.out.println("_testStringBuilderCharAt - " + (value / testCount));
-
- //_testArrayToArray
- value = 0;
- for (int i = 0; i < testCount; i++) {
- value += _testArrayToArray();
- }
- System.out.println("_testArrayToArray - " + (value / testCount));
-
- //_testReflectionToArray
- value = 0;
- for (int i = 0; i < testCount; i++) {
- value += _testReflectionToArray();
- }
- System.out.println("_testReflectionToArray - " + (value / testCount));
- }