@Kiril1221

Почему своя реализация system.arraycopy быстрее на 30%, учебники врут?

В любом учебники или статьях что читал написано, что любая реализация arrayCopy будет уступать нативной. Но вот простое опровержение, как не крутил вертел параметрами, всегда моя реализация была 25-50% быстрее.
Вопрос: почему в java все еще никто не додумался изменить свой метод на более быстрый и простой?
Тестил раз 1000, несите прям в oracle
public class TestArrayCopy{
          public static void main(String[] args) {
      
        int N=550; 
        long s;

        int SIZE=10000011;
        int[]arr1=new int[SIZE];
        int[]arr2=new int[SIZE];
        {
            for(int i=0;i<SIZE;i++){
                arr1[i]=i;arr2[i]=i;
            }
        }
 
        int[]dest1=new int[SIZE];
        int[]dest2=new int[SIZE];
        int startPos=100;
        int pos=10;
        int num=SIZE-startPos-22;
        
        s=System.currentTimeMillis();
        for(int i=0;i<N;i++)
            System.arraycopy(arr1, startPos, dest1,pos, num);
        System.out.println("System.ArrayCopy() time = "+(System.currentTimeMillis()-s));
        
        s=System.currentTimeMillis();         
        for(int i=0;i<N;i++)
            arrayCopy(arr2, startPos, dest2,pos, num); 
        System.out.println(" arrayCopy() time = "+(System.currentTimeMillis()-s));
       // System.ArrayCopy() time = 6453
      //               arrayCopy() time = 4455
 

               
    }
    
    public static void arrayCopy(Object src,int startPos,Object dest,int pos,int num){
        if(num>dist.length-pos || src.length-startPos<num){
            throw new IllegalArgumentException("...");
        if(src instanceof int[])
            arrayCopyInt((int[])src, startPos, (int[])dest, pos, num);
        else if(src instanceof double[])
            arrayCopyDouble((double[])src, startPos, (double[])dest, pos, num);
    }
    
    public static void arrayCopyInt(int src[],int startPos,int[] dist, int pos,int num){
        for(int i=pos;i<num;i++){
               dist[i]=src[startPos++];  
            }
    }
}
  • Вопрос задан
  • 681 просмотр
Решения вопроса 1
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
6453 мс - это подозрительно малое время до срабатывания JIT-компиллятора. Скорее всего код не прогрет.

Автору рекомендую посмотреть на фреймворк JMH. С помощю него можно делать "прогрев" байткода. Это нужно для гарантии того что все переходные процессы в компилляторе закончились и JVM вошла в стационарное состояние при котором можно начинать делать какие-либо измерения.

+1 к теме валидности. Цикл for подозрительно простой. Необходимо начинать бенчмарк только после того как есть хотя-бы покрытие тестирования. Что пользы в копировании которое не копирует или копирует неправильно.
(забегая вперед я скажу что не смотрел детально код. Это так. Общее впечатление о подходе автора)

Вообще тема перформанса очень сложная и деликатная. Рекомендую также автору посомтреть лекции Шипилёва и Елизарова в youtube
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
1) Код не рабочий. Нет метода arrayCopyDouble
2) Нет проверки выхода за границы массива.
3) System.arraycopy действительно проигрывает на малых массивах. Зато на больших - дает существенный выигрыш.
Вот например на массивах по 83Mb - https://stackoverflow.com/questions/18638743/is-it...
Ответ написан
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
Да ваш вариант медленнее и в оракл не идиоты и в книгах не врут. Вопрос почему , да потому что вы не копируете ничего, вы копируете ссылки на объекты.
Из этого делайте выводы, вы инициализировали массив что будет медленно т.к. выделяется память и т.д. .Дальше ваш метод "просто взял ссылки на готовые данные". А следом нативная реализация которая выделяет память указанного объема и копирует туда данные а не ссылки.
Ну и да, Ваш код можете свернуть в трубочку и тихо рыдать в углу, продолжая читать дальше только уже не только про ЯП но и его устройство.
Ответ написан
Комментировать
Sputterspark
@Sputterspark
Неси сам, позорься до конца.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы