1. PHP / Говнокод #5984

    +156

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    $properties_array = array_keys($this->values);
                array_unshift($properties_array, $properties_array[0]);
                unset($properties_array[0]);
                $properties_values_array = array_values($properties_array);
                $values_array = array_values($this->values);
                $properties = implode('` ,`', $properties_values_array);
                $values = implode(', ', array_fill(0, count($this->values), '?'));
                $result = self::$orm->db->prepare('INSERT INTO `' . $this->table . '`  (`' . $properties . '`) values (' . $values . ')');
                foreach ($values_array as $key => $value) {
                    $fieldinfo = $this->fields[$properties_values_array[$key]];
                    $result->bindParam($key + 1, $values_array[$key], $this->correctDataType($fieldinfo['native_type'], $fieldinfo['pdo_type']), $fieldinfo['len']);
                }
                $result->execute();

    Чувствую код плохо пахнет, надо разбирать)) Высоко нагруженный проект ;)

    Запостил: PANACEA, 15 Марта 2011

    Комментарии (7) RSS

    • Исправленный вариант:
      $properties = array_keys($this->values);
                  $keys = implode('`, `', $properties);
                  $params = implode(', :', $properties);
                  $result = self::$orm->db->prepare('INSERT INTO `' . $this->table . '` (`' . $keys . '`) VALUES (:' . $params . ');');
      
                  foreach ($this->values as $property => &$value) {
                      $fieldinfo = $this->fields[$property];
                      $result->bindParam(':' . $property, $value, $this->correctDataType($fieldinfo['native_type'], $fieldinfo['pdo_type']), $fieldinfo['len']);
                  }
                  $result->execute();
      Ответить
    • Микрооптимизации вроде улучшения работы с массивами обычно дают небольшой эффект. Категорически не советую браться за оптимизацию нахрапом, не выполнив предварительного анализа и не выявив на практике, что, где и насколько тормозит, иначе влёгкую может оказаться, что вы тратите силы не на то.
      Ответить
    • Данная оптимизация дала возможность сократить значительную часть кода и повысить читабельность, что считаю наиболее важным, так же сократить время выполнения на 1 сотую секунды в номинальном коде, если учесть что данный код взят из базавого класса модели, то оптимизация оправдана.
      Ответить
      • При оптимизации под высокую нагрузку наиболее важным является снижение этой самой нагрузки, а повышение читабельности или качества кода - вторично. Поставьте проект на сутки профилироваться XDebug'ом, соберите и проанализируйте лог SQL-запросов и выявите топовые, возьмите суточный access-лог и выявите наиболее нагруженные контроллеры. Что самое тяжёлое, то причёсываем в первую очередь - эффект проявится незамедлительно, а это самое главное, когда сервер гнётся и на днях обещает упасть окончательно. Сэкономите и время, и силы. Уже потом имеет смысл браться за причёсывание остального.
        Ответить
      • базаваго
        Ответить
    • Прошу прощения, не совсем корректно выразился вначале, первоочередная задача стояла не разгрузить ресурсы сервера, а повысить отзывчивость скрипта. Скрипт используется для отдачи данных на сайты клиентов во встраиваемые в сайт модули. Профилировщиком пока не ходил, когда будет более цельная система обязательно пройду, но на данном этапе так уж вышло что кусок кода был быстрокодом написанным под ночь в последние минуты из-за чего всю ночь мучили плохие сновидения, чтобы спать спокойно решил код переделать ;)
      За советы огромное спасибо!
      Ответить
    • Польщен, раз кусок кода который кажется мне говном для вас приемлем)))
      Ответить

    Добавить комментарий