powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Микширование бит
25 сообщений из 104, страница 4 из 5
Микширование бит
    #40023003
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

гугли bit twiddling hacks
...
Рейтинг: 0 / 0
Микширование бит
    #40023005
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

👍
...
Рейтинг: 0 / 0
Микширование бит
    #40023006
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU

Polesov

Добавляем первой строкой весьма безобидную ни на что не влияющую операцию
Код: pascal
1.
  xor  ecx, ecx


и получаем замедление где-то в 1.5 раза
Уш-да-уш... Оптимизация asm - дело тонкое ...


Выложи текущий вариант модуля
Чтобы мы тоже погоняли и сравнили

Да чо там выкладывать )
Берем код от Aleksandr Sharahov, сгенеренный D7 (только тип входных параметров меняем на word)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
function ShaAsm(w1, w2: word): dword;
asm
  mov ecx, eax
  shl ecx, 8
  or  eax, ecx
  and eax, $00FF00FF
  mov ecx, edx
  shl ecx, 8
  or  edx, ecx
  and edx, $00FF00FF

  mov ecx, eax
  shl ecx, 4
  or  eax, ecx
  and eax, $0F0F0F0F
  mov ecx, edx
  shl ecx, 4
  or  edx, ecx
  and edx, $0F0F0F0F

  mov ecx, eax
  shl ecx, 2
  or  eax, ecx
  and eax, $33333333
  mov ecx, edx
  shl ecx, 2
  or  edx, ecx
  and edx, $33333333

  mov ecx, eax
  shl ecx, 1
  or  eax, ecx
  and eax, $55555555
  mov ecx, edx
  shl ecx, 1
  or  edx, ecx
  and edx, $55555555

  add eax, eax
  add eax, edx
end;


Замеряем скорость.
Добавляем первой строчкой
Код: pascal
1.
  Xor   ECX,   ECX


и сравниваем с тем, что было до ...
...
Рейтинг: 0 / 0
Микширование бит
    #40023046
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, и до кучи - наверное, самый компактный вариант:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function MixRcr( w1, w2 : word ) : dWord; assembler; register;
asm
     Push   EBX

     Mov    EBX,    EAX    // освобождаем регистр результата
     Mov    ECX,    0Fh    // счетчик цикла

@@10:
     Ror    EDX,    01h    // устанавливаем CF в зависимости от текущего бита w2
     Rcr    EAX,    01h    // задвигаем слева в результат из CF текущий бит w2

     Ror    EBX,    01h    // устанавливаем CF в зависимости от текущего бита w1
     Rcr    EAX,    01h    // задвигаем слева в результат из CF текущий бит w1

//     Loop   @@10 - использование loop для управления циклом увеличивает время чуть более, чем в 2 раза
     Dec    ECX            // проверка счетчика цикла
     Jnz    @@10

     Pop    EBX
end;


И, кстати, не самый медленный )
...
Рейтинг: 0 / 0
Микширование бит
    #40023081
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Хотел через умножения?
Распишитесь в получении.

Не спрашивай, как )
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function ShaMixCool(u, v: dword): dword;
var
  x, y: dword;
begin;
  x:=u and $2492; x:=x*x and $04104104;
  y:=u and $4924; x:=y*y and $10410410 + x;
  u:=u and $9249; x:=u*u and $41041041 + x;

  y:=v and $2492; y:=y*y and $04104104;
  u:=v and $4924; y:=u*u and $10410410 + y;
  v:=v and $9249; y:=v*v and $41041041 + y;

  x:=x+x;
  x:=x+y;
  Result:=x;
  end;
...
Рейтинг: 0 / 0
Микширование бит
    #40023087
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU
Я тут экспериментирую с SIMD
По сути появится возможность анализировать 16 символов за раз
Там классная возможность в том, что проведя ряд манипуляций, ты получаешь маску из 16 бит, где ты видишь, символ удовлетворяет твоему условию или нет
<..>
Получается ты считал 16 символов из памяти. Проанализировал их, получил маску (2 маски по 16 бит)
А потом постепенно вычитываешь эти символы из SIMD-регистра и обрабатываешь согласно имеющейся маске
Если ты в конечном итоге будешь "вычитывать символы" по одному, то ускорение от SIMD возможно только на пропуске пустого места - когда ни один бит в маске не установлен, можно сразу пропустить эти символы. Если таких итераций много, то ОК.
Если нет - нужно думать, как делать обработку (возможно, не всю, а некоторые из этапов) тру-симдовским методом - считать обе ветки условия и микшировать их по маске, без посимвольного разбора и условных jmp-ов.
...
Рейтинг: 0 / 0
Микширование бит
    #40023090
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Так этот вариант ещё медленнее, чем через сдвиги )
Но спрашивать не буду
Видимо всё равно не пойму )
...
Рейтинг: 0 / 0
Микширование бит
    #40023093
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

Зависит от алгоритма
Наибольшей производительности получается достичь если все символы ASCII
Условно говоря при конвертации Ansi в Utf8 - тупо кидаешь все символы и всё
Но возникает вопрос, как быть если встречен не целевой символ
Можно прочитать и обработать его стандартным способом
А можно прикинуть, что в SIMD регистр уже прочитаны данные, а в маске лежит инфа, где что лежит
Получается я SIMD регистр могу использовать не просто, чтобы анализировать, где какие символы идут
Но и как оперативное хранилище прочитанных данных!
...
Рейтинг: 0 / 0
Микширование бит
    #40023094
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU
Aleksandr Sharahov,

Так этот вариант ещё медленнее, чем через сдвиги )
Но спрашивать не буду
Видимо всё равно не пойму )


Да, он примерно на 25% медленнее, но зато прикольный:
использованные в нем константы - единственные,
которые позволяют независимо возводить биты числа в квадрат.
Других троек констант с такими свойствами нет.
...
Рейтинг: 0 / 0
Микширование бит
    #40023097
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU
Aleksandr Sharahov,
Так этот вариант ещё медленнее, чем через сдвиги )


Кстати, асм-версия на умножениях обгоняет асм-версию на сдвигах примерно на 10%:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
function ShaMixCoolAsm(u, v: dword): dword;
asm
  push ebx
  mov ebx, eax
  and ebx, $2492
  imul ebx, ebx
  and ebx, $04104104
  mov ecx, eax
  and ecx, $4924
  imul ecx, ecx
  and ecx, $10410410
  add ecx, ebx
  and eax, $9249
  imul eax, eax
  and eax, $41041041
  add eax, ecx

  mov ebx, edx
  and ebx, $2492
  imul ebx, ebx
  and ebx, $04104104
  mov ecx, edx
  and ecx, $4924
  imul ecx, ecx
  and ecx, $10410410
  add ecx, ebx
  and edx, $9249
  imul edx, edx
  and edx, $41041041
  add edx, ecx

  lea eax,[edx+eax*2]
  pop ebx
  end;
...
Рейтинг: 0 / 0
Микширование бит
    #40023098
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
удалил дубликат
...
Рейтинг: 0 / 0
Микширование бит
    #40023100
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU
Sapersky,
Условно говоря при конвертации Ansi в Utf8 - тупо кидаешь все символы и всё
Но возникает вопрос, как быть если встречен не целевой символ
А, ну если "левые" символы изредка встречаются, тогда может и будет толк.
SOFT FOR YOU
А можно прикинуть, что в SIMD регистр уже прочитаны данные, а в маске лежит инфа, где что лежит
Получается я SIMD регистр могу использовать не просто, чтобы анализировать, где какие символы идут
Но и как оперативное хранилище прочитанных данных!
Не факт, что разбор маски - это так уж быстро.
Если использовать bsr, то нужно очищать каждый найденный бит. Если просто всё перебирать, то это shr/and/условие для каждого бита.
Я кстати возился со строками и SIMD год назад:
https://www.sql.ru/forum/1319647-a/poisk-v-fayle-s-ispolzovaniem-mmf
хотя там разбор маски точно неоптимален, перебор всех бит на Паскале.
...
Рейтинг: 0 / 0
Микширование бит
    #40023122
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Описание логики работы алгоритма на умножениях
22239874 и 22239895 .

Как и в алгоритме на сдвигах мы вычисляем для переданных
параметров (u,v) 2 промежуточных результата t(u) и t(v),
а затем на их основе получаем окончательный результат
r(u,v)=2*t(u)+t(v).

Отличие от алгоритма на сдвигах состоит в том,
какими операторами t мы раздвигаем биты каждого параметра.

Очевидно, что t(0)=0.

Понятно, что если параметр содержит ровно 1 ненулевой бит
в i-той позиции, то t(2^i)=2^(2*i)=(2^i)*(2^i), или t(x)=x*x.
Т.е. и в этом случае достаточно возвести параметр в квадрат.

При возведении в квадрат параметра, содержащего
2 ненулевых бита, в соответствии биномом Ньютона,
мы получим (x+y)*(x+y)=x*x+y*y+2*x*y.
А правильный результат t(x+y)=x*x+y*y.
Т.е. в этом случае мы получили погрешность в виде
удвоенного произведения ненулевых битов.

Если параметр будет содержать большее количество
ненулевых битов, то при возведении в квадрат мы
будем получать погрешность для каждой пары битов.

Избавиться от погрешности наложением битовой маски
на результат возведения в квадрат невозможно,
т.к. позиции битов погрешности могут совпадать
с позициями битов результата.

Однако, если произвольно выбрать некоторое
множество разрешенных позиций битов параметра,
то для него мы можем указать
множество разрешенных позиций битов результата.

Далее мы будем рассматривать только "хорошие"
множества разрешенных позиций битов параметра,
для которых биты погрешности не попадают
в множество разрешенных позиций битов результата.

Несмотря на то что хороших множеств довольно много,
их мощность невелика. Самое большое хорошее множество
состоит из 6 битовых позиций, остальные еще меньше.

В алгоритме используется минимальное покрытие
множества 16 битовых позиций параметра
тремя хорошими множествами мощности 5+5+6,
которые заданы масками $2492, $4924, $9249.

Другие три маски $04104104, $10410410, $41041041
задают три соответствующих им множества
разрешенных позиции битов результата.

Алгоритм разделяет биты параметра на три части,
каждую часть возводит в квадрат, отсекает в них
биты погрешности и соединяет части.
...
Рейтинг: 0 / 0
Микширование бит
    #40023128
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

У меня мозги не так хорошо работают, чтобы это понять
Но я буду стараться :)
А почему ты программируешь на D7?
...
Рейтинг: 0 / 0
Микширование бит
    #40023129
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

Я сейчас низкоуровневый код пишу на Си, а к Delphi/FPC/C++Builder линкую объектники
Благодаря инлайн функциям и макросам мне удаётся писать высокопроизводительный код под все 10 платформ (5 ОС по 2 битности). Для x86/x64 юзаются команды SSE2, на ARM - NEON. Пока юзаются регистры по 16 байт. Наверное на следующем уровне перейду на 32 или даже 64. Но пока так - всяко лучше, чем регистры общего назначения )
...
Рейтинг: 0 / 0
Микширование бит
    #40023131
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

мне хватает )
...
Рейтинг: 0 / 0
Микширование бит
    #40023150
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

Раз уже пошла такая пьянка, проиллюстрирую немного :)

Есть у меня функции AStrLen/WStrLen/CStrLen. Данная функция написана на Си, но скомпилирована в объектный файл под разные платформы и цепляется как обычная паскалевская функция:
Код: pascal
1.
2.
3.
function AStrLen(const S: PAnsiChar): NativeUInt;
function WStrLen(const S: PWideChar): NativeUInt;
function CStrLen(const S: PUCS4Char): NativeUInt;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
REGISTER_DECL64 native_uint WStrLen(char16_t* chars)
{
    if (!chars) return 0;

    if ((native_int)chars & 1)
    {
        char16_t* _s = chars;
        for (;;)
        {
            if (*_s == 0) break;
            _s++;
        }
        return ((native_uint)_s - (native_uint)chars) >> 1;
    }

    static native_uint arr[sizeof(native_uint) / sizeof(char16_t)] = {
        0,
        ((native_uint)1 << (16 * 1)) - 1
    #if defined (LARGEINT)
        ,
        ((native_uint)1 << (16 * 2)) - 1,
        ((native_uint)1 << (16 * 3)) - 1
    #endif
    };

    char8_t* s = (char8_t*)((native_int)chars & -sizeof(native_uint));
    native_uint index = ((native_int)chars & (sizeof(native_uint) - 1)) >> 1;
    native_uint x = *((native_uint*)s) | arr[index];

    for (;;x = *((native_uint*)s))
    {
    #if defined (SMALLINT)
        if ((x & 0x0000ffff) == 0) break;
        s += sizeof(char16_t);
        if ((x & 0xffff0000) == 0) break;
        s += sizeof(char16_t);
    #else
        native_uint u = x - MASK_0001_NATIVE;
        x = ~x & u;
        if (x & MASK_8000_NATIVE) break;
        s += sizeof(native_uint);
    #endif
    }
    #if defined (LARGEINT)
    s += (bit_fastindex(x & MASK_8000_NATIVE) >> 4) * sizeof(char16_t);
    #endif

    return ((native_uint)s - (native_uint)chars) >> 1;
}



Из кода хорошо видно, что функция эффективно работает только на 64 битах, когда анализируется сразу 4 символа за итерацию. И то, если указатель выравнен на границу WideChar. Кстати я давно использую этот подход, когда через маски и битовые итерации анализируется сразу несколько символов. Минуса 2: во-первых, очень сильно расходуются регистры общего назначения, во-вторых, по сути ты можешь определить только первое вхождение, состояние остальных символов становится неизвестно. С SIMD по сути ты видишь картину целиком, плюс регистры общего назначения практически не расходуются. А на Си есть возможность зафигачить макросы и инлайн функции, что в итоге выльется в удобоваримые конструкции на несколько платформ и реализация сразу нескольких функций. Вот реализация AStrLen/WStrLen/CStrLen:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
FORCEINLINE bool InternalStrLen(char8_t** ptr_s, native_uint* ptr_mask,
  native_uint char_size, native_uint shift_bytes, block16 null, block16 CMPBLOCK16_MASKBITS)
{
    block16 xcmp, x;
    native_uint mask;
    native_uint high_clear_mask = (shift_bytes)?(0xffff >> char_size):((native_uint)-1);
    char8_t* s = *ptr_s;
    
    // first block
    block16* block = (block16*)((native_int)s & -sizeof(block16));
    native_uint invalid_bytes = ((native_uint)s - (native_uint)block - shift_bytes);
    if (!shift_bytes || (invalid_bytes != (sizeof(block16) - char_size)))
    {
        x = block16_switchshr_bytes(*block, *block, shift_bytes);
        xcmp = block16_cmpe_ex(x, null, char_size);
        mask = bitmask_clear(block16_cmpmask_ex(xcmp, CMPBLOCK16_MASKBITS), invalid_bytes) & high_clear_mask;
        if (mask) goto done;
    }  

    // block loop
    DISABLE_LOOP_UNROLL
    for (;;)
    {
        block++;
        if (shift_bytes) 
        {
            s = (uint8_t*)block + shift_bytes - char_size;
            if (StrGetChar(s, 0, char_size) == 0) 
            { 
                *ptr_s = s;
                return true;
            }    
        }

        x = block16_switchshr_bytes(*block, *block, shift_bytes);
        xcmp = block16_cmpe_ex(x, null, char_size);
        if (internal_block16_cmpmask_ex(&mask, xcmp, high_clear_mask)) goto done;
    }

done:
    *ptr_s = (uint8_t*)block + shift_bytes;
    *ptr_mask = mask; 
    return false;
}

FORCEINLINE native_uint StrLen(ptr_t chars, native_uint char_size)
{
    if (!chars) return 0;
   
    block16 null = volatile_null_block16;
    internal_block16_cmpmaskinit;

    native_uint mask;
    uint8_t* s = chars;
    if (likely(((native_int)s & (char_size - 1)) == 0))
    {
        if (InternalStrLen(&s, &mask, char_size, 0, null, CMPBLOCK16_MASKBITS)) goto done;
    }
    else if (((native_int)s & (char_size - 1)) == 1)
    {
        if (InternalStrLen(&s, &mask, char_size, 1, null, CMPBLOCK16_MASKBITS)) goto done;
    } 
    else if (((native_int)s & (char_size - 1)) == 2)
    {
        if (InternalStrLen(&s, &mask, char_size, 2, null, CMPBLOCK16_MASKBITS)) goto done;
    }
    else if (((native_int)s & (char_size - 1)) == 3)
    {
        if (InternalStrLen(&s, &mask, char_size, 3, null, CMPBLOCK16_MASKBITS)) goto done;
    }

    s += bit_fastindex(mask);

done:
    return ((native_uint)s - (native_uint)chars) / char_size;
}

REGISTER_DECL64 native_uint AStrLen(char8_t* chars)
{
    return StrLen(chars, sizeof(*chars));
}

REGISTER_DECL64 native_uint WStrLen(char16_t* chars)
{
    return StrLen(chars, sizeof(*chars));
}

REGISTER_DECL64 native_uint CStrLen(char32_t* chars)
{
    return StrLen(chars, sizeof(*chars));
}


И вот смотри, в какую красоту превращается WStrLen. По сути там 2 кейса: выравненный и невыравненный. В выравненном анализируется 8 символов за итерацию. В невыровненном 7 + 1 :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
WStrLen: # @WStrLen
  test eax, eax
  je .LBB0_1
  push esi
  mov edx, eax
  mov ecx, eax
  xorps xmm0, xmm0
  and edx, -16
  sub ecx, edx
  test al, 1
  jne .LBB0_6
  movdqa xmm1, xmmword ptr [edx]
  pcmpeqw xmm1, xmm0
  pmovmskb esi, xmm1
  shr esi, cl
  shl esi, cl
  test esi, esi
  jne .LBB0_14
.LBB0_4: # =>This Inner Loop Header: Depth=1
  movdqa xmm1, xmmword ptr [edx + 16]
  add edx, 16
  pcmpeqw xmm1, xmm0
  pmovmskb esi, xmm1
  test esi, esi
  je .LBB0_4
.LBB0_14:
  rep bsf ecx, esi
  add ecx, edx
.LBB0_15:
  sub ecx, eax
  shr ecx
  pop esi
  mov eax, ecx
  ret
.LBB0_1:
  xor ecx, ecx
  mov eax, ecx
  ret
.LBB0_6:
  dec ecx
  cmp ecx, 14
  je .LBB0_8
  movdqa xmm1, xmmword ptr [edx]
  psrldq xmm1, 1 # xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
  pcmpeqw xmm1, xmm0
  pmovmskb esi, xmm1
  shr esi, cl
  shl esi, cl
  and esi, 16383
  jne .LBB0_13
.LBB0_8:
  add edx, 15
.LBB0_9: # =>This Inner Loop Header: Depth=1
  cmp word ptr [edx], 0
  je .LBB0_10
  movdqa xmm1, xmmword ptr [edx + 1]
  add edx, 16
  psrldq xmm1, 1 # xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
  pcmpeqw xmm1, xmm0
  pmovmskb esi, xmm1
  and esi, 16383
  je .LBB0_9
  add edx, -15
.LBB0_13:
  inc edx
  jmp .LBB0_14
.LBB0_10:
  mov ecx, edx
  jmp .LBB0_15

...
Рейтинг: 0 / 0
Микширование бит
    #40023154
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOU
А почему ты программируешь на D7?


ну наконец-то !
...
Рейтинг: 0 / 0
Микширование бит
    #40023174
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU
Sapersky,
Я сейчас низкоуровневый код пишу на Си, а к Delphi/FPC/C++Builder линкую объектники
Благодаря инлайн функциям и макросам мне удаётся писать высокопроизводительный код под все 10 платформ (5 ОС по 2 битности)
Да, сишные компиляторы в целом лучше подходят для низкоуровневой оптимизации. Хотя микс из разных языков затрудняет отладку, особенно линковка в виде obj - как их отлаживать из Дельфи? Только как ассемблер. Или писать тесты на Си и надеяться, что всё отладишь там.
Конкретно StrLen - странный пример. Можно подумать, сейчас часто используются нуль-терминированные строки. Или ты там всю RTL переписываешь из любви к искусству?
И кстати, какую выгоду даёт выравнивание на x86? У меня сложилось впечатление, что на современных процессорах небольшую, ну может 10%.
...
Рейтинг: 0 / 0
Микширование бит
    #40023179
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sapersky
Хотя микс из разных языков затрудняет отладку, особенно линковка в виде obj - как их отлаживать из Дельфи?

Так же, как функции WinAPI ))
...
Рейтинг: 0 / 0
Микширование бит
    #40023181
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

Ну отлаживать конечно сложнее
Тут спорить не буду

Ну а что делать?
Embarcadero оптимизировать свои компиляторы не хочет
Под Linux вообще труба, ещё хуже, чем под Виндой
Ну и потом, описывая часть кода на Си, есть перспектива реюзания в Си-проектах

А насчёт примера StrLen... это просто пример
Я планирую масштабное переписывание функций обработки текстов на зиму. Пока есть несколько функций на SIMD, просто решил показать. Есть ещё CompareMem, сравнение строк. Кто хочет - может запилить бенчмарки, мне пока влом )

Насчёт выравнивания... большая тема
Но в StrLen оно имеет смысл не с точки зрения оптимизации, а с той точки зрения, что не учитывая выравнивание, ты всегда можешь попасть на недоступную страницу. Выравнивая адрес, ты всегда можешь гарантировать валидное чтение. Или условно валидное )
...
Рейтинг: 0 / 0
Микширование бит
    #40023182
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще заходите в наше DelphiCommunity в телеграме!
Будем обсуждать там то, что не укладывается в формат форума
...
Рейтинг: 0 / 0
Микширование бит
    #40023196
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky

И кстати, какую выгоду даёт выравнивание на x86? У меня сложилось впечатление, что на современных процессорах небольшую, ну может 10%.

Без него SSE вообще не работает AFAIK.
...
Рейтинг: 0 / 0
Микширование бит
    #40023198
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOU
Я планирую масштабное переписывание функций обработки текстов на зиму


и всё, конечно же, будет самым быстрым во всём мире ?
...
Рейтинг: 0 / 0
Микширование бит
    #40023200
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator
SOFT FOR YOU
Я планирую масштабное переписывание функций обработки текстов на зиму


и всё, конечно же, будет самым быстрым во всём мире ?

Ну, не самым, конечно. Но что глючить будет - это 100%.
...
Рейтинг: 0 / 0
25 сообщений из 104, страница 4 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Микширование бит
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]