LINUX.ORG.RU

еще один кирпичик ненависти к php

 


0

1

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

два цикла, делают одно и тоже, но классический for быстрее в 4 раза.

<?php

for ($i = $start; $i < $end; $i+=$step)
{
//do something with array
}

foreach (range($start, $end, $step) as $i)
{
//do something with array
}

?>

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

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

<?php
$page_count = ceil(($db->querySingle('SELECT COUNT(*) FROM blog_posts') / 10));
$page_cache = '';
$page = (isset($_GET['page']))?(int) $_GET['page']:$page_count;

for ($page_id = $page_count; $page_id > 0; $page_id--) {
  if ($page == $page_id) {
    $page_cache .= ' '.$page_id;
  }
  elseif (($page_id == $page_count) || ($page_id == 1)) {
    $page_skip = 1;
    $page_cache .= ' <a href="?page='.$page_id.'">'.$page_id.'</a>';
  }
  elseif (($page < ($page_id + 2)) && ($page > ($page_id - 2))) {
    $page_skip = 1;
    $page_cache .= ' <a href="?page='.$page_id.'">'.$page_id.'</a>';
  }
  elseif ($page_skip > 0) {
    $page_skip--;
    $page_cache .= ' ...';
  }
}
echo $page_cache;
?>

<?php
$try = $db->query('
  SELECT *
  FROM blog_posts
  LIMIT '.($page * 10 - 10).', 9
  ');
?>

спасибо, извините.

★★★★★

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

И подставлять незаэскейпленную переменную в sql-запрос - это верх школотизма.

drull ★☆☆☆
()
Последнее исправление: drull (всего исправлений: 1)
Ответ на: комментарий от dk-

Вангую что наколенные поделки для локалхоста.

drull ★☆☆☆
()

range($start, $end, $step)

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

зы. пхп конечно говно, но ты из него делаешь говно в квадрате

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

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

Не думал, что полезнее какому проекту открытому помочь, чем пилить блог без контента и аудитории?

dk-
()
Ответ на: комментарий от Spoofing

узрей и ужаснись,

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

Для кого придумали шаблоны? Для кого придумали mvc?

drull ★☆☆☆
()
Ответ на: комментарий от dk-

Не думал, что полезнее какому проекту открытому помочь, чем пилить блог без контента и аудитории?

Неееет! Лучше пусть свой блог пилит, чем говнокод в чужие проекты пихает.

drull ★☆☆☆
()

классический for быстрее в 4 раза

Может дело в range? foreach, по идее, логично использовать, когда есть готоый массив.

// php я совсем не знаю

generator ★★★
()

два цикла, делают одно и тоже, но классический for быстрее в 4 раза.
range($start, $end, $step)

ага одно и тоже

Wolfram
()

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

LexArt ★★
()

Народ, я правильно понял, что ТС еще больший говнокод родил?

dk-
()
Ответ на: комментарий от Spoofing

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

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

поэтому дальше хобби это дело не заходит, мне и так норм.

Spoofing ★★★★★
() автор топика

range($start, $end, $step)

Вот из-за таких, как ты, все и обсирают пхп. Говно не язык, говно писатели на нем.

macsucks
()

А не всё ли равно, с какой скоростью работает цикл, если итерация всего одна? :)

P.S. Если кто не понял, бложек у ТС «немного пустоват» на текущий момент.

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

Если кто не понял

Не, так не надо делать.

anonymous
()

забудьте обо всех этих читерских foreach

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

risenshnobel ★★★
()

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

greenplastik
()

никогда не видел range в foreach, но дело хозяйское

так то foreach для обхода массивов for и while для всего остального

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

узрей и ужаснись

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

Suntechnic ★★★★★
()

Ясен пень, что лапше-код быстрее. Тут скорость работы и написания кода обратно пропорциональны скорости его отладки через пол-года. А через год будет проще всё выкинуть и начать заново.

ivn86
()

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

anonymous
()

можно побыстрее

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

никогда не видел range в foreach

Конечно не видел, потому что нормальные люди так не напишут. foreach не для этого.

INFOMAN ★★★★★
()

1. В _любом_ языке нужно знать особенности конструкций. Знаешь, сколько копий ломается в том же Java на одной только теме конкатенации строк? :) Так и тут, любому, кто хоть раз задумывался о том, что хранится под капотом, понятно, что создание массива — это весьма затратное решение и по памяти, и по процессору.

2. Не вижу 4-х раз разницы:

<?php

require '../composer/vendor/autoload.php';

$start = 1;
$end = 100;
$step = 2;

$bench = new Ubench;

$bench->start();

for($j=0; $j<100000; $j++)
{
    for($i = $start; $i < $end; $i+=$step)
    {
        //do something with array
    }
}

$bench->end();
echo "Цикл: ", $bench->getTime(), PHP_EOL;

$bench->start();

for($j=0; $j<100000; $j++)
{
    foreach(range($start, $end, $step) as $i)
    {
        //do something with array
    }
}

$bench->end();
echo "range(): ", $bench->getTime(), PHP_EOL;

$ php range.php
Цикл: 112ms
range(): 291ms

$ php --version
PHP 5.5.9-1ubuntu4.7 (cli) (built: Mar 16 2015 20:47:39)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

3. Не PHP единым. Есть, скажем, hhvm:

$ hhvm range.php
Цикл: 91ms
range(): 93ms

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

Может дело в range? foreach, по идее, логично использовать, когда есть готоый массив.

Это привычки питониста :) Там нет «обычного for», поэтому всё делается не через for, а через foreach (который и зовётся for) + xrange. Ну и поскольку это очень распространённая форма записи, то её заоптимизировали по самое немогу (настолько, что реально работает раза в полтора быстрее вручную организованного цикла с while и присваиванием).

Соответственно, потом эти привычки питонисты тянут в другие языки и ругаются, где такой заморочки нет. Интересно посмотреть, что они про Си или Java пишут в такой ситуации :D

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

Мне кажется что тебе не нужна такая оптимизация при выводе кнопок перехода по страницам

Запрос к БД займёт времени всё равно больше на несколько порядков :)

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

как правило профи одевают противогаз или работают в перчатках и спецухе...

Кстати, извиняй уважаемый, но джанго это еще тот быдлокод...

anonymous
()

Хех. В питонопроектах по for * in xrange( можно искать то, что можно отрефакторить прямо здесь и сейчас.

PolarFox ★★★★★
()
for($i=0; $i<count($arr); $i++) {
// ...
}
$count=count($arr);
for($i=0; $i<$count; $i++) {
// ...
}

Второй код работает в n раз быстрее. (где n == кол-во элементов в $arr).

В документации об этом ничего нет. Только есть комментарий с большим рейтингом: http://php.net/manual/en/function.count.php#114924

Tanger ★★★★★
()

Двери совсем печальны и наличием дверных косяков учат прищемлять яйца. Два проёма, делают одно и тоже, но классический прыжок с окна быстрее в 4 раза. Хотите иметь детей? Забудьте обо всех этих читерских дверях и прочих яйцезащемительных проходах, это удел сторожей недалёкого ума. Ъ-сторожа выходят в окно!

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

Второй код работает в n раз быстрее

Не в n, а примерно в 4 раза в PHP и в 1.5 раза в HHVM вне зависимости от размера массива :) Но, вообще, это сегодня такие копейки.

Только есть комментарий с большим рейтингом

Слоупоки какие-то. Такая замена была актуальна и входила во все рекомендации в PHP 15 лет назад. Я и сам такое практиковал, разве что инициацию выносил прямо в цикл:

for($i=0, $count = count($arr); $i<$count; $i++)
{
   // ...
}

До сих пор в старом коде встречается. Тогда на таком можно было выгадать несколько сотых долей секунды на запрос. Но где-то около PHP5 foreach стал работать быстрее (с учётом выборки переменной, если без неё — также), так что старый формат был оставлен только там, где реально необходим. И в наше время эта разница превратилась в микросекунды, так что имеет смысл только в каких-то совсем уже огромных циклах... на которых PHP в любом случае уже не лучший выбор :)

...

Забавно, промерил сейчас на HHVM (3.6.1) — там foreach снова медленнее, чем for(;;). В 2.5 раза. Правда, и foreach на HHVM всё равно в 2 с лишним раза быстрее, чем for/foreach в PHP 5.5.9

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

Не думал, что полезнее какому проекту открытому помочь, чем пилить блог без контента и аудитории?

ты не первый кто так говорит, «твои умения/старания, да в нужное русло».

а для меня это звучит так: сходил бы пробзделся на улицу, сидишь как сыч! ванька ерохин девок на машине катает, на заводе за двадцатку вкалывает, а от тебя внуков не дождешься!

люди играют в World of WarCraft, EVE Online и прочие задротские игры, для меня программирование, решение задачек - та же игра. не хочу никому помогать, не хочу на этом зарабатывать деньги, а просто хочу развлекаться с компьютером! =)

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

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

как задрот, который в играх заглядывает под каждый камушек, - я оптимизирую каждый байт кода.

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

так вот, html от php в коде отделяют отступы. вставки динамических блоков выглядят так, где прекрасно видно, что php, а что html

<?php while (): ?>
             <article><?php echo $post; ?></article>
<?php endwhile; ?>

весь код в одном файле, но по нему легко перемещаться, видно что к чему отностися, какой <?php endif; ?> какому <?php if (): ?> принадлежит.

структура крайне проста.

<?php if ($_SERVER['REQUEST_URI'] == '/'): ?>

<?php if ($_SERVER['REQUEST_METHOD'] == 'GET'): ?>

<?php endif; ?>


<?php elseif (strpos($_SERVER['REQUEST_URI'], '/blog/') === 0): ?>

<?php if ($_SERVER['REQUEST_METHOD'] == 'GET'): ?>

<?php endif; ?>

<?php endif; ?>

вот таким образом выглядит весь мой код. простой как пять копеек роутинг, обрабатывается стандартными функциями для работы со строками. а там где GET - там внутри HTML контент, перед ним могут быть вставки обычного php кода для обработки POST, а потом делается exit или header(location) чтобы обновить страничку, перенаправить на GET.

самое главное — все это летает. time wget сообщает о 3 милисекундах.

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

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

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

не церемонясь пишу быстрый лапше-код. брат жив

Посмотрим, что скажет брат, когда в коде будет хотя бы тысяч 10 строк и код будет развиваться хотя бы год... :)

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

1ggV9000jzf в vim спасет отца десяти тысяч строк! =)

p.s. перемещаемся на первую строку, выделяем текст, вниз 9000 строчек, сворачиваем лишний код (folding).

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

folding

Поверь, проблема не в фолдинге :)

...

Более того, если у тебя будет 9000 строк в одном файле, это будет лютый песец производительности...

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