Что быстрее — глобальная переменная или инициализация класса в другом классе?

Всем добрый день!


Работаю сейчас над проектом который будет работать при высокой нагрузке. Задался сейчас вопросом следующего характера:


К примеру есть класс для работы с базой данных:
class Database
{
 /* что-то тут делаем */
}



Я могу в конфиге объявить:
$db = new Database()


и потом на любой странице с этой переменной работать, сделав
global $db;


Могу поступить по-другому. Есть класс User который использует базу данных. Можно сделать так:
class User
{

public $database;
public function __construct()
{
          $this->database = new Database();
}

public function something()
{
          $this->database->query();
}
}



Либо вообще пронаследоваться от класса Database? Какой вариант по производительности будет выигрышнее? Проект очень глобальный и здесь важен любой выигрыш в производительности.


Всем спасибо!
  • Вопрос задан
  • 5248 просмотров
Решения вопроса 1
Во-первых, это экономия на спичках. Опкэшер фактически удалит разницу между подходами.
Во-вторых, глобальная переменная будет быстрее.
В-третих, зачем писать отдельный класс для работы с БД? Там максимум две функции — подключения к базе и выполнения запроса.
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
DI
Ответ написан
Комментировать
@egorinsk
> Работаю сейчас над проектом который будет работать при высокой нагрузке.
> Что быстрее — глобальная переменная или инициализация класса в другом классе?

Боюсь, что вы даже не представляете себе, что такое «высокие нагрузки». Кстати, не думали двойные кавычки заменить на одинарные и сократить имена переменных до 4 букв (чтобы они помещались в 1 регистр процессора)?
Ответ написан
Комментировать
Stdit
@Stdit
Это будет работать примерно одинаково быстро. Гораздо важнее «что удобнее». Ещё можно использовать готовый фреймворк для модели, если вас интересует результат и срок, а не обучение проектированию на практике. Для поддержки высоких нагрузок, на мой взгляд, важнее уделить внимание архитектуре кластера, в который можно быстро добавлять новые ноды. А оптимизацию кода производить уже потом, наслаждаясь отчётами мониторинга, для экономии издержек на сервера.
Ответ написан
Комментировать
Evengard
@Evengard
А я бы наверное хранил всё нужное в глобальном классе, и при инициализации просто передавал бы указатель на этот самый глобальный класс… Не знаю, насколько это корректно.
Ответ написан
Комментировать
Офтоп: я бы сделал так, если уж месить базу данных с сущностями а-ля ActiveRecord
class Entity
{
  protected $database;

  public function __construct(Database $database)
  {
    $this->database = $database;
  }

}

class User extends Entity
{
  public function __construct(Database $database)
  {
    parent::__construct($database); // дурная привычка, чтобы не забыть если решу конструктор расширить
  }

  public function something()
  {
    $this->database->query();
  }
}


Класс Database сделал бы синглтоном или элементом реестра, и в коде вызывал бы примерно так:
$user = new User(Database::getInstance());
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Используйте singleton. При том, параметризованный, чтобы получить возможность открыть больше одного коннекта к базе — на чтение и запись хотя бы. И с реализацией «ленивой загрузки»
Если вы не поняли, для чего разделение коннектов нужно — вам неважна и на несколько порядков большая разница производительности. Если поняли — то к чему этот вопрос?
Ответ написан
DrNemo
@DrNemo
используйте singleton и будет вам счастье)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы