Я читал и сейчас использую ассоциативные массивы в php в качестве хеш-таблиц. Вот пример того, что я делаю:
$bfHeroMoveHash = $this->createBattlefieldHeroMoveHash($Hero, $move);
if (isset(self::$_battlefieldHeroMoveSnapshots[$bfHeroMoveHash])) {
$this->fastForwardToSnapshot(self::$_battlefieldHeroMoveSnapshots[$bfHeroMoveHash]);
$Attack->Uses--;
} else {
$beforeMoveSnapshot = $this->getBattlefieldSnapshotBefore();
$this->performMove($move);
self::$_battlefieldHeroMoveSnapshots[$bfHeroMoveHash] = $this->getBattlefieldSnapshotAfter($beforeMoveSnapshot);
}
Это все хорошо, когда мне приходится перебирать большой объем данных, и в этом случае это значительно повышает производительность (увеличение производительности примерно на 60%). Тем не менее, для небольших наборов данных производительность снижается. Я предполагаю, что это из-за функции isset()
, с помощью которой я проверяю, присутствует ли мой хэш в хеш-таблице или нет.
Я наткнулся на структуру HashTable
в php ( ссылка здесь ), но переписать весь мой код для этого было бы очень большой работой. (Я использую хеш-таблицы в одном и том же месте в моем скрипте)
В принципе, у меня было бы два вопроса:
- Отличается ли структура
HashTable
от основных ассоциативных массивов php, или это то же самое, только красиво обернутые в функции?
- Есть ли способ избежать замедления моего сценария, когда анализируется только небольшой объем данных, и при этом сохраняется преимущество хеширования одинаковых данных?
Чтобы уточнить мой второй вопрос, что я хотел бы знать, есть ли способ предотвратить накладные расходы на проверку, если хеш-таблица уже существует в хеш-таблице, при их использовании?