История изменений
Исправление Deleted, (текущая версия) :
Так или иначе тема закрыта, но если кому интересно такой вариант самый быстрый в общих случаях
material_item * material_entry_item(material_entry* me, char* name) {
for(int i = 0; i < me->num_items; i++){
if(me->names[i][0] == name[0]){
if(strcmp(me->names[i], name) == 0){
return &me->items[i];
}}
}
static material_item empty = {0};
memset(&empty, 0, sizeof(empty));
return ∅
}
При компиляции в одном фале и возврату по указателю и с предрасчётом хеша! то есть так как ниже, хеш быстрее в ~3 раза, только за счёт оптимизаций gcc. Если сунуть это в отдельную компилируемую единицу или вызывать из библиотеки то всё медленее раза в два. Так что если в системе нет SSE2 (ну а вдруг) и strcmp не имеет SIMD ускорялок то можно использовать хеш
material_item * material_entry_item_hash(material_entry* me, char* name) {
unsigned long hash = material_hash(name);
for(int i = 0; i < me->num_items; i++){
if(me->hashes[i] == hash){
return &me->items[i];
}
}
static material_item empty = {0};
memset(&empty, 0, sizeof(empty));
return ∅
}
Исходная версия Deleted, :
Так или иначе тема закрыта, но если кому интересно такой вариант самый быстрый в общих случаях
material_item * material_entry_item(material_entry* me, char* name) {
for(int i = 0; i < me->num_items; i++){
if(me->names[i][0] == name[0]){
if(strcmp(me->names[i], name) == 0){
return &me->items[i];
}}
}
static material_item empty = {0};
memset(&empty, 0, sizeof(empty));
return ∅
}
При компиляции в одном фале и возврату по указателю и с предрасчётом хеша! то есть так как ниже, хеш быстрее в ~3 раза, только за счёт оптимизаций gcc. Если сунуть это в отдельную компилируемую единицу или вызывать из библиотеки то всё медленее раза в два.
material_item * material_entry_item_hash(material_entry* me, char* name) {
unsigned long hash = material_hash(name);
for(int i = 0; i < me->num_items; i++){
if(me->hashes[i] == hash){
return &me->items[i];
}
}
static material_item empty = {0};
memset(&empty, 0, sizeof(empty));
return ∅
}