Я попробовал две вещи после компиляции вашего кода (я просто переименовал bytesToWords()
, который теперь groupedBytesToWords()
ниже):
Проверка ваших двух функций: они не дают одинаковых результатов. С simpleBytesToWords()
я получаю заполненный нулями массив. С groupedBytesToWords()
я получаю череду действительных результатов и нулей.
Не изменяя их, предполагая, что исправление не изменит их сложности, я попытался написать третью, написанную мной, в которой используется предварительно вычисленная таблица uint8_t
-> uint16_t
, которую необходимо построить изначально:
Вот эта таблица. Он маленький, поскольку в нем всего 255 записей, по одной на каждую uint8_t
:
// Build a precalculation table for each possible uint8_t -> uint16_t conversion
const size_t sizeTable(std::numeric_limits<uint8_t>::max());
uint16_t * precalc_table = new uint16_t[sizeTable];
for (uint16_t i = 0; i < sizeTable; ++i)
{
precalc_table[i] = i * 0x101;
}
Третья функция, которую я попробовал, приведена ниже:
void hopefullyFastBytesToWords(uint16_t *ptr, size_t pixelCount, uint16_t const * precalc_table)
{
for (size_t i = 0; i < pixelCount; ++i)
{
ptr[i] = precalc_table[ptr[i]];
}
}
Я проверял это, конечно, и результаты, которые он производит, выглядят в соответствии с описанием, которое вы сделали в своем оригинальном посте. Эта функция вызывается путем передачи тех же параметров, что и для двух других функций, а также таблицы предварительно рассчитанных преобразований:
hopefullyFastBytesToWords(buffer, sizeBuf, precalc_table);
Затем я провел несколько сравнений, используя массив длиной 500000000 uint16_t
, изначально заполненный случайными значениями uint8_t
. Вот пример использования simpleBytesToWords()
, который вы написали:
fillBuffer(buffer, sizeBuf);
begin = clock();
simpleBytesToWords(buffer, sizeBuf);
end = clock();
std::cout << "simpleBytesToWords(): " << (double(end - begin) / CLOCKS_PER_SEC) << std::endl;
Я получил следующие результаты (вы увидите, что я использовал маленький и медленный ноутбук). Вот три примера, но все они постоянно производят значения одинаковой величины:
$ Sandbox.exe
simpleBytesToWords(): 0.681
groupedBytesToWords(): 1.2
hopefullyFastBytesToWords(): 0.461
$ Sandbox.exe
simpleBytesToWords(): 0.737
groupedBytesToWords(): 1.251
hopefullyFastBytesToWords(): 0.414
$ Sandbox.exe
simpleBytesToWords(): 0.582
groupedBytesToWords(): 1.173
hopefullyFastBytesToWords(): 0.436
Конечно, это не настоящий реальный и действительный тест, но он показывает, что ваша «сгруппированная» функция медленнее на моей машине, что не соответствует полученным вами результатам. Это также показывает, что немного помогает предварительный расчет умножения вместо приведения / умножения на лету.