лучшая производительность в векторном массиве - PullRequest
0 голосов
/ 21 сентября 2011

возможный дубликат

Как был задан вопрос Как преобразовать массив Vector в массив String в Java

какая из них является наилучшей для сохранения значения вектора в массиве String. И как это будет работать в фоновом режиме?

Vector<String> v = new Vector<String>();
// this one
String s[] = v.toArray(new String[v.size()]);
// or this one
String s[] = v.toArray(new String[0]);

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

Я ожидал, что new String[list.size()] будет самым быстрым, однако, похоже, это приведет к дополнительной блокировке для Vector, что сделает его медленнее.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;

public class Main {
  private static final String[] NO_STRINGS = {};
  private static final int runs = 50000000;

  public static void main(String... args) {
    List<String> strings = Arrays.asList("one,two,three,four,five,six".split(","));
    List<String> arrayList = new ArrayList<String>(strings);
    Vector<String> vector = new Vector<String>(strings);

    testNoStrings(arrayList);
    testStrings0(arrayList);
    testSize(arrayList);

    testNoStrings(vector);
    testStrings0(vector);
    testSize(vector);
  }

  private static String[] testSize(List<String> list) {
    String[] ret = null;
    long start = System.nanoTime();
    for (int i = 0; i < runs; i++)
      ret = list.toArray(new String[list.size()]);
    long time = System.nanoTime() - start;
    System.out.printf(list.getClass().getSimpleName() + " Using new String[list.size()] took an average of %,d ns%n", time / runs);
    return ret;
  }

  private static String[] testNoStrings(List<String> list) {
    String[] ret = null;
    long start = System.nanoTime();
    for (int i = 0; i < runs; i++)
      ret = list.toArray(NO_STRINGS);
    long time = System.nanoTime() - start;
    System.out.printf(list.getClass().getSimpleName() + " Using NO_STRINGS took an average of %,d ns%n", time / runs);
    return ret;
  }

  private static String[] testStrings0(List<String> list) {
    String[] ret = null;
    long start = System.nanoTime();
    for (int i = 0; i < runs; i++)
      ret = list.toArray(new String[0]);
    long time = System.nanoTime() - start;
    System.out.printf(list.getClass().getSimpleName() + " Using new String[0] took an average of %,d ns%n", time / runs);
    return ret;
  }
}

Любое различие, которое вы видите, с большой вероятностью зависит от машины, однако очевидным фактором является то, что ArrayList быстрее, чем Vector.

ArrayList Using NO_STRINGS took an average of 17 ns
ArrayList Using new String[0] took an average of 22 ns
ArrayList Using new String[list.size()] took an average of 27 ns
Vector Using NO_STRINGS took an average of 28 ns
Vector Using new String[0] took an average of 29 ns
Vector Using new String[list.size()] took an average of 46 ns
2 голосов
/ 21 сентября 2011

Как общее практическое правило, быстрее правильно настроить размер массива или коллекции в первый раз, потому что это предотвращает необходимость изменять его размер один или несколько раз позже.Меньше работы == быстрее.Кстати, вы почти наверняка не должны использовать Vector;ArrayList - лучший выбор в подавляющем большинстве случаев.

ОБНОВЛЕНИЕ: В вашем конкретном случае результаты будут сильно зависеть от данных в Vector.Как и в случае с любым вопросом о производительности, вы должны профилировать его для себя.Поскольку вы сказали, что не знаете, как проводить эталонные тесты, я предлагаю вам ознакомиться с профилированием и измерением производительности для приложений Java.Если вы не измеряете вещи, вам не следует тратить время на беспокойство о производительности стандартных операций библиотеки.Вы, вероятно, беспокоитесь о вещах, которые не имеют ничего общего с фактическими узкими местами в ваших приложениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...