LINUX.ORG.RU

PHP vs RoR vs Django


0

0

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

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

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

★★

Проверено: Shaman007 ()
Ответ на: комментарий от gloomdemon

> Мы уже выяснили что тут RoR и Django велосипедописатели, всё пишут только сами, по 10 раз.

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

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

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

Вам уже сказали, что вы умрёте, а всё туда же, кейс, кейс. Без кейса никак? Кейс и расширяемость несовместимы. Кейс в ООП противопоказан (или руби с питоном уже процедурные языкы? Тоды ок.)

> неймспейсы, автоматические генераторы сеттеров, геттеров. Метапрограммирование. АОП. Миксины

О, да, да. Какие ещё диковинные слова вызубрили?

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

Понятно, всё чего нету, будем говорить что это не нужно потому что глупо.

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

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

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

> Тут пока различие некритично.

И я так считаю. Зачем тогда писать?

> В ПХП можно вставить только переменную:
объект, массив, скаляр. В Руби можно вызвать функцию или метод,

Не совсем верно. Вызов функции в строку на php вставить можно:

$x = create_function('', 'return "bla";');                                                       
echo "bla{$x()}bla\n";

В Heredoc так же можно сделать ;)

define("BLA", 'bla');                                                                            
$c = 'constant'; 

$str = <<<__TEXT__
Бла, бла, {$c("BLA")} константы понимать!
Могу использовать НЕ только переменные {$var}.
   Отступ прекрасно понимается.
__TEXT__;

Ок, согласен, криво. Но на вселенскую проблему не тянет!

> PHP $regexp = '/hell \/\' with symbol';

Что мешает написать $regexp = "|hell /' with symbol|";

Короче, ты видишь, насколько хромают твои знания в php? Ну, согласись,
нельзя плохо отзываться о том, чего не знаешь.

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

>test = case(test) > when 1,2: 'odin i dva' > when 3,4: 'tri i 4etyre' > when 100..200: 'mejdu sto i dvesti' > else 'ne znayu'

Так годится? =))))

Хм. Это не то, что у вас просили. Надо глазьями читать задачу. Можно ли сделать так:

case '1': то. if (cond_1) break; case '2': сё break;

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

> Кейс и расширяемость несовместимы. Кейс в ООП противопоказан (или 
> руби с питоном уже процедурные языкы? Тоды ок.)

Слушай, я что, сказал, что его нужно тулить куда попало? Или ты где-
то видел, что я про это писал? Я так понимаю месье намекает на 
полиморфизм?

Ну тогда решите следующую задачу с помощью РЕАЛЬНЫХ, ПАЦАНСКИХ ООП-
шных конструкций. У меня в базе хранится длина файла в байтах. Я хочу 
вывести ее в "человеческом" виде. Тоесть если число близко к 
мегабайту - в мб, если к килобайтам -кб, гигабайты Гб.

Ниже я приведу пример решения на кейсе и жду ответного ЛУЧШЕГО 
решения на ТРУ ООП!

def format_size(size)
  size = size.to_f
  "%.2f %s" % case size
              when 0...1024         : return size.to_i.to_s + " B"
              when 1024...102400    : [(size / 1024), "kB"]
              when 102400..104857600: [(size / 1024 / 1024), "MB"]
              else [(size / 1024 / 1024 / 1024), "GB"]
              end
end

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

>2) Строки: PHP: $str = "Test bla bla {$var} bla"; Ruby: str = "Test bla bla #{construction} bla"

>А вот здесь уже видно разницу. В ПХП можно вставить только переменную: объект, массив, скаляр. В Руби можно вызвать функцию или метод, по сути поставить любую конструкцию.

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

Тем более всегда можно написать "fdgdfg".myfunc()."fgdfg"

ЗЫ Большинство что здесь показывают, якобы из достоинств языка практически ничего не стоит.

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

Уже три раза спросил, никто не ответил. все молчат как партизаны. Аууу, ответьте кто нибудь! Сто пудову всё через gettext делают.

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

> спор заведомо проиграшный для пхп. Потому что я его знаю очень хорошо. И не смотря на свои наработки и хорошее знание языка, я оставил это и решил двигаться дальше. Хватило смелости сделать это. А вам, все еще лихорадочно цепляющимся за, те мнимые преимущества что у вас пока еще есть хватит смелости оставить все и выучить что-то новое. Но и что-то более эффективное? :))

Как только мне покажут реальное преимущество, а не фигню типа я напишу это в 10 символов а вы в 11, или я напишу это так, а Вы по другому, а мне нравиться писать как я пишу спор заведом проигрышный для Вас.

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

> А если поля класса "размазаны" по нескольким таблицам?

Я использую соглашение: одна таблица - один класс. Или наоборот.
Первичен класс с описанием структуры таблицы. Отношения между
таблицами описываются внутри таких классов. Именно объект класса
создаёт и изменяет таблицу, а не пассивно подстраивается под готовую,
созданную руками.

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

> Кейс в ООП противопоказан (или руби с питоном уже процедурные языкы? Тоды ок.)

Противопоказано то, что неудобно. Показано то, что удобно. Руби с питоном - многопарадигменные языки для реальной жизни. Идеологию оставьте фонатекам.

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

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

Не пускай пузыри, тебя никто обманывать не собирается. Где был вопром про фреймоворк на пхп? Для чего? Особенно учитывая что пхп не нужен фреймворк для работы под WEB. И где ответы на мои вопросы показать хотя бы 4 CMS на ryby.

ЗЫ Видимо и пересел на руби потому что не смог внятно для себя решить для чего тебе фреймвок под пхп.

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

Поэтому-то они и сосуд. Парадигменный инцест, ёпта.

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

Я хочу увидеть как можнно сделать так:

switch ($i) case 1: bla-bla--bla case 2; bla-bla--bla2 break;

если вызовется case 1 то следом вызовется и case 2.

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

> Сходи на http://www.joomla.org/ и посмотри там админку (это так для примера), а потом будешь рассказывать как всё круто.

Вы чо, не отличаете быдлоCMS от фреймворка?

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

Ещё раз, фреймворка для чего? Для того что бы под WEB программить? Так это только ryby и нужно, без него никто под web программить на нём не будет.

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

> Вам уже сказали, что вы умрёте, а всё туда же, кейс, кейс. Без кейса никак? Кейс и расширяемость несовместимы. Кейс в ООП противопоказан (или руби с питоном уже процедурные языкы? Тоды ок.)

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

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

Прямо таки ТРУЪ ?
А гвозди вы тоже микроскопом забиваете?

$suffix = array ( "k", "M", "G" );
$len = 1024*1024*1024 * 1024;
$x = floor(log($len)/log(1024))-1;
if ($x>2) { $x = 2; }
$y = $len / (pow(1024,$x+1));
print "length is " . $y . " " . $suffix[$x] . "byte(s)";

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

А это не ко мне, это к товарищу, шо без кейса прямо кушать не может.

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

> Я хочу увидеть как можнно сделать так:

> switch ($i) case 1: bla-bla--bla case 2; bla-bla--bla2 break;

> если вызовется case 1 то следом вызовется и case 2.

Вы часом не на ФОРТРАНе программировать начинали, дружок?

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

> Прямо таки ТРУЪ ? > А гвозди вы тоже микроскопом забиваете?

Ну вот видишь, нет полиморфизма. Так зачем гавкать, на то, что используется к месту? Ты сделал невнятную мешанину из императивной логики. Я, в декларативном стиле описал, что я хочу. Логика понятна и очевидна.

Поэтому про кейс нечего тут галдеть, всему свое место.

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

> Ну вот видишь, нет полиморфизма

Правильно. Как нет и кейса. Я не забиваю гвозди микроскопом и не палю из гранатомёта по воробьям.

> Логика понятна и очевидна

Угу =) Ваша "логика" мне напоминает стиль vb-программистов. Или дельфистов-ньюбов, которые формочки в редакторе рисуют, и считают, что программа готова.

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

Вот именно. Но отмазы про ТРУЪ полиморфизм и зарубы про миксины с неймспейсами меня позабавили =)

С другой стороны хоть кейс знает. А что было бы, если бы в кейсе интервалы нельзя было бы задавать? Боюсь представить.

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

> Что мешает написать $regexp = "|hell /' with symbol|";

Согласен.

> Короче, ты видишь, насколько хромают твои знания в php? Ну, согласись, нельзя плохо отзываться о том, чего не знаешь.

Нормал, согласен насчет хиредока функций и констант.

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

Насчет синтаксических конструкций ты проигнорировал, но тут я сам могу тебе дать ответ. Можно криво через ивал, используя костыль с $func().

Ладно, разменялись.

ООП.

1) Нету неймспейсов.

2) Автоматическое создание сеттеров-геттеров.

PHP: можно сделать через магические функции в php5. Но тут уже нужно учесть, что пятерка в плане хостинга сливает 4.

Ruby: строка

attr_reader :field1, :field2, :field3

создает сразу возможность обращение к филду через:

obj.field1 и т.п.

Аналогично attr_writeble :fieldx - создает сеттер в виде

obj.fieldx = 'xx'

3) Миксины

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

В пхп нет.

4) Стоит задача. Есть абстактный фреймворк. Вам в нем все нравится, но в одном классе нужно поменять поведение. Например чтобы перед вызовом метода бла, вызывался метод бла2, а уже потом отрабатывался метод бла.

PHP: вообще подобную функциональность можно очень криво реализовать в пхп (и только пятом) только через магический метод, но при условии, что метод неопределен. Тогда можно перехватить к нему обращение.

Но у нас задача, чтобы сделать это для заданного метода.

Ruby: используя констункцию alias_method я могу реализовать базовые фишки АОП - выполнить нужный код до и после метода.

5) Есть возможность переопределить методы: +, [], <, > и т.п.

Вывод сделайте сами.

На практике метод << для строк добавляет кусок к строке, для массивов добавляет элемент к концу массива. А символы + - / используются для создания математических операций над множествами для обычного массива.

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

> которые формочки в редакторе рисуют, и считают, что программа готова.

Кстати, это очередной виток спирали. И на этот раз история повторяется как фарс, только бедные адепты рубей этого, увы, не понимают =)

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

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

Я вам могу сказать, что и руби и пхп сливают по полной сям, потому что в них нельзя делать _asm {}. Фтопку руби и пхп?

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

> asm для z80 подойдёт?

Убогонький недопроцессор с восьмибитной системой команд. У детей вызывает психотравмы на всю жизнь.

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

> Кстати, это очередной виток спирали. И на этот раз история повторяется как фарс, только бедные адепты рубей этого, увы, не понимают =)

Вы хотите сказать, что руби отстой, потому что VB и Делфи отстой? Вы не женщина?

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

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

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

Нет. Я хочу сказать, что ньюбы, "программировавшие" на вб и дельфи с помощью рисования формочек (раскидывания по ним кнопочек, чекбоксиков и табличек) мало чем отличаются от аналогичных "горячих" адептов рубей. Кроме того, что в массе вымерли (но не все).

Про сами языки я ничего не говорил. У вас что-то с логикой? А вы-то сами не женщина?

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

> Ниже я приведу пример решения на кейсе и жду ответного ЛУЧШЕГО 
решения на ТРУ ООП!

@Number_in_human_readable[$number]
$num[
 val text
 0 " "
 1024 " kB"
 102400 " MB"
 104857600 " GB"
]

$result[^num.menu{^if($lenght%$num.val){[^lenght.format[%.2f] $num.val}]

Числа ваши. Достоинства решения сказать или сами найдете?

ЗЫ решение не проверял ;)

ЗЫ Я не пойму, мы тут говорим о красивости языка или о том, какой язык лучше?

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

Их не жалеть надо, их изолировать надо. Дустом их травили-травили, а они из руби с питоном ползут.

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

>Пишите свой тег, сказали же вам.

/в сторону: Ага, опять писать велосипед.../

А теги он понимает инфиксные? И с приоритетами? Об этом не было ничего сказано. Я могу определить тэги, которые позволят записать:

{if ($is_admin || $is_moderator) && !$action}
<a href="..">админменю</a>
{/if}

?

>Или продолжайте пользоваться ПХП, раз вам нравится ПХПшный стиль.

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

Но для этого нужно знать этот альтернативный продукт.

Садиться и тратить неделю на детальное изучение десятков нынешних кандидатов - оставьте это студентам.

А если есть коммьюнити, где (вроде бы) собрались люди, этот продукт знающие, почему бы и не спросить некоторые особенности. Чтобы можно было оценить, требует ли продукт более тщательного изучения.

Пока, по результатам дискуссии, я вижу только что можно с очень низким приоритетом заняться рассмотрением Django. RoR пока себя вообще не проявил никак.

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

Линусу раскажи, он тоже с него начинал, убогонький ононизмус.

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

>$result[^num.menu{^if($lenght%$num.val){[^lenght.format[%.2f] $num.val}]

Сразу ассоциация - dos2unix не сделали и в MC смотрим...

Нет, ну как можно с таким синтаксическми шумом работать?? И кто-то когда-то смел говорить, что шума в Си много (в сравнении с Паскалем)? Посмотрели бы они на эти иероглифы... :D

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

> Не слышали про C Server Pages ? Фтопку руби и пхп? C Server Pages наше всё!

Фтопку всё, видимо. На ЛОРе вообще страшно про ЯП говорить. Про любой. Обязательно найдётся Знающий Всё Гуру, который заботливо обложит калом.

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

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

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

> А теги он понимает инфиксные? И с приоритетами? Об этом не было ничего сказано. Я могу определить тэги, которые позволят записать:

Вы не поняли сути. Продолжайте медитировать.

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

> Пока, по результатам дискуссии, я вижу только что можно с очень низким приоритетом заняться рассмотрением Django.

А как же Parser? :)

JID aceler@jabber.ru

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

> Я, в декларативном стиле описал, что я хочу. Логика понятна и очевидна.

Нет изящества, конструкция квадратная ;-( 

В php я бы написал примерно так:

function format_size(size) {
  return ($size<1024 ? $size ." B": ($size<1024*1024 ? $size/1024 ." K": $size/1024/1024 ." M")); }

Вместо твоего монстра:

def format_size(size)
  size = size.to_f
  "%.2f %s" % case size
              when 0...1024         : return size.to_i.to_s + " B"
              when 1024...102400    : [(size / 1024), "kB"]
              when 102400..104857600: [(size / 1024 / 1024), "MB"]
              else [(size / 1024 / 1024 / 1024), "GB"]
              end
end

Особенно "порадовал" size.to_i.to_s.

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

> Нет, ну как можно с таким синтаксическми шумом работать??

Дык...

$result[
 ^num.menu{
  ^if($lenght%$num.val>1){
   ^lenght.format[%.2f] $num.text
  }
 }
]

Просто тут принято писать в минимальное количество символов...

ЗЫ - написал нормально - три ошибки нашел :)

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

>А как же Parser? :)

Шило на мыло :)

Кроме того:
# esearch -F dev-php|wc -l
1560

# esearch -F dev-python|wc -l
1992

# esearch -F dev-ruby|wc -l
1264

# esearch -F dev-perl|wc -l
5008

# esearch -F dev-parser|wc -l
0

:)

>JID aceler@jabber.ru

JID balancer@balancer.ru

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