Как доказать с помощью модульных тестов junit3, что экземпляры класса A версии 2 более эффективны по памяти, чем версия 1? - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть куча классов, которые я должен настроить для улучшения использования памяти в обмен на процессорное время, и у меня есть junit 3 в качестве тестовой среды, чтобы доказать это.

Хотя я легко могу это сделать (использую string.getBytes("UTF-8");, заполняю несколько байтов в байте, использую long вместо Date, реализую свои собственные коллекции и т. д.), у меня нет точного способа показать улучшения, когда я фиксирую код, из-за непредсказуемой природы GarbageCollector.

Когда я говорю о сборе мусора, я имею в виду, что я выполнил обе эти две вещи: назвал System.gc(), И попытался выделить массив следующим образом long[] longs=new long[Integer.MAX_VALUE]; Это несколько алгоритмов, которые я пробовалреализовать безуспешно:

1:

a: сборщик мусора;

b: получить количество используемой памяти в данный момент;(long beforeold=Runtime.getRuntime().maxMemory - Runtime.getRuntime().freeMemory();)

c: выделить массив из нескольких десятков тысяч экземпляров моего старого класса;

d: сборщик мусора;

f: long afterold=Runtime.getRuntime().maxMemory - Runtime.getRuntime().freeMemory();

g: повторить процесс создания новых классов

h: сравнить различия в памяти.

Результаты, которые я получил, были странными: мой "afterold" был меньшечем мой «beforeold», указывающий на то, что во время выделения памяти для новых классов произошло какое-то странное событие сбора мусора.

Память, используемая новым экземпляром класса, оказалась в любом месте от отрицательной до положительной, снова сигнализируя о некотором странномсбор мусора в процессе реализации.

Кто-нибудь еще пытался доказать, что некоторые классы более эффективны, чем другие, подобные этому?Это очень крутая проблема, но это все еще проблема.

Спасибо, ребята, вы правите!

1 Ответ

0 голосов
/ 09 февраля 2012

Хайнц Кабуц имеет несколько советов в бюллетене Java Специалисты: http://www.javaspecialists.eu/archive/Issue193.html:

public long calculateMemoryUsage(ObjectFactory factory) {
  Object handle = factory.makeObject();
  long memory = usedMemory();
  handle = null;
  lotsOfGC();
  memory = usedMemory();
  handle = factory.makeObject();
  lotsOfGC();
  return usedMemory() - memory;
}

private long usedMemory() {
  return Runtime.getRuntime().totalMemory() -
      Runtime.getRuntime().freeMemory();
}

private void lotsOfGC() {
  for (int i = 0; i < 20; i++) {
    System.gc();
    try {
      Thread.sleep(100);
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
    }
  }
}

public void showMemoryUsage(ObjectFactory factory) {
  long mem = calculateMemoryUsage(factory);
  System.out.println(
      factory.getClass().getSimpleName() + " produced " +
          factory.makeObject().getClass().getSimpleName() +
          " which took " + mem + " bytes");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...