Что быстрее - прочитать 4 байта или двойное слово (выравнивания нет)?

Тема в разделе "WASM.A&O", создана пользователем KeSqueer, 29 сен 2010.

  1. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Есть код:
    Код (Text):
    1. const unsigned char *k;
    2. a += ((unsigned int)k[0]) << 0;
    3. a += ((unsigned int)k[1]) << 8;
    4. a += ((unsigned int)k[2]) << 16;
    5. a += ((unsigned int)k[3]) << 24;
    6. b += ((unsigned int)k[4]) << 0;
    7. b += ((unsigned int)k[5]) << 8;
    8. b += ((unsigned int)k[6]) << 16;
    9. b += ((unsigned int)k[7]) << 24;
    10. c += ((unsigned int)k[8]) << 0;
    11. c += ((unsigned int)k[9]) << 8;
    12. c += ((unsigned int)k[10]) << 16;
    13. c += ((unsigned int)k[11]) << 24;
    Который можно переписать как:
    Код (Text):
    1. const unsigned char *k;
    2. a += ((unsigned int *)k)[0];
    3. b += ((unsigned int *)k)[1];
    4. c += ((unsigned int *)k)[2];
    Какой вариант должен быть теоретически быстрее на не выровненных данных?

    ADD:
    Архитектура x86
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Во-первых, если пишешь на С, то нужно очень сильно постараться, чтобы данные оказались не выравненными ;)
    Во-вторых, для современных x86 невыравненные данные не так страшны, "как их малюют". Заметная задержка возникает только при пересечении 64-байтных границ кэш-линеек (при чтении массива двордов это будет происходить 1 раз из 16-ти). Плюс в AMD возможна доп.задержка в 1 такт при пересечении 8-байтных границ (но зато они в отличие от пеньков могут выполнять два чтения за 1 такт). Поэтому как ни крути, а чтение двордами по любому будет быстрее, чем хитроумные махинации с байтами ;)
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Спасибо, полный ответ
     
  4. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    leo
    както бенчил (на амд). практически одинаково. разница практически равна погрешности. проц читает ведь из кэша. так что, имхо, оптимальнее паковать.
     
  5. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Почему бы не довериццо memcpy (a,b,c расположены друг за другом и чтобы не было gap'оф - pragma или в структуре) - ?
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    PSR1257
    a, b, c используются в цикле и определены как register unsigned int