LINUX.ORG.RU

История изменений

Исправление 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;
    }
}