• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

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

Guest

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

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

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

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

grigsoft

Ну приведи свой цикл, посмотрим. memcpy ты думаешь без цикла работает, волшебным образом перенося байты?
 
G

Guest

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

Well-known member
25.05.2006
904
8
BIT
0
может быть бытсрее, может быть нет, зависит от реализации, целевой платформы и как оптимизатор сработает. в твоем случае, выгоды от использования специализированных инструкций процесора не получишь
 
G

grigsoft

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

Guest

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

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


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

grigsoft

Собери в релизе, поставь вокруг GetTickCount(), посмотри результат. Если точности GetTickCount тебе не хватает, значит оптимизация здесь не нужна :)
 
G

grigsoft

Хе-хе, попробовал - разницу GetTickCount словил только при увеличении цикла до 50М - примерно в 2 раза быстрее :)
 
G

grigsoft

Ан нет - это разница между первым и вторым пробегом оказывается. Так что разницы значительной все-же нет.
 
G

Guest

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

Спасибо за помощь сделал все равно через указатели.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!