2009-02-19 7 views
3

Я работал над своим сайтом, написанным на php/mysql. Когда я впервые написал это, это были спагетти с большим количеством php, встроенных в html и т. П. - очень сложно поддерживать.OOPS, идет ли производительность?

Я переписал всю вещь с хорошей модульной структурой с OOPS, и теперь ее намного проще поддерживать и расширять.

Но при тестировании производительности сайта с использованием webwait и осаде, более новая, более структурированная версия, похоже, работает и загружается медленнее, чем версия кода спагетти.

Там разница почти 1 секунду времени загрузки - 2.39s против 3.81s

Ничего еще изменилось, кроме кода PHP - не JS, а не CSS

Так что проблема здесь ? Должен ли я вернуться к старому коду? Это случилось с другими?

Edit:

  • Я сделал некоторый анализ, используя похожий на Cachegrind, Inclued, и я думаю, что код довольно хорошо.
  • Я также знаю, что эта проблема не полностью OOPS но больше структуры и т.д. , а также, что ООП вовсе не гарантии лучше производительность.
  • Я также запускал код несколько раз.
  • Я использовал похожем на Cachegrind с KCachegrind, Inclued, осада (большинство инструменты Rasmus Лердорф, изложенные в его DrupalCon 2008 говорить о 'Simple is Hard')

То, что я хочу знать, как другие справляются с этим.

+0

Уже время загрузки старой системы слишком велико. Возможно, база данных неправильно проиндексирована. Используйте профилировщик, чтобы узнать причину и загрузить страницу за несколько десятков миллисекунд. –

+0

проверьте, является ли его просто процедурный код, похожий на OO. Я видел, что это случается, и чаще всего его плохое ОО, которое убивает – Perpetualcoder

+1

. Производительность PHP в OOP не очень хороша, особенно когда вы сравниваете ее с .NET или Java. К счастью, PHP 5.3 или лучше, 6.0 предложит некоторые улучшения скорости, но не серебряную пулю. – TravisO

ответ

1

Я могу придумать пару моментов, чтобы рассмотреть следующие вопросы:

  • Это не выбор против ООП запутанного кода. Существуют и другие парадигмы, которые могут быть столь же поддерживаемыми и структурированными как ООП, но с различными характеристиками производительности. Можно написать код ООП, используя только простые процедурные языковые функции (многие большие C-рамки используют очень стиль OOP-ey.) Более функциональный стиль также может быть проще в некоторых случаях. ООП - это не одна истинная парадигма.
  • Существуют разные степени ООП. Моделирование данных как объектов не в большинстве языков вызывает заметную разницу в производительности (я не знаю, как PHP работает в этой области, хотя, но с PHP я всегда ожидаю худшего). Однако виртуальные функции, наследование (и особенно множественное наследование) медленнее и добавляют накладные расходы, которых часто можно было избежать. Какие функции ООП вы используете? Есть ли более простой дизайн ООП, который бы выполнял эту работу, но с меньшей зависимостью от «медленных» языковых функций?

Кроме того, обычно относится, очевидно, (вы можете оптимизировать алгоритм, включить кэширование или прекомпиляцию, и так далее, - но в то время как те, может значительно помочь, они не относятся к ООП)

6

Профилируйте код. Я понятия не имею, как это делается на PHP, но это единственный разумный способ выработать то, что происходит.

Иногда, делая код более элегантным, окажет пагубное влияние на производительность, но обычно не настолько. Вам нужно поработать там, где время идет, и исправить этот бит.

+0

IIRC есть удивительно хороший профилировщик для PHP, включенный в Zend Studio.Он также создает красочные диаграммы, чтобы произвести впечатление на руководство. –

+0

Если вы хотите перейти на бесплатный маршрут, вот мой блог-пояс, объясняющий, как это сделать с помощью XDebug: http://hype-free.blogspot.com/2008/06/profiling-php-with-xdebug.html –

1
There's a difference of nearly 1 second in loading time - 2.39s vs 3.81s 

То есть разница 3.81-2.39 = 1.42s, который составляет более 50% от меньшего значения, так что не малое число, на мой взгляд. Проводили ли вы несколько раз тесты, чтобы первоначальная стоимость компиляции/интерпретации амортизировалась должным образом? Считаете ли вы, что пытаетесь ввести таймеры, чтобы увидеть, где больше времени, чем раньше? Это будут мои предложения, так как кажется, что вы, возможно, ввели много абстракции и теперь видите цену за это.

14

«Должен ли я вернуться к старому коду?»

Если я скажу, что вы вернулись, вы скажете: «Видите ли, я знал, что OO был выдувным модулем, никто не может сделать приложение OO, которое работает». Это было бы неправильно.

Если я скажу, что не вернусь, вы скажете: «Но это неприемлемо медленно».

Итак, что осталось?

Вы должны написать лучше. Иди вперед. Перепишите свое OO так, чтобы оно действительно работало. OO не «волшебный» - он ничего не гарантирует. Существуют плохие программы OO и хорошие программы OO. В вашем случае у вас, очевидно, есть место для улучшения.

Получите некоторые инструменты профилирования производительности и узнайте, куда прошло время.

Также не следует «оптимизировать» - переписать.

Коэффициенты очень хорошие, что у вас есть какой-то поиск, который занимает много времени. Исключить поиск. Используйте лучшие контейнеры и коллекции (хеш-карты, наборы и т. Д.)

+0

+1 - ремонтопригодность и производительность ортогональны - один не подразумевает другого и наоборот – DanSingerman

1

Попробуйте настроить Xdebug и посмотреть, что он может вам сказать. Кто-то еще сказал, что вы должны проверить это с помощью профилировщика. Я согласен, и Xdebug может предоставить вам одну, а также некоторые другие полезные функции. Ваша IDE-выбор может даже интегрироваться с Xdebug.

0

Одна вещь, которую следует учитывать: используете ли вы APC или какое-то другое решение кэширования кода PHP? Если нет, весь ваш код повторно интерпретируется с нуля каждый раз, когда вы загружаете страницу. Это может повлиять на производительность.

+0

Но относительная разница в производительности будет тем же самым правом? –

+0

Не обязательно, ваш новый код OO может потребовать более сложной интерпретации, чем предыдущий код. –

+0

Не обязательно. APC смещает стоимость include() и require(), но не ускоряет загрузку фактических вычислений. Приложение OO, скорее всего, должно включать гораздо больше кода на каждую страницу, даже если оно никогда не запускается. –

0

OOP означает много вызовов функций, а вызовы функций в динамических языках медленны. Таким образом, «перевод» старого кода в версию ООП замедлит его. Сделайте полную переписывание.

+0

Можете ли вы объяснить немного больше о том, на чем я должен сосредоточиться во время перезаписи? –

+0

Не создавайте лишние классы. Особенно не создавайте классы, которые вы будете использовать только в одном из методов. В любом случае, как уже было сказано, ООП не заставляет ваш код работать быстрее. Это делает его более надежным и легким в освоении, а также ориентированным. Чтобы ускорить использование APC (вы можете кэшировать некоторые объекты) – vartec

Смежные вопросы