Эффективный System.arraycopy на многомерных массивах

Я знаю, что общий рефакторинг производительности должен заменить простой for System.arraycopy.

Я хочу спросить о:

  1. Когда точно делает system.arraycopy, начинают иметь смысл (полагающий, что это - вызов собственного метода). Копирование мелочей говорит, <32 имеют преимущество?

  2. Это мое впечатление или это не просто возможный скопировать (эффективно) цикл как это с arraycopy:

       for (int j = 0; j < 2; ++j) {
           vpr[m][s + j][i] = vr[j];
       }
    
10
задан Joseph Quinsey 18 March 2012 в 05:50
поделиться

3 ответа

System.arrayCopy , вероятно, самый быстрый способ скопировать массив, но он не делает глубокие копии.

Это также не может сделать более сложный пример во втором вопросе.

4
ответ дан 3 December 2019 в 14:06
поделиться

Как и во всех вопросах, связанных со временем выполнения, вам действительно необходимо проводить бенчмаркинг в среде, в которой вы ожидаете запускать свой код. Различные версии JVM и конфигурации оборудования (процессор, память и т.д.) могут иметь разные результаты. Это действительно зависит от Ваших специфических требований к производительности.

Но затем, прежде чем перейти к такому уровню настройки производительности, необходимо сначала четко написать код и исправить его. Компилятор и JIT смогут сделать для вас много оптимизаций с обычными алгоритмическими выражениями, но иногда ручные оптимизации могут запутать эти автоматические оптимизации. После того, как у вас есть работающий продукт, и если производительность не та, что вам хотелось бы, то профилируйте и работайте только на горячих точках. (Хотя иногда для более сложного кода может потребоваться рефакторинг и/или изменение логики)

В этом случае, если вы копируете целые массивы, то используйте System.arraycopy, так как это стандартный способ сделать это. Компилятор может сейчас или в будущем предоставить дополнительные оптимизации для этого, так как основные API полагаются на это в значительной степени, вы можете быть уверены, что это то, что разработчики JVM всегда хотят иметь оптимальную работу.

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

public int[][][] copyOf3Dim(int[][][] array) {
    int[][][] copy;
    copy = new int[array.length][][];
    for (int i = 0; i < array.length; i++) {
        copy[i] = new int[array[i].length][];
        for (int j = 0; j < array[i].length; j++) {
            copy[i][j] = new int[array[i][j].length];
            System.arraycopy(array[i][j], 0, copy[i][j], 0, 
                array[i][j].length);
        }
    }
    return copy;
}    

Или вы можете использовать Arrays.copyOf, который использует System.arraycopy и некоторое внутреннее отражение (т.е. не так быстро, как прямое использование System.arraycopy само по себе), но не делает глубокого копирования.

8
ответ дан 3 December 2019 в 14:06
поделиться

проверьте это http://www.4guysfromrolla.com/articles/012506-1.aspx

Короче говоря, (1) существует свойство «SubmitDisabledControls» формы или (2) подправить предоставленный автором javascript

-121--3603998-

Мы делаем нечто подобное в нашем процессе построения TFS. Для этого в C # была создана пользовательская задача MSBuild, которая выполняет вызов TFS для предметов. Создать пользовательские задачи довольно просто.

Вот статья, в которой вы начинаете писать задания MSBuild. http://msdn.microsoft.com/en-us/library/t9883dzc.aspx

Я предполагаю, что вы уже знаете, как выполнять вызовы в TFS на основании вашего вопроса.

-121--2823130-

AFAIK, System.arrayCopy - самый эффективный и лучший способ копирования массивов. Мне неизвестно о каких-либо ситуациях, когда альтернативный способ реализации ваших собственных циклов был бы гораздо более эффективным для прямых копий.

1
ответ дан 3 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: