2015-02-10 12 views
1

В моей программе JAVA мне нужно «вставить» элементы в массив в другой массив в определенных местах с равным интервалом (4 элемента). Например:Как скопировать массив с прыжком?

byte[] orig = new byte[100000]; 
byte[] target = new byte[100000*4]; 
for(int j=0;j<orig.length;j++) 
    target[j*4]=orig[j]; 

Код выше работает нормально, но слишком медленно - примерно 50 мс на моем ноутбуке. Есть ли способ, который может сделать то же самое в течение нескольких мс?

+3

В каком контексте 1/20 секунды слишком медленно? – usr2564301

+1

Насколько быстрее он работает, если вы пишете 'j' вместо' j * 4'? – n0rd

+1

Как вам это удалось? Вы время только цикл? – JuniorCompressor

ответ

2

Если обратный путь вы думаете об этом, сделав orig того же размера, как target но доступ к его индексы с множатся, вы можете использовать System.arraycopy, Arrays.copyOf или clone, любой из которых может быть быстрее. arraycopy должен использовать memcpy или что-то под капотом. copyOf, вероятно, вызывает arraycopy.

Так т.е.

byte[] orig = new byte[100000 * 4]; 

// access index in orig 
orig[i * 4] = ...; 

byte[] copy = new byte[orig.length]; 
System.arraycopy(orig, 0, copy, 0, orig.length); 

Примечание это, вероятно, будет хуже производительность кэша, так как элементы массива не являются смежными больше. (Я не знаю, сколько. Лучше доверять профилировщику.)

+0

Это не работает в моем случае, так как данные в orig не контролируются мной. Но это открывает двери для многих подобных методов, один из которых может работать. Дай мне подумать. – Daniel

Смежные вопросы