Выбор данных с использованием маски!

  • Автор темы Guest
  • Дата начала
G

Guest

#1
Возможно глупый вопрос но... что поделаешь.
У меня есть два массива.

unsigned short data[4096];
unsigned short tempdata[2048];

Мне нужно из data выбрать элементы через один к примеру и присвоить их tempdata.
Если какая нибудь функция типа memcpy чтоб она могла это сделать с использованием маски?

Или как это можно сделать чтоб не переберать это все в цикле! А то очень долго получается.
 

grigsoft

Well-known member
15.11.2005
735
0
#2
Ну приведи свой цикл, посмотрим. memcpy ты думаешь без цикла работает, волшебным образом перенося байты?
 
G

Guest

#3
for (int i = 0; i < 2048; i++) TempData = Data[i * 2];

А memcpy работает без цикла, поидее, memcpy(куда копировать, откуда копировать, скока байт копировать).

Покрайней мере она точна работает быстрее чем еслиб я делал в цикле присвоение каждому элементу массива.
Типа как вот это:
for (int i = 0; i < 2048; i++) TempData = Data;

МемКопи будет работать быстрее!
memcpy(TempData, Data, 2048);
 

Kmet

Java Team
25.05.2006
1 036
8
#4
может быть бытсрее, может быть нет, зависит от реализации, целевой платформы и как оптимизатор сработает. в твоем случае, выгоды от использования специализированных инструкций процесора не получишь
 

grigsoft

Well-known member
15.11.2005
735
0
#5
Внутри у memcpy тоже цикл, но он оптимизирован. Можешь попробовать так, например:
Код:
register WORD* pSrc = Data;
register WORD* pDst = TempData;
for (int i = 0; i < 2048; i++) 
{
*pDst++ = *pSrc;
pSrc += 2;
}
 
G

Guest

#6
Сделал как Вы сказали работает но разницы я если честно не увидел.

А как можно убедиться что этот код работает быстрее? Желательно в тактак процессора.


А насчет memcpy я сомневаюсь что там есть циклы. Помоему он поэтому работает быстрее, чем к каждому элементу обращаться, потому что он сразу копирует мапять блоками большими!
 

grigsoft

Well-known member
15.11.2005
735
0
#7
Собери в релизе, поставь вокруг GetTickCount(), посмотри результат. Если точности GetTickCount тебе не хватает, значит оптимизация здесь не нужна :)
 

grigsoft

Well-known member
15.11.2005
735
0
#8
Хе-хе, попробовал - разницу GetTickCount словил только при увеличении цикла до 50М - примерно в 2 раза быстрее :)
 

grigsoft

Well-known member
15.11.2005
735
0
#9
Ан нет - это разница между первым и вторым пробегом оказывается. Так что разницы значительной все-же нет.
 
G

Guest

#10
Ладно пойдет. Вроде все быстренько работает!
У меня GetTickCount тоже разницы не поймал, но просто эта функция в которой это присвоение происходит вызывается очень много раз! И в итоге я думаю она займет много времени!

Спасибо за помощь сделал все равно через указатели.