• Скрипт, выполняемый на JavaScript за секунду, на PHP за 30 секунд проходит только 20%. В чём причина?

    cah_ek
    @cah_ek Автор вопроса
    Ну что уж сразу херню-то.
    Когда-то мне нужно было узнать ответ на одну задачку.
    Я его узнал.
    Цель кода была выполниться один раз и не больше, он с ней на тот момент успешно справился.
    А тут подвернулся php, захотелось потренироваться, вспомнил старую задачку.
    Учитывая, что поменял только синтаксис, а не логику сильно удивился, такому падению производительности вот и задал вопрос.
    Я думаю мы уже нашли на него ответ, что дело в том, что
    v8 перед выполнением производит оптимизации, а php нет.

    В оправдание того, что изначальный вариант кода не оптимизирован, хочу сказать, что когда писал, следовал логике не столько программирования, сколько самой задачи, то есть:
    перебор вариантов, проверка условия, вывод ответа.
    Уже в процессе решения заметил, что ответов было много,
    понял, что дело в том, что разные буквы могли принимать одинаковые числовые значения,
    что хоть явно и не запрещено в условиях, но очевидно не верно.
    Тогда и добавилось условие, что разные буквы не равны между собой.
    Я думал, что можно будет сделать эту проверку как-то лаконично в роде:
    a!=b!=c!=d!=e!=f!=..
    Но так не сработало, понял, что придётся разбивать на кучу сравнений между друг другом,
    так и родился тот монстр с проверкой на несколько строк..
    Выглядело конечно страшно, но ответ оно нашло за пару секунд, поэтому дальнейшая работа над кодом и не имела смысла.
    Всё-таки это был просто тест на досуге, а не стратегический проект! ;-)
    Если бы ему было суждено выполняться где-либо тысячи раз, конечно бы Я его так не оставил.
    Впрочем,
    Вариант кода с вынесением сравнения за циклы Я уже сам переписал в комментариях.
    До вынесения вычислений конечно дело не дошло, но прирост производительности ощутился в обоих языках.
    На самом деле, если заморочиться, то можно выяснить какое из выражений быстрее выполняется с кучей сложений или с одним делением, и провести сначала только циклы, которые используют только их буквы.
    (то есть вложить циклы не по алфавиту a,b,c.. а по использованию например f,j,g,a)
    А насчёт введения отдельных переменных типа $a10 у меня вопрос в их оправданности,
    они конечно позволяют сэкономить на умножении, если оно будет несколько раз, но ведь занимает память, плюс может до использования этой переменной в этом цикле может и не дойдёт (то есть может просто так бы нам не нужно было это умножение, а так оно у нас 100% есть).
    И ещё хочу спросить, а === быстрее, чем ==?
    И идти с 9 до 1, а не от 1 до 9, это тоже какая-то оптимизация или просто стиль?
  • Скрипт, выполняемый на JavaScript за секунду, на PHP за 30 секунд проходит только 20%. В чём причина?

    cah_ek
    @cah_ek Автор вопроса
    В другой ветке писал, что не прерывал циклы, на случай, если ответ был бы не единственным.
    Но спасибо за результаты.
    Интересно кто-нибудь скажет время выполнения на питоне? :-)
  • Скрипт, выполняемый на JavaScript за секунду, на PHP за 30 секунд проходит только 20%. В чём причина?

    cah_ek
    @cah_ek Автор вопроса
    MaxKorz: Я думал результаты тестов будут в секундах и показывать время выполнения скрипта..
    А для PHP какие результаты??
    Интересно же узнать кто всё-таки быстрее, при фактически идентичном коде! :-)
  • Скрипт, выполняемый на JavaScript за секунду, на PHP за 30 секунд проходит только 20%. В чём причина?

    cah_ek
    @cah_ek Автор вопроса
    Офигеть! Реально же можно эту проверку из цикла вытащить! Спасибо!
    Теперь JavaScript выполняется мгновенно, а PHP за 2 секунды, но это уже радостнее!
    for(a=1; a<10; a++)
    for(b=1; b<10; b++)
        if(b==a) continue;
        else
    for(c=1; c<10; c++)
        if(c==b || c==a) continue;
        else
    for(d=1; d<10; d++)
        if(d==c || d==b || d==a) continue;
        else
    for(e=1; e<10; e++)
        if(e==d || e==c || e==b || e==a) continue;
        else
    for(f=1; f<10; f++)
        if(f==e || f==d || f==c || f==b || f==a) continue;
        else
    for(g=1; g<10; g++)
        if(g==f || g==e || g==d || g==c || g==b || g==a) continue;
        else
    for(h=1; h<10; h++)
        if(h==g || h==f || h==e || h==d || h==c || h==b || h==a) continue;
        else
    for(j=1; j<10; j++)
        if(j==h || j==g || j==f || j==e || j==d || j==c || j==b || j==a) continue;
        else
            if( 100*d+10*g+j + 100*j+10*a+e + 100*b+10*h+f == 1000*d+100*d+10*a+b && 
                f*c/j == 10*g+a)
            alert(  " a="+a+
                    " b="+b+
                    " c="+c+
                    " d="+d+
                    " e="+e+
                    " f="+f+
                    " g="+g+
                    " h="+h+
                    " j="+j);

    <?php
    for($a=1; $a<10; $a++)
    for($b=1; $b<10; $b++)
        if($b==$a) continue;
        else
    for($c=1; $c<10; $c++)
        if($c==$b || $c==$a) continue;
        else
    for($d=1; $d<10; $d++)
        if($d==$c || $d==$b || $d==$a) continue;
        else
    for($e=1; $e<10; $e++)
        if($e==$d || $e==$c || $e==$b || $e==$a) continue;
        else
    for($f=1; $f<10; $f++)
        if($f==$e || $f==$d || $f==$c || $f==$b || $f==$a) continue;
        else
    for($g=1; $g<10; $g++)
        if($g==$f || $g==$e || $g==$d || $g==$c || $g==$b || $g==$a) continue;
        else
    for($h=1; $h<10; $h++)
        if($h==$g || $h==$f || $h==$e || $h==$d || $h==$c || $h==$b || $h==$a) continue;
        else
    for($j=1; $j<10; $j++)
        if($j==$h || $j==$g || $j==$f || $j==$e || $j==$d || $j==$c || $j==$b || $j==$a) continue;
        else      
            if( 100*$d+10*$g+$j + 100*$j+10*$a+$e + 100*$b+10*$h+$f == 1000*$d+100*$d+10*$a+$b &&
                $f*$c/$j == 10*$g+$a)
            echo    " a=",$a,
                    " b=",$b,
                    " c=",$c,
                    " d=",$d,
                    " e=",$e,
                    " f=",$f,
                    " g=",$g,
                    " h=",$h,
                    " j=",$j;
    ?>
  • Скрипт, выполняемый на JavaScript за секунду, на PHP за 30 секунд проходит только 20%. В чём причина?

    cah_ek
    @cah_ek Автор вопроса
    Neoline: Я не отрицаю, если видите как можно написать по-другому, то подскажите.
    Потому что честно даже не знаю, где мог ошибиться, конструкции-то детские for if и echo.
  • Скрипт, выполняемый на JavaScript за секунду, на PHP за 30 секунд проходит только 20%. В чём причина?

    cah_ek
    @cah_ek Автор вопроса
    Спасибо, догадывался, что ответ будет примерно таким, но хотел услышать это от людей с большим опытом, чем у себя.
    Просто не ожидал, что разница в скорости будет больше, чем на порядок.
    Даже как-то обидно за php.
  • Скрипт, выполняемый на JavaScript за секунду, на PHP за 30 секунд проходит только 20%. В чём причина?

    cah_ek
    @cah_ek Автор вопроса
    Цикл продолжается на случай, если вдруг это не единственный ответ, заканчивается и всё хорошо.
    В JavaScript могу заменить alert на document.write(" a="...)
    И ещё добавить в конце
    document.write("The end!");
    чтобы видеть, когда закончится выполнение скрипта.
    На глаз всё равно выполняется секунды за три.

    PHP же за 30 секунд даже не доходит до ответа.
    В ответе a=4, то есть он не доходит даже до 40% всех циклов, потому что если бы он этот ответ находил, то по таймауту отображалась бы та часть страницы, которую он успел просчитать.

    Пробовал убирать третью часть условий, тогда видно, что отображаются только ответы с a=2, получается, что за 30 секунд прошли только 20% циклов.

    php запускаю через веб-сервер, заголовок на странице HTTP 200 OK 30005мс, если правильно понял вопрос.