LINUX.ORG.RU

PHP vs RoR vs Django


0

0

Опубликованы результаты сравнительных испытаний производительности трёх различных веб-фреймворков: Symphony(PHP), Ruby on Rails и Django(Python).

Вкратце: Rails оказался гораздо быстрее, чем Symphony, а Django - гораздо быстрее, чем Rails.

>>> Подробности

★★

Проверено: Shaman007 ()

Ответ на: комментарий от CrazyPit

> ля руби - сторонняя реализация

Вот я и талдычу об инфраструктуре, которой пока ни для кого нету. Кроме PHP и Perl. Да отчасти ASP.

Aceler ★★★★★
()
Ответ на: комментарий от KRoN73

> У меня шаблоны не в файлах, а в БД.

Глупо, вообще-то. А код у вас тоже в БД? Но если хочется разнообразия в сексе, то и Django несложно приучить таскать шаблоны хоть из БД, хоть из zip-архивов, хоть из виндовского реестра. :D

anonymous
()
Ответ на: комментарий от anonymous

>Глупо, вообще-то. А код у вас тоже в БД?

Почему сразу глупо? У меня каждый пользователь прикручивает свой шаблон, потом я его сливаю в бдб, ну а потом по кэшам ;)

Или мне на каждого пользователя надо файл с шаблоном заводить.. Ситуаций ведь много разных бывает, зачем сразу говорить что это глупо :)

forgiven
()
Ответ на: комментарий от anonymous

> Глупо, вообще-то. А код у вас тоже в БД?

Еще одного послать на Yandex?

Aceler ★★★★★
()
Ответ на: комментарий от anonymous

>Глупо, вообще-то.

Нет. Данные из БД извлекаются быстрее, чем из файловой системы. По крайней мере на PHP ;) (Perl в пример не берём, сейчас не знаю, а года три назад извлечение данных через DBI было в 9(девять!) раз медленнее, чем через mysql_connect+mysql_query)

>Но если хочется разнообразия в сексе, то и Django несложно приучить таскать шаблоны хоть из БД

Так и запишем - в Django извлекать шаблоны из БД - затрахаешься.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Так и запишем - в Django извлекать шаблоны из БД - затрахаешься.

Ох уж мне эти записыватели. Ваш ПХП, наверно, читает и выполняет ваши желания прямо из моска, раз написать функцию load_template_source(template_name) из десяти строчек - это уже "затрахаешься"? А таскать можно хоть через джанговский ОРМ. Тогда и редактировать можно будет из джанговской автоматической админки, и права доступа на них раздавать какие надо.

anonymous
()
Ответ на: комментарий от anonymous

> написать функцию load_template_source(template_name) из десяти строчек - это уже "затрахаешься"?

Так в том-то и дело, что тут идёт борьба за каждую строку, каждый символ ;) Смотри споры выше про то, чей код короче и изящней.

annonymous ★★
()
Ответ на: комментарий от Aceler

> А в RoR автоматическая админка есть?

Нет. :( Есть т. н. scaffolding, но до админки ему расти ещё 10000 лет.

anonymous
()
Ответ на: комментарий от Aceler

15 страниц епть
работники блин, когда работать будете?
сколько можно лясы чесать. ну нравится людям пхп они и мануал наизусть выучили. чо им теперь переучиваться?

давайте я вам еще тем подкину:

- windows лучше чем linux
- freebsd гумно
- kde4 умоет macosx aqua

а сам уйду пахать на благо родины

gigabito
()
Ответ на: комментарий от annonymous

> Так в том-то и дело, что тут идёт борьба за каждую строку, каждый символ ;)

Ну итить. Не надо слова про 10 строчек понимать буквально. Можно, наверно, и в 2-3 уложиться.

Или идёшь на http://code.djangoproject.com/newticket, заполняешь заявку, и если твоя функция окажется полезной, её с удовольствием включат в основное дерево.

anonymous
()
Ответ на: комментарий от Aceler

> http://fckeditor.net/

Не позорься, мальчег Ацелер. Этот эдитор на яваскрипте. Реализация серверной части уже есть в двух вариантах для руби. Так что спи спокойно. Питон тоже есть в наличии.

anonymous
()
Ответ на: комментарий от CrazyPit

> Нет. Но есть плугины:)

Ну так и джанговская админка - такой же плугин. :) А в рельсе такого плугина нету, факт.

anonymous
()
Ответ на: комментарий от anonymous

Да, насчет авто-адмнки правда. Нету под рельсы. Я за две недели сделал себе эту хрень. Ниже приведу пример сценария добавления новостей. Вот весь код контроллера:

class Admin::NewsController < AdminBaseController
  before_filter :authorize
  layout "admin"

  # script definition
  @@script_definition = {
    :model => :news,
    :list_columns => %w( id title text ),
    :list_paginate => {
      :order => 'id desc'
    },
    :obligatory_fields => %w( title text ),
    :form_fields => %w( title hot fixed text ),
    :fields => {
      'id' => {
        :title => "Id",
      },
      'title' => {
        :title => "Название",
        :tag => 'text_field',
      },
      'hot' => {
        :title => "Горячая",
        :tag => 'check_box',
      },
      'fixed' => {
        :title => "Фиксировать",
        :tag => 'check_box',
      },
      'text' => {
        :title => "Текст",
        :tag => 'fckeditor_text_field',
        :list_filter => 'cut',
      }
    }
  }
end

Как видите, используется и fckeditor и сам код записан чисто в декларативном стиле. Тоесть просто описана форма и формат вывода списка новостей. У меня похожая вещь есть и для php, но в отличие от него, на РОР-е не пришлось писать SQL-запросов.

anonymous
()
Ответ на: комментарий от anonymous

Сорри, за растянутую таблицу :).

Вобщем создание обычного админского скрипта занимает 5-10 минут. Неплохо было бы еще генератор под это дело замутить, но пока что не горит :).

ЗЫ: Может все-таки кто-то кинет линк на тексовское форматирование.

anonymous
()

Ой, что я нашел!

mod_parser :)

Aceler ★★★★★
()
Ответ на: комментарий от anonymous

> class Admin::NewsController < AdminBaseController
before_filter :authorize
layout "admin"

# script definition

То же самое и за то же время можно делать в php. Уже много лет.
Например, с помощью связки DB_Table+HTML_Quickform+DB_Datagrid.
Такой же декларативный стиль, такой же простой и даже более изящный
стиль. Теперь подобные вкусности наконец-то появились и для ruby.
Ну, и вопрос напрашивается внновь и вновь: в чём новизна и в чём выгода?

annonymous ★★
()
Ответ на: комментарий от annonymous

> Ну, и вопрос напрашивается внновь и вновь:

Где научная новизна? :)

Aceler ★★★★★
()
Ответ на: комментарий от gigabito

>15 страниц епть >работники блин, когда работать будете? >сколько можно лясы чесать. ну нравится людям пхп они и мануал наизусть выучили. чо им теперь переучиваться?

И все-таки, умный народ украинцы :)

dv5ife
()
Ответ на: комментарий от annonymous

> Например, с помощью связки DB_Table+HTML_Quickform+DB_Datagrid.

Слушай, харош брехать. Если ты имеешь ввиду классы из Пииира, то с того говна, что ты перечислил ничего не можно задействовать на практике. Я когда-то пытался, потом блеванул и просто доделал нужную функциональность в собственных классах.

Потом хотя бы не врал насчет "Такой же декларативный стиль, такой же простой и даже более изящный", потому что в пхп для создания ассоциативных массивов используется array и код уже будет длиннее.

Ты вообще читал, что я написал выше? Там написано, что такое же я сделал для пхп раньше, но мне пришлось ипаться с sql-ем, что уже не есть хорошо.

Cris
()
Ответ на: комментарий от KRoN73

>>Хороший программист пишет не на том, что ему нравится, а на том, что лучше подходит для решения задачи.

>Мне интересно, найдётся тут маргиналы, которые под этим не подпишутся? :)

Критерий "лучше подходит" какой-то нечеткий. Например - входит ли в него положение "язык должен нравится программистам" ? :)

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

> Вобщем создание обычного админского скрипта занимает 5-10 минут. Неплохо было бы еще генератор под это дело замутить, но пока что не горит

Слуш запость плиз этот код куда-нибудь на rubyforge например или ещё куда - получиться очень хороший плагин

CrazyPit ★★★
()
Ответ на: комментарий от annonymous

> DB_Table+HTML_Quickform+DB_Datagrid.

пробовал - не гибко. А так что насчёт ORM нормальной? Вы товарищ как понимаю более-менее шарите.

CrazyPit ★★★
()
Ответ на: комментарий от CrazyPit

Дело в том, что я пошел в этом деле очень много раз против религии :). Например вынес вещи, которые относятся к модели в script_definition (который сам по себе находится в контроллере) :). Боюсь, что запинают :)

Потом дал возможность модели получить доступ к данным из контроллера. Обсуждали это здесь http://community.livejournal.com/ruby_ru/19413.html .

Ну и кроме того, его еще нужно вылизать нормально. Но когда сделаю и почищу его от лишнего, могу выложить, мне для пользы общего дела не жалко :)

Cris
()
Ответ на: комментарий от Cris

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

Не торопись показывать всем свою некомпетентность. Я не буду спорить.
Проще один раз показать, чем много рассказывать. Итак, сравниваем.

Твой код на ruby:

class Admin::NewsController < AdminBaseController
  before_filter :authorize
  layout "admin"

  # script definition
  @@script_definition = {
    :model => :news,
    :list_columns => %w( id title text ),
    :list_paginate => {
      :order => 'id desc'
    },
    :obligatory_fields => %w( title text ),
    :form_fields => %w( title hot fixed text ),
    :fields => {
      'id' => {
        :title => "Id",
      },

============================

Мой аналог на php:

class news extends DB_Table
{
  var $col = array(
    'id' => array(
      'type' => 'integer',
      'require' => true,
      'qf_label' => 'ID', 
      'qf_type' => 'hidden',
    ),
    'title' => array(
      'type' => 'varchar',
      'size' => 255,
      'qf_label' => 'Title', 
      'qf_type' => 'text',
      'qf_attrs' => array('size' => 80),
    ),
    'hot' => array(
      'type' => 'boolean',
      'qf_label' => 'Hot', 
    ),
    'fixed' => array(
      'type' => 'boolean',
      'qf_label' => 'Fix', 
    ),
    'newstext' => array(
      'type' => 'clob',
      'qf_label' => 'Text', 
      'qf_type' => 'text',
      'qf_attrs' => array(
        'cols' => 80,
        'rows' => 20,
        'class' => 'fckeditor',
      ), 
    ),
  );

  var $idx = array(                                                                            
    'id' => 'unique',                                                                        
    'title' => 'normal',                                                                   
  );

  var $sql = array(                                                                                                            
    'all' => array(                                                                          
      'select' => '*',
      'order'  => 'id desc',
    )
  );                                                        
} // end of class news

Мои преимущества:

1) Из определения класса news я автоматически имею определение таблицы 
БД, которая создаётся вместе с индексами на лету при первом обращении (create table).

2) У меня нет лишней сущности - твоего списка obligatory_fields. 
Обязательность поля указывается непосредственно в его определении свойством 'required'.

3) Не знаю, возможно ли это в твоём коде, а у меня в определении поля
я могу вставить любое правило его проверки, в дополнение к автоматическим проверкам на тип переданного значения.

annonymous ★★
()
Ответ на: комментарий от PartyZan

>> так вот, реальные проекты предполагают один срок сдачи - "вчера вечером".
>Реальные проекты предполагают сначала выяснение требований, оценку временных затрат и проектирование.
>PartyZan ** (*) (17.07.2006 15:21:44)

Молодец Партизан! - все правильно! Только _после_ "выяснение требований, оценку временных затрат и проектирование" наступает "срок сдачи - вчера вечером!". Welcome to real life :)

GR.

anonymous
()
Ответ на: комментарий от anonymous

> Только _после_ "выяснение требований, оценку временных затрат и проектирование" наступает "срок сдачи - вчера вечером!". Welcome to real life :)

Странные какие-то у вас проекты... нет, конечно если сразу сказать "будет готово завтра" без оценки рисков, требований (хотя бы начальных) и существующих аналогов, то да, как раз так и получится

PartyZan ★★★
()
Ответ на: комментарий от tailgunner

>Критерий "лучше подходит" какой-то нечеткий. Например - входит ли в него положение "язык должен нравится программистам" ? :)

Программистам _вообще_? Нахрена. Инстинкт тусовки?

Тебе _лично_ - обязательно. Писать на нелюбимом языке - явно снижать производительность работы за счёт худшей эргономики :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>>Критерий "лучше подходит" какой-то нечеткий. Например - входит ли в него положение "язык должен нравится программистам" ? :)

>Программистам _вообще_? Нахрена. Инстинкт тусовки?

Не "вообще", конечно. Да и нет такого языка, который нравился бы программистам "вообще" :) Язык должен нравится коллективу, который работает над задачей.

> Тебе _лично_ - обязательно. Писать на нелюбимом языке - явно снижать производительность работы за счёт худшей эргономики :)

Яволь!

Значит, входит такое положение.

tailgunner ★★★★★
()

На основании личного опыта поддержки "проектов" писанных пыхпыхкодерами, могу утверждать, что наиболее частые ошибки в их "коде" -- ошибки в проектировании. Не хватает абстрактного мышления умельцам. Это к слову о пользе низкого порога вхождения.

ЗЫЖ. К примеру, что такое JOIN, не говоря уже о реляционной алгебре, 95% понятия не имеет.

ЗЗЫЖ. Наболело.

ЗЗЗЫЖ. Пишу на пыхпыхе :)) Так пришлось.

anonymous
()
Ответ на: комментарий от anonymous

> Молодец Партизан! - все правильно! Только _после_ "выяснение требований, оценку временных затрат и проектирование" наступает "срок сдачи - вчера вечером!". Welcome to real life :)

Если у ПМ-а часто срок сдачи "вчера вечером", то вам надо найти ПМ-а, который имеет понятие о проектировании и оценках сроков. И никакого отношения текущий ПМ (проедатель мозга) к риллайф не имеет. Гнать такого надо об стену.

anonymous
()

В джанговском факе вот чего нашёл (цитата): "Стабилен ли Django? Да. World Online использует Django уже больше двух лет. Сайты, построенные на Django, выдержали наплывы трафика мощностью более миллиона запросов в час и несколько публикаций на Слешдоте. Да, Django вполне стабилен."

http://www.djangoproject.com/documentation/faq/#is-django-stable

anonymous
()
Ответ на: комментарий от anonymous

Это к вопросу о сайте "с 2 лимонами пользователей в день", если кто ещё помнит, о чём речь шла. :)

anonymous
()
Ответ на: комментарий от anonymous

> trac - система управления проектами. Питон.

Кстати, они в рассылке несколько раз говорили, что собираются переписать его на Django. См. напр. http://lists.edgewall.com/archive/trac/2005-August/004244.html. Правда, до сих пор не переписали, тунеядцы.

anonymous
()
Ответ на: комментарий от anonymous

>Это к вопросу о сайте "с 2 лимонами пользователей в день", если кто ещё помнит, о чём речь шла. :)

вобще конечно сложно говорить о производительности ибо аля-википедия завсегда будет быстрее аля-гугли. но джанги правы, у нас (правда на черипухе) при 2х лямах в день тот сервак (dualxeon 2gb ram) показывал la где-то в районе 1-2 так что его еще грузить и грузить было. задача намного сложней чем у вики. если примерно, для пробегающего юзера по конкретным параметрам обновлять конкретные значения порядка 10 массивов. в питоне все летало. в пхп бы пришлось играть в игры с shared mem либо постоянно скидывать в мой-ексюель. в последнем случае, должен заметить, даже heap-таблицы с индексом на каждую возможную комбинацию ключей тормозят нипадецки

gigabito
()
Ответ на: комментарий от annonymous

Ну и ты сгенеришь из этого кода только форму со всеми валидацями. В РоР такая же херня вообще без кода делаеться (только с SQL). А у товарща Криса, я так понимаю генрится полностью админка... Хотя я не видел как это выглядит не могу утверждать.

CrazyPit ★★★
()
Ответ на: комментарий от annonymous

> Пример негибкости?

Нужно прикреплять к сущность картнику, файл картинки хранится в поле таблицы, нужно аплоадить его в той же форме. В rails это делаеться 1 строкой в контроллере 1 во view. Как с QuickForm? Ну или нужно поле с ajax автокомлитом. Тоже самое 1 строка в контроллере 1 во view...

CrazyPit ★★★
()
Ответ на: комментарий от KRoN73

>> Поищи по терминам zope/plone

> Зачем искать, если я их даже использовал. При их тормознутости верить в то, что на них можно что-то из области Википедии сбацать - это уже надо быть оголтелым фанатом :)

А зачем на zope/plone реализовывать проект а-ля Википедия (можно подумать, что каждый второй Ваш проект - из той же оперы по нагрузке)? Что есть Википедия - огромный сторадж неструктуризированной информации. Там бизнес-логики - ноль. И реализовывать это на zope/plone - это все равно, что стрелять из пушки по воробьям. zope играет на поле java app-систем. А на этом поле php даже очень нерядом не валялся.

anonymous
()
Ответ на: комментарий от annonymous

> Пробуйте EZPDO. http://www.ezpdo.net/blog/cats/ezpdo

Ну уже получше чем я видел в основном. Хотя опять из-за убогости ПыхПых пришлось добавлять внешний парсер. Хотя в CakePHP без этого обошлись... Но до ActiveRecord ещё далеко.

Ладно чё я загоняюсь, вроде забыл о ПХП как о страшном сне... Perl - нашё всё;)

CrazyPit ★★★
()

мда

Aceler, а как ты вообще можешь что-то делать, если такие глупые ляпы допускаешь? :) fckeditor у него на пыхпыхе, ооо на жабе, сроки сдачи вчера...писец

geek ★★★
()
Ответ на: комментарий от anonymous

+256 Добавлю еще один веселый сценарий: При внедрении системы - ответить за все глюки того, чем заказчик пользовалься раньше.

anonymous
()
Ответ на: комментарий от geek

> Aceler, а как ты вообще можешь что-то делать, если такие глупые ляпы допускаешь? :) fckeditor у него на пыхпыхе, ооо на жабе, сроки сдачи вчера...писец

Эт точно.

FCKeditor_2.3.tar.gz

file: fckeditor.py

и хде проблема по интеграции?

anonymous
()
Ответ на: комментарий от annonymous

> 1) Из определения класса news я автоматически имею определение таблицы БД, которая создаётся вместе с индексами на лету при первом обращении (create table).

Это не преимущество, а особенность реализации. Я тоже могу сделать то-же самое, но предпочитаю таблицы добавлять через phpmyadmin.

> 2) У меня нет лишней сущности - твоего списка obligatory_fields. Обязательность поля указывается непосредственно в его определении свойством 'required'.

Такой вариант реализации был выбран не случайно. Я тоже мог всунуть это, как дополнительное поле. Но решил не пихать туда для своего же удобства. Собственно, посмотри, у меня это занимает одну строку и удобно редактируется в одном месте. Тебе же приходится лазить по всему файлу, чтобы указать обязательность.

> 3) Не знаю, возможно ли это в твоём коде, а у меня в определении поля я могу вставить любое правило его проверки, в дополнение к автоматическим проверкам на тип переданного значения.

По правилам ЛОР-а мне нужно было спиздеть и сказать, что да! Конечно могу и конечно такое есть. Но это не так. Пока-что я этого не сделал, что не мешает добавить необходимую мне функциональность. Собственно делается в течении пару-тройку минут.

Но ведь дело не в этом. Я могу тебе привести пример такого же кода, который я сделал на пхп и он только чуток будет отличаться от того, что привел ты. Я тебе про другое толкую. Мне на пхп пришлось писать в полтора раза больше кода.

Во-первых все SQL запросы ручками. Потом в синтаксисе нету многих приятных вещей. Речь идет не о том, что можно, а что нельзя. А о том СКОЛЬКО займет реализация того, что можно. Я ушел с пхп не потому что на нем нельзя, а потому что ДОЛЬШЕ. Потому что синтаксис БЕДНЫЙ. Потому что я уже просто УСТАЛ на нем программировать. Мне программирование на пхп не приносило УДОВОЛЬСТВИЕ. Руби для меня стал свежим глотком воздуха.

Cris
()
Ответ на: комментарий от CrazyPit

> Ну и ты сгенеришь из этого кода только форму со всеми валидацями. В РоР такая же херня вообще без кода делаеться (только с SQL). А у товарща Криса, я так понимаю генрится полностью админка...

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

Cris
()
Ответ на: комментарий от geek

> fckeditor у него на пыхпыхе

Где я такое писал? Я писал, что у него коннекторы на PHP, Perl, ColdFusion, ASP, JAVA и ASP.Net. Пока видел утверждение, что его можно _прикрутить_ к Ruby. Уговорил.

Не ошибается тот, кто ничего не делает. Вот ты, например, ничего не сделал. Где 4 форума? Где интернет-магазины? Где GroupWare системы? Пока видел только один форум.

Aceler ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.