1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

Тема в разделе "С и С++", создана пользователем -, 22 май 2007.

  1. Гость

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

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

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

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

    grigsoft Well-Known Member

    Репутация:
    0
    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Ну приведи свой цикл, посмотрим. memcpy ты думаешь без цикла работает, волшебным образом перенося байты?
     
  3. Гость

    Репутация:
    0
    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);
     
  4. Kmet

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.036
    Симпатии:
    8
    может быть бытсрее, может быть нет, зависит от реализации, целевой платформы и как оптимизатор сработает. в твоем случае, выгоды от использования специализированных инструкций процесора не получишь
     
  5. grigsoft

    grigsoft Well-Known Member

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

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

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


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

    grigsoft Well-Known Member

    Репутация:
    0
    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Собери в релизе, поставь вокруг GetTickCount(), посмотри результат. Если точности GetTickCount тебе не хватает, значит оптимизация здесь не нужна :)
     
  8. grigsoft

    grigsoft Well-Known Member

    Репутация:
    0
    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Хе-хе, попробовал - разницу GetTickCount словил только при увеличении цикла до 50М - примерно в 2 раза быстрее :)
     
  9. grigsoft

    grigsoft Well-Known Member

    Репутация:
    0
    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Ан нет - это разница между первым и вторым пробегом оказывается. Так что разницы значительной все-же нет.
     
  10. Гость

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

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

Поделиться этой страницей