LINUX.ORG.RU

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

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

При компиляции в одном фале и возврату по указателю и с предрасчётом хеша! то есть так как ниже, хеш быстрее в ~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  &empty;
}