История изменений
Исправление
sambist,
(текущая версия)
:
Да, точно, он. Поясню на всякий случай: memset это очень неплохо оптимизированная функция, если ты делаешь что-то похожее, неплохо сравнивать производительность своей функции с ней
Аллё, почитайте уже мануал к memset'у и посмотрите, как вы его используете.
Лучше расшифруй как у тебя получилось так ловко в 50 раз обогнать компилятор. С минимальным тестом, если можно
Минимальный тест не получится, ибо проект большой и ели начать выдирать, то получится тот же проект. Сейчас тесты такие:
# asm func: 10000 cycles took 4.312439 s
# direct assign func: 10000 cycles took 10.083105 s
Использовался ваш код с прямым присваиванием и моя асм вставка:
void SmlMemoryFill(char * start, int32_t count, SmlColour colour)
{
// SML_UNUSED(start);
// SML_UNUSED(count);
// SML_UNUSED(colour);
// asm volatile(
// "cld\n\t"
// "rep\n\t"
// "stosl"
// : /* no output registers */
// : "c" (count), "a" (colour), "D" (start));
size_t i;
uint32_t * ptr = (uint32_t *)start;
for (i=0; i < count; i++)
{
ptr[i] = colour;
}
}
Исходная версия
sambist,
:
Да, точно, он. Поясню на всякий случай: memset это очень неплохо оптимизированная функция, если ты делаешь что-то похожее, неплохо сравнивать производительность своей функции с ней
Аллё, почитайте уже мануал к memset'у и посмотрите, как вы его используете.
Лучше расшифруй как у тебя получилось так ловко в 50 раз обогнать компилятор. С минимальным тестом, если можно
Минимальный тест не получится, ибо проект большой и ели начать выдирать, то получится тот же проект. Сейчас тесты такие:
# asm func: 10000 cycles took 4.312439 s # direct assign func: 10000 cycles took 10.083105 s
Использовался ваш код с прямым присваиванием и моя асм вставка:
void SmlMemoryFill(char * start, int32_t count, SmlColour colour)
{
// SML_UNUSED(start);
// SML_UNUSED(count);
// SML_UNUSED(colour);
// asm volatile(
// "cld\n\t"
// "rep\n\t"
// "stosl"
// : /* no output registers */
// : "c" (count), "a" (colour), "D" (start));
size_t i;
uint32_t * ptr = (uint32_t *)start;
for (i=0; i < count; i++)
{
ptr[i] = colour;
}
}