2015-06-13 1 views
3

Я пытаюсь использовать Java тест, который был упомянут здесь: https://www.ibm.com/developerworks/java/library/j-benchmark2/ и что можно скачать здесь: http://www.ellipticgroup.com/html/benchmarkingArticle.htmlJava тест с Ellipticgroup/Brent Бойер

Я пытался использовать основной пример в статье выше :

import bb.util.Benchmark; 

public class ShortIndexesLoop { 

    public static void main(String[] args) throws Exception { 
     Callable<Integer> task = 
      new Callable<Integer>() { public Integer call() { return fibonacci(35); } }; 
      System.out.println("fibonacci(35): " + new Benchmark(task)); 
    } 

    protected static int fibonacci(int n) throws IllegalArgumentException { 
     if (n < 0) throw new IllegalArgumentException("n = " + n + " < 0"); 
     if (n <= 1) return n; 
     return fibonacci(n - 1) + fibonacci(n - 2); 
    } 
} 

Но каждое выполнение этого теста начинается с исключением, прежде чем он работает эталон

13 июня , 2015 1:45:37 PM StringUtil ВНИМАНИЕ: Строка не работает должным образом; см вызывают

java.lang.Exception: substring does NOT share the same underlying char[] with its parent String 
    at bb.util.StringUtil.inspectStringConstructor(StringUtil.java:84) 
    at bb.util.StringUtil.<clinit>(StringUtil.java:75) 
    at bb.io.ConsoleUtil.<clinit>(ConsoleUtil.java:81) 
    at bb.util.Benchmark.sendUserMsg(Benchmark.java:1002) 
    at bb.util.Benchmark.osSpecificPreparation(Benchmark.java:579) 
    at bb.util.Benchmark.perform(Benchmark.java:541) 
    at bb.util.Benchmark.<init>(Benchmark.java:464) 
    at bb.util.Benchmark.<init>(Benchmark.java:439) 
    at ShortIndexesLoop.main(fib.java:13) 

, кажется, что любой вызов теста заканчивается, используя следующий метод в StringUtil

private static final boolean stringContructorTrimsGarbage = inspectStringConstructor(); 

private static boolean inspectStringConstructor() { 
    try { 
      // first prove that substring shares the same underlying char[] as the parent String: 
     String s1 = "abc123def"; 
     String s2 = s1.substring(3, 6); 
     char[] value1 = (char[]) ReflectUtil.get(s1, "value"); 
     char[] value2 = (char[]) ReflectUtil.get(s2, "value"); 
     if (value1 != value2) throw new Exception("substring does NOT share the same underlying char[] with its parent String"); 
     if (value2.length != s1.length()) throw new Exception("value2.length = " + value2.length + " != s1.length() = " + s1.length()); 

      // second prove that the String(String) constructor trims garbage chars: 
     String s3 = new String(s2); 
     char[] value3 = (char[]) ReflectUtil.get(s3, "value"); 
     if (value3 == value2) throw new Exception("new String shares the same underlying char[] with its String arg"); 
     if (!(value3.length < value2.length)) throw new Exception("value3.length = " + value3.length + " is not < value2.length = " + value2.length); 

     return true; 
    } 
    catch (Exception e) { 
     LogUtil.getLogger2().logp(Level.WARNING, "StringUtil", "<clinit>", "String does not behave as expected; see cause", e); 
     return false; 
    } 
} 

Я не возражаю исключение, так как тест библиотека действительно дают результат. Однако попытка скомпилировать этот код в jar и запускать его как банку, является проблемой. Из-за исключения остальная часть кода не будет выполнена в терминале

Кто-нибудь есть идеи, как решить эту проблему?

+0

Может быть несовместимым с изменением реализации на Java 7: http://java.dzone.com/articles/changes-stringsubstring-java-7 – Marvin

+0

Есть ли способ справиться с этим, не меняя java 1.6 или 1.8? – Quantico

+1

Java 8 не поможет, так как это изменение все еще существует. Кроме того, вы можете только ждать обновления библиотеки или попытаться исправить ее самостоятельно. Изменить: Или попробуйте другую библиотеку c, но я не могу рекомендовать или даже назвать ее. – Marvin

ответ

2

Я знаю, что это старый вопрос, но mabye мое решение полезно и для других: в источнике класса StringUtil эта эталонная структура документирована, почему эта проверка завершена. Исходя из этого, если у вас есть JDK, где substring создает копию соответствующей части базового массива символов, вы можете просто прокомментировать флаг stringContructorTrimsGarbage, а в методе newString вы просто вернете s.