memset - самая быстрая функция
Описание:
Заполняет все ячейки массива переданным значением.
Параметры:
array[] - массив/строковая переменная, в которую будет записан результат
val - заполняемое значение
Возвращаемое значение:
Всегда возвращает нуль.
Плюсы реализации:
- Быстрое заполнение. В 4-5 раз быстрее варианта от Slice.
Минусы реализации:- Несовместимость с JIT-плагином.
Код:
Старая версия (с зависимостью)
PHP код:
stock memset(array[], val, size = sizeof array) {
#pragma unused array, val
static
amx_header[AMX_HDR],
bool:is_amx_header_initialized = false;
if (0 == _:is_amx_header_initialized) {
is_amx_header_initialized = true;
GetAmxHeader(amx_header);
}
new
base,
ctx[AsmContext],
cod = -(amx_header[AMX_HDR_DAT] - amx_header[AMX_HDR_COD]);
#emit CONST.pri memset
#emit LOAD.S.alt cod
#emit ADD
#emit STOR.S.pri base
AsmInitPtr(ctx, base, 200);
@emit PROC
@emit LOAD.S.alt 12
@emit LOAD.S.pri 16
@emit FILL (size << 2)
@emit RETN
#emit LCTRL 5
#emit SCTRL 4
#emit CONST.pri memset
#emit ADD.C 4
#emit SCTRL 6
return 0;
}
Новая версия
PHP код:
stock memset(array[], val, size = sizeof array)
{
#pragma unused array, val
static
fill_inst_offset;
if (fill_inst_offset == 0) {
#emit lctrl 6
#emit move.alt // 4
#emit lctrl 0 // 8
#emit add // 4
#emit move.alt // 4
#emit lctrl 1 // 8
#emit sub.alt // 4
#emit add.c 92 // 8
#emit stor.pri fill_inst_offset // 8
} {} //
#emit load.s.pri size // 8
#emit shl.c.pri 2 // 8
#emit sref.pri fill_inst_offset // 8
#emit load.s.alt 12 // 8
#emit load.s.pri 16 // 8
#emit fill 1 // 4
#emit zero.pri
#emit retn
}
Тесты:
Количество итераций: 1 000 000
1) Размер массива: 100
memset(VVWVV without AMX_asm): 423ms
memset(Владокс): 729ms (с фиксом аргументов, иначе она работала бы неправильно)
memset(Slice): 2270ms
2) Размер массива: 10 000
memset(VVWVV without AMX_asm): 7920ms
memset(Владокс): 8336ms (с фиксом аргументов, иначе она работала бы неправильно)
memset(Slice): 12001ms
Пример использования:
PHP код:
main()
{
new array[1000] = {1000,1000+1,...};
print(!"Before:");
printf("0: %d", array[0]);
printf("499: %d", array[499]);
printf("999: %d", array[999]);
memset(array,6);
print(!"After:");
printf("0: %d", array[0]);
printf("499: %d", array[499]);
printf("999: %d", array[999]);
}
См. также:
Автор: VVWVV
Копирование данной статьи на других ресурсах без разрешения автора запрещено.