Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Clone vs. System.arraycopy vs. Arrays.copyOf, Что быстрее или Вот и верь после этого  
:(
    Опции темы
Mirkes
Дата 15.7.2013, 18:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Недавно прочитал на одном из англоязычных форумов, что clone() в приложении к массиву действует даже быстрее чем System.arraycopy и Arrays.copyOf.
Взял да сдуру и поверил. В новом проекте использовал сlone массивов на каждом шагу. Сегодня при запуске нового метода классификации получл невероятное время работы (крайне медленно). Полез смотреть, что тормозит и обнаружил, что из 134 секунд работы метода 83 секунды ушло на клонирование, и только 38 секунд на умножение векторов на матрицы (не очень большие 75х75). С умножением векторов на матрицы я пока сделать ничего не могу, оно необходимо, а вот затраты на clone повергли меня в ужас и подвигли на небольшой эксперимент.
Следующий код 
Код

    private void copyingTest() {
        double[] source = new double[100], copy;
        int tests = 1000000;
        long t1 = System.nanoTime();
        for (int i = 0; i < tests; i++)
            copy = source.clone();
        long t2 = System.nanoTime();
        for (int i = 0; i < tests; i++){
            copy=new double[source.length];
            System.arraycopy(source, 0, copy, 0, source.length);
        }
        long t3 = System.nanoTime();
        for (int i = 0; i < tests; i++){
            copy=Arrays.copyOf(source, source.length);
        }
        long t4 = System.nanoTime();
        copy=new double[source.length];
        for (int i = 0; i < tests; i++){
            System.arraycopy(source, 0, copy, 0, source.length);
        }
        long t5 = System.nanoTime();
        System.out.println("Clone\t"+(t2-t1)+"\tSystem.arraycopy\t"+(t3-t2)+"\tArrays.copyOf\t"+(t4-t3)+"\tWithout creation\t"+(t5-t4));
    }

дал убойные результаты (старшие три цифры - миллисекунды):
Clone             477,566,722.00 
System.arraycopy     249,563,929.00 
Arrays.copyOf         270,581,542.00 
Without creation       83,366,003.00

Откуда следует совершенно простой вывод:
1. НИКОГДА не используйте clone для копирования массивов, даже если массив надо создавать.
2. Если массив надо создавать можно воспользоваться Arrays.copyOf     для краткости, хотя прямое создание и System.arraycopy быстрее, но немного.
2. Если массив существует и нужно просто заменить содержимое - используйте System.arraycopy.

Вот и  верь после этого людям  smile 


--------------------
Mirkes
PM MAIL   Вверх
Mirkes
Дата 15.7.2013, 18:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Разобрало любопытство, решил посмотреть, как это зависит от длины массива
Код

    private void copyingTest() {
        double[] source, copy;
        int tests = 1000000;
        for (int leng = 1; leng < 1025; leng *= 2) {
            System.gc();
            source=new double[leng];
            long t1 = System.nanoTime();
            for (int i = 0; i < tests; i++)
                copy = source.clone();
            long t2 = System.nanoTime();
            for (int i = 0; i < tests; i++) {
                copy = new double[source.length];
                System.arraycopy(source, 0, copy, 0, source.length);
            }
            long t3 = System.nanoTime();
            for (int i = 0; i < tests; i++) {
                copy = Arrays.copyOf(source, source.length);
            }
            long t4 = System.nanoTime();
            copy = new double[source.length];
            for (int i = 0; i < tests; i++) {
                System.arraycopy(source, 0, copy, 0, source.length);
            }
            long t5 = System.nanoTime();
            System.out.println("Length\t" + leng + "\tClone\t" + (t2 - t1) + "\tSystem.arraycopy\t" + (t3 - t2) +
                               "\tArrays.copyOf\t" + (t4 - t3) + "\tSystem without creation\t" + (t5 - t4));
        }
    }


Время в миллисекундах
 Length                               1         2         4         8        16       32      64     128     256      512    1,024 
 Clone                               163     148     155     172     200     224     364     469     659     1,200     2,074 
 System.arraycopy              18       23       34       39       54     108     172     283     473        942     1,907 
 Arrays.copyOf                    24       24       41       47       59       98     176     260     532     1,035     1,878 
 System without creation    10       13       20       23       28       39       46       66       98        148        216 

далее пошел с меньшим в 100 раз числом повторов
 Length                            2,048     4,096     8,192 16,384 32,768 65,536 131,072 
 Clone                                  48         97         188     375     768     1,572     3,485 
 System.arraycopy                40         96         167     376     800     1,589     3,365 
 Arrays.copyOf                      39         91         171     373     825     1,601     3,466 
 System without creation        16         15           30       71     151        342        729 


Это сообщение отредактировал(а) Mirkes - 15.7.2013, 18:46


--------------------
Mirkes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0396 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.