На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Ruby vs PHP
      Вот тут задался вопросом что быстрее Ruby или PHP и решил перевести свой небольшой рабочий скрипт на Ruby и посмотреть.

      Суть скрипта собрать данные с 3 MySQL сервер и записать на 4 под cron

      Тест проводился на artaos (Debian 5.0)

      Вот мои результаты
      user posted image
      Разница PHP/Ruby
      Время: 1.469304 (PHP)
      CPU: 6.8% (PHP)
      Память: 2.4 (Ruby)

      Выдаваемый результат скрипта
      Цитата
      Отчет по tpeodat: Выбрано(11101), Записано(11099), Не записано(2)
      Отчет по tpeo: Выбрано(11101), Записано(11099), Не записано(2)
      Отчет по tfuc: Выбрано(7), Записано(7), Не записано(0)
      Отчет по tgrp: Выбрано(687), Записано(687), Не записано(0)
      Отчет по trup: Выбрано(518), Записано(518), Не записано(0)
      Отчет по tspe: Выбрано(54), Записано(54), Не записано(0)


      Скрипты:
      PHP
      ExpandedWrap disabled
        <?
        set_time_limit(0);
        //Config
        $DBNm[0] = "stcdata";
        $DBNm[1] = "stcdata";
        $DBNm[2] = "stcdata";
        $HostNm[0] = "192.168.13.5";
        $HostNm[1] = "192.168.15.221";
        $HostNm[2] = "192.168.16.50";
        $UsNm[0] = "voen_pas";
        $UsNm[1] = "voen_pas";
        $UsNm[2] = "voen_pas";
        $Pass[0]="voya7341";
        $Pass[1]="voya7341";
        $Pass[2]="voya7341";
         
        $DBName="brep";//база
        $HostName="192.168.13.129";//сервер
         
        $UserName="dmitriy";//пользователь
        $Password="ScX5Rz7f";//пароль
         
        //Считываем текущее время
        $mtimefull = microtime();
        //Разделяем секунды и миллисекунды
        $mtimefull = explode(" ",$mtimefull);
        //Составляем одно число из секунд и миллисекунд
        $mtimefull = $mtimefull[1] + $mtimefull[0];
        //Записываем стартовое время в переменную
        $tstart = $mtimefull;
         
        $c=mysql_connect($HostName, $UserName, $Password);
        mysql_select_db($DBName);
        mysql_query("REPLACE INTO cron SET id=1, blok=1");
        mysql_query("DELETE FROM `tpeodat`");
        mysql_query("DELETE FROM `tpeo`");
        mysql_query("DELETE FROM `tfuc`");
        mysql_query("DELETE FROM `tgrp`");
        mysql_query("DELETE FROM `trup`");
        mysql_query("DELETE FROM `tspe`");
        $nook_tpd=0;
        $ok_tpd=0;
        $nook_tp=0;
        $ok_tp=0;
        $nook_tf=0;
        $ok_tf=0;
        $nook_tg=0;
        $ok_tg=0;
        $nook_tr=0;
        $ok_tr=0;
        $nook_ts=0;
        $ok_ts=0;
        for($sel_db=0; $sel_db<count($DBNm); $sel_db++){
            unset($pole_tpeodat);
            unset($values_tpeodat);
            unset($pole_tpeo);
            unset($values_tpeo);
            unset($pole_tfuc);
            unset($values_tfuc);
            unset($pole_tgrp);
            unset($values_tgrp);
            unset($pole_trup);
            unset($values_trup);
            unset($pole_tspe);
            unset($values_tspe);
            if($c=@mysql_connect($HostNm[$sel_db], $UsNm[$sel_db], $Pass[$sel_db])){        
                mysql_select_db($DBNm[$sel_db]);
         
                $r=mysql_query("SELECT tpd.* FROM tpeodat tpd, tpeo tp, tfuc tf WHERE tp.KOD=tpd.KOD AND tf.FKOD=tp.FKOD AND tf.WORK=1");
                
                while($re=@mysql_fetch_assoc($r)){
                    unset($k);
                    unset($v);
                    foreach($re as $key=>$val){
                        $v[]="'".$val."'";
                        $k[]=$key;
                    }
                    $pole_tpeodat[]=implode(",", $k);
                    $values_tpeodat[]=implode(",", $v);
                }
                @mysql_free_result($r);
        //echo mysql_error();
                
                $r=mysql_query("SELECT tp.CMT, tp.FKOD, tp.FM, tp.IM, tp.OT, tp.GKOD, tp.GRNT, tp.KOD, tp.NZK, tp.PFLAG, tp.SKOD FROM tpeo tp, tpeodat tpd, tfuc tf WHERE tpd.KOD=tp.KOD AND tf.FKOD=tp.FKOD AND tf.WORK=1");
                
                while($re=mysql_fetch_assoc($r)){
                    unset($k);
                    unset($v);
                    foreach($re as $key=>$val){
                        $v[]="'".$val."'";
                        $k[]=$key;
                    }
                    $pole_tpeo[]=implode(",", $k);
                    $values_tpeo[]=implode(",", $v);
                }
                mysql_free_result($r);
         
                $r=mysql_query("SELECT * FROM tfuc WHERE WORK=1");
                
                while($re=mysql_fetch_assoc($r)){
                    unset($k);
                    unset($v);
                    foreach($re as $key=>$val){
                        $v[]="'".$val."'";
                        $k[]=$key;
                    }
                    $pole_tfuc[]=implode(",", $k);
                    $values_tfuc[]=implode(",", $v);
                }
                mysql_free_result($r);
         
                $r=mysql_query("SELECT tp.GKOD as gk FROM tpeo tp, tpeodat tpd, tfuc tf WHERE tpd.KOD=tp.KOD AND tf.FKOD=tp.FKOD AND tf.WORK=1 GROUP BY tp.GKOD");
                unset($k);
                while($re=mysql_fetch_assoc($r)){
                    $k[]="'".$re['gk']."'";
                }
                $gkod=implode(",", $k);
                $r=mysql_query("SELECT * FROM tgrp WHERE GKOD IN(".$gkod.")");
                while($re=mysql_fetch_assoc($r)){
                    unset($k);
                    unset($v);
                    foreach($re as $key=>$val){
                        $v[]="'".$val."'";
                        $k[]=$key;
                    }
                    $pole_tgrp[]=implode(",", $k);
                    $values_tgrp[]=implode(",", $v);
                }
                mysql_free_result($r);
                
                $r=mysql_query("SELECT TRKOD FROM tgrp WHERE GKOD IN(".$gkod.") GROUP BY TRKOD");
                unset($trkod);
                while($re=mysql_fetch_assoc($r)){
                    $trkod[]="'".$re['TRKOD']."'";
                }
         
                $trkod=implode(",", $trkod);
         
                $r=mysql_query("SELECT * FROM trup WHERE TRKOD IN(".$trkod.")");
                while($re=mysql_fetch_assoc($r)){
                    unset($k);
                    unset($v);
                    foreach($re as $key=>$val){
                        $v[]="'".$val."'";
                        $k[]=$key;
                    }
                    $pole_trup[]=implode(",", $k);
                    $values_trup[]=implode(",", $v);
                }
                mysql_free_result($r);
         
                $r=mysql_query("SELECT SKOD FROM trup WHERE TRKOD IN(".$trkod.") GROUP BY SKOD");
                unset($skod);
                while($re=mysql_fetch_assoc($r)){
                    $skod[]="'".$re['SKOD']."'";
                }
         
                $skod=implode(",", $skod);
                
                $r=mysql_query("SELECT * FROM tspe WHERE SKOD IN(".$skod.")");
                while($re=mysql_fetch_assoc($r)){
                    unset($k);
                    unset($v);
                    foreach($re as $key=>$val){
                        $v[]="'".$val."'";
                        $k[]=$key;
                    }
                    $pole_tspe[]=implode(",", $k);
                    $values_tspe[]=implode(",", $v);
                }
                mysql_free_result($r);
                $servers++;
            }else
                echo "Сервер ".$HostNm[$sel_db]." не доступен.\n";
         
            $c=mysql_connect($HostName, $UserName, $Password);
            mysql_select_db($DBName);
            $count_tpd+=count($pole_tpeodat);
            for($i=0; $i<count($pole_tpeodat); $i++){
                if(!mysql_query("INSERT INTO tpeodat (".$pole_tpeodat[$i].", server) VALUES(".$values_tpeodat[$i].", ".$sel_db.")")){
                    $nook_tpd++;
                }else{
                    $ok_tpd++;
                }
            }
         
            $count_tp+=count($pole_tpeo);
            for($i=0; $i<count($pole_tpeo); $i++){
                if(!mysql_query("INSERT INTO tpeo (".$pole_tpeo[$i].", server) VALUES(".$values_tpeo[$i].", ".$sel_db.")")){
                    $nook_tp++;
                }else{
                    $ok_tp++;
                }
            }
            
            $count_tf+=count($pole_tfuc);
            for($i=0; $i<count($pole_tfuc); $i++){
                if(!mysql_query("INSERT INTO tfuc (".$pole_tfuc[$i].", server) VALUES(".$values_tfuc[$i].", ".$sel_db.")")){
                    $nook_tf++;
                }else{
                    $ok_tf++;
                }
            }
         
            $count_tg+=count($pole_tgrp);
            for($i=0; $i<count($pole_tgrp); $i++){
                if(!mysql_query("INSERT INTO tgrp (".$pole_tgrp[$i].", server) VALUES(".$values_tgrp[$i].", ".$sel_db.")")){
                    $nook_tg++;
                }else{
                    $ok_tg++;
                }
            }
         
            $count_tr+=count($pole_trup);
            for($i=0; $i<count($pole_trup); $i++){
                if(!mysql_query("INSERT INTO trup (".$pole_trup[$i].", server) VALUES(".$values_trup[$i].", ".$sel_db.")")){
                    $nook_tr++;
                }else{
                    $ok_tr++;
                }
            }  
         
            $count_ts+=count($pole_tspe);
            for($i=0; $i<count($pole_tspe); $i++){
                if(!mysql_query("INSERT INTO tspe (".$pole_tspe[$i].", server) VALUES(".$values_tspe[$i].", ".$sel_db.")")){
                    $nook_ts++;
                    echo mysql_error();
                }else{
                    $ok_ts++;
                }
            }
        }
        mysql_query("REPLACE INTO cron SET id=1, date=".time().", blok=0, servers=".$servers."");
        echo "Отчет по tpeodat: Выбрано(".$count_tpd."), Записано(".$ok_tpd."), Не записано(".$nook_tpd.")\n";
        echo "Отчет по tpeo: Выбрано(".$count_tp."), Записано(".$ok_tp."), Не записано(".$nook_tp.")\n";
        echo "Отчет по tfuc: Выбрано(".$count_tf."), Записано(".$ok_tf."), Не записано(".$nook_tf.")\n";
        echo "Отчет по tgrp: Выбрано(".$count_tg."), Записано(".$ok_tg."), Не записано(".$nook_tg.")\n";
        echo "Отчет по trup: Выбрано(".$count_tr."), Записано(".$ok_tr."), Не записано(".$nook_tr.")\n";
        echo "Отчет по tspe: Выбрано(".$count_ts."), Записано(".$ok_ts."), Не записано(".$nook_ts.")\n";
         
        //Делаем все то же самое, чтобы получить текущее время
        $mtimefull = microtime();
        $mtimefull = explode(" ",$mtimefull);
        $mtimefull = $mtimefull[1] + $mtimefull[0];
        //Записываем время окончания в другую переменную
        $tend = $mtimefull;
        //Вычисляем разницу
        $totaltime = ($tend - $tstart);
        //Выводим не экран
        printf ("Страница сгенерирована за %f секунд !", $totaltime);
        ?>


      Ruby
      ExpandedWrap disabled
        require "mysql"
           begin
              DBNm = Array.new
              DBNm[0] = "stcdata"
              DBNm[1] = "stcdata"
              DBNm[2] = "stcdata"
              HostNm = Array.new
              HostNm[0] = "192.168.13.5"
              HostNm[1] = "192.168.15.221"
              HostNm[2] = "192.168.16.50"
              UsNm = Array.new
              UsNm[0] = "voen_pas"
              UsNm[1] = "voen_pas"
              UsNm[2] = "voen_pas"
              Pass = Array.new
              Pass[0]="voya7341"
              Pass[1]="voya7341"
              Pass[2]="voya7341"
         
              DBName="brep";#база
              HostName="192.168.13.129";#сервер
         
              UserName="dmitriy";#пользователь
              Password="ScX5Rz7f";#пароль
         
              t=Time.new
              startsec=t.to_f
         
         
             # connect to the MySQL server
             m = Mysql.new(HostName, UserName, Password, DBName)
          
             # get server version string and display it
             #row = dbh.select_one("SELECT VERSION()")
             #puts "Server version: " + row[0]
         
             m.query("REPLACE INTO cron2 SET id=1, blok=1")
             m.query("DELETE FROM `tpeodat2`")
             m.query("DELETE FROM `tpeo2`")
             m.query("DELETE FROM `tfuc2`")
             m.query("DELETE FROM `tgrp2`")
             m.query("DELETE FROM `trup2`")
             m.query("DELETE FROM `tspe2`")
         
             nook_tpd=0
             ok_tpd=0
             nook_tp=0
             ok_tp=0
             nook_tf=0
             ok_tf=0
             nook_tg=0
             ok_tg=0
             nook_tr=0
             ok_tr=0
             nook_ts=0
             ok_ts=0
             count_tpd=0
             count_tp=0
             error=0
             servers=0
             count_tf=0
             count_tg=0
             count_tr=0
             count_ts=0
             #pole_tpeodat=Array.new
             #values_tpeodat=Array.new
         
            DBNm.each_index do |x|
              s = Mysql.new(HostNm[x], UsNm[x], Pass[x], DBNm[x]) rescue error=1
              if error!=1
                  pole_tpeodat=Array.new
                  values_tpeodat=Array.new
                  r=s.query("SELECT tpd.* FROM tpeodat tpd, tpeo tp, tfuc tf WHERE tp.KOD=tpd.KOD AND tf.FKOD=tp.FKOD AND tf.WORK=1")
                  r.each_hash do |row|
                    k=Array.new
                    v=Array.new
                    row.each_pair do |key, val|
                      k<<key
                      v<<"'#{val}'"
                    end
                    pole_tpeodat<<k.join(', ')
                    values_tpeodat<<v.join(', ')
                  end
                  r.free
         
                  pole_tpeo=Array.new
                  values_tpeo=Array.new
                  r=s.query("SELECT tp.CMT, tp.FKOD, tp.FM, tp.IM, tp.OT, tp.GKOD, tp.GRNT, tp.KOD, tp.NZK, tp.PFLAG, tp.SKOD FROM tpeo tp, tpeodat tpd, tfuc tf WHERE tpd.KOD=tp.KOD AND tf.FKOD=tp.FKOD AND tf.WORK=1")
                  r.each_hash do |row|
                    k=Array.new
                    v=Array.new
                    row.each_pair do |key, val|
                      k<<key
                      v<<"'#{val}'"
                    end
                    pole_tpeo<<k.join(', ')
                    values_tpeo<<v.join(', ')
                  end
                  r.free
         
                  pole_tfuc=Array.new
                  values_tfuc=Array.new
                  r=s.query("SELECT * FROM tfuc WHERE WORK=1")
                  r.each_hash do |row|
                    k=Array.new
                    v=Array.new
                    row.each_pair do |key, val|
                      k<<key
                      v<<"'#{val}'"
                    end
                    pole_tfuc<<k.join(', ')
                    values_tfuc<<v.join(', ')
                  end
                  r.free
         
                  r=s.query("SELECT tp.GKOD as gk FROM tpeo tp, tpeodat tpd, tfuc tf WHERE tpd.KOD=tp.KOD AND tf.FKOD=tp.FKOD AND tf.WORK=1 GROUP BY tp.GKOD")
                  k=Array.new
                  r.each_hash do |row|
                    k<<"'#{row['gk']}'"
                  end
                  gkod=k.join(', ')
         
                  pole_tgrp=Array.new
                  values_tgrp=Array.new
                  r=s.query("SELECT * FROM tgrp WHERE GKOD IN(#{gkod})")
                  r.each_hash do |row|
                    k=Array.new
                    v=Array.new
                    row.each_pair do |key, val|
                      k<<key
                      v<<"'#{val}'"
                    end
                    pole_tgrp<<k.join(', ')
                    values_tgrp<<v.join(', ')
                  end
                  r.free
         
                  r=s.query("SELECT TRKOD FROM tgrp WHERE GKOD IN(#{gkod}) GROUP BY TRKOD")
                  k=Array.new
                  r.each_hash do |row|
                    k<<"'#{row['TRKOD']}'"
                  end
                  trkod=k.join(', ')
         
                  pole_trup=Array.new
                  values_trup=Array.new
                  r=s.query("SELECT * FROM trup WHERE TRKOD IN(#{trkod})")
                  r.each_hash do |row|
                    k=Array.new
                    v=Array.new
                    row.each_pair do |key, val|
                      k<<key
                      v<<"'#{val}'"
                    end
                    pole_trup<<k.join(', ')
                    values_trup<<v.join(', ')
                  end
                  r.free
         
                  r=s.query("SELECT SKOD FROM trup WHERE TRKOD IN(#{trkod}) GROUP BY SKOD")
                  k=Array.new
                  r.each_hash do |row|
                    k<<"'#{row['SKOD']}'"
                  end
                  skod=k.join(', ')
         
                  pole_tspe=Array.new
                  values_tspe=Array.new
                  r=s.query("SELECT * FROM tspe WHERE SKOD IN(#{skod})")
                  r.each_hash do |row|
                    k=Array.new
                    v=Array.new
                    row.each_pair do |key, val|
                      k<<key
                      v<<"'#{val}'"
                    end
                    pole_tspe<<k.join(', ')
                    values_tspe<<v.join(', ')
                  end
                  r.free
         
                  servers+=1
         
                  pole_tpeodat.each_index do |i|
                    count_tpd+=1
                    m.query("INSERT INTO tpeodat2 (#{pole_tpeodat[i]}, server) VALUES(#{values_tpeodat[i]}, #{x})") rescue error=1
                    if error==1
                       nook_tpd+=1
                       error=0
                    else
                       ok_tpd+=1
                    end
                  end
         
                  pole_tpeo.each_index do |i|
                    count_tp+=1
                    m.query("INSERT INTO tpeo2 (#{pole_tpeo[i]}, server) VALUES(#{values_tpeo[i]}, #{x})") rescue error=1
                    if error==1
                       nook_tp+=1
                       error=0
                    else
                       ok_tp+=1
                    end
                  end
         
         
                  pole_tfuc.each_index do |i|
                    count_tf+=1
                    m.query("INSERT INTO tfuc2 (#{pole_tfuc[i]}, server) VALUES(#{values_tfuc[i]}, #{x})") rescue error=1
                    if error==1
                       nook_tf+=1
                       error=0
                    else
                       ok_tf+=1
                    end
                  end
         
                  pole_tgrp.each_index do |i|
                    count_tg+=1
                    m.query("INSERT INTO tgrp2 (#{pole_tgrp[i]}, server) VALUES(#{values_tgrp[i]}, #{x})") rescue error=1
                    if error==1
                       nook_tg+=1
                       error=0
                    else
                       ok_tg+=1
                    end
                  end
         
                  pole_trup.each_index do |i|
                    count_tr+=1
                    m.query("INSERT INTO trup2 (#{pole_trup[i]}, server) VALUES(#{values_trup[i]}, #{x})") rescue error=1
                    if error==1
                       nook_tr+=1
                       error=0
                    else
                       ok_tr+=1
                    end
                  end
         
                  pole_tspe.each_index do |i|
                    count_ts+=1
                    m.query("INSERT INTO tspe2 (#{pole_tspe[i]}, server) VALUES(#{values_tspe[i]}, #{x})") rescue error=1
                    if error==1
                       nook_ts+=1
                       error=0
                    else
                       ok_ts+=1
                    end
                  end
         
              else
                puts "Сервер #{HostNm[x]} не доступен."
                error=0
              end
         
         
              
         
              error=0
            end
            
            #m = Mysql.new(HostName, UserName, Password, DBName)
            t=Time.new
            m.query("REPLACE INTO cron2 SET id=1, date=#{t.to_i}, blok=0, servers=#{servers}")
            puts "Отчет по tpeodat: Выбрано(#{count_tpd}), Записано(#{ok_tpd}), Не записано(#{nook_tpd})";
            puts "Отчет по tpeo: Выбрано(#{count_tp}), Записано(#{ok_tp}), Не записано(#{nook_tp})";
            puts "Отчет по tfuc: Выбрано(#{count_tf}), Записано(#{ok_tf}), Не записано(#{nook_tf})";
            puts "Отчет по tgrp: Выбрано(#{count_tg}), Записано(#{ok_tg}), Не записано(#{nook_tg})";
            puts "Отчет по trup: Выбрано(#{count_tr}), Записано(#{ok_tr}), Не записано(#{nook_tr})";
            puts "Отчет по tspe: Выбрано(#{count_ts}), Записано(#{ok_ts}), Не записано(#{nook_ts})";
             # disconnect from server
             m.close if m
         
             t=Time.new
             endsec=t.to_f
         
             totaltime=endsec-startsec
             printf("Страница сгенерирована за %f секунд !\n", totaltime)
            
           end


      Везде пишут что Ruby быстрее но судя по тесту не верно. Так же пишут что Ruby 1.9 быстрее 1,8 Но 1,9 поставить пока не получилось. Так же попробую заменить некоторые циклы и глянуть)))
        Вот тут задался вопросом что быстрее Ruby или PHP и решил перевести свой небольшой рабочий скрипт на Ruby и посмотреть.

        Суть скрипта собрать данные с 3 MySQL сервер и записать на 4 под cron

        Тест проводился на artaos (Debian 5.0)

        Вот мои результаты
        user posted image
        Разница PHP/Ruby
        Время: 1.469304 (PHP)
        CPU: 6.8% (PHP)
        Память: 2.4 (Ruby)

        Выдаваемый результат скрипта
        Цитата
        Отчет по tpeodat: Выбрано(11101), Записано(11099), Не записано(2)
        Отчет по tpeo: Выбрано(11101), Записано(11099), Не записано(2)
        Отчет по tfuc: Выбрано(7), Записано(7), Не записано(0)
        Отчет по tgrp: Выбрано(687), Записано(687), Не записано(0)
        Отчет по trup: Выбрано(518), Записано(518), Не записано(0)
        Отчет по tspe: Выбрано(54), Записано(54), Не записано(0)


        Везде пишут что Ruby быстрее но судя по тесту не верно. Так же пишут что Ruby 1.9 быстрее 1,8 Но 1,9 поставить пока не получилось. Так же попробую заменить некоторые циклы и глянуть)))
        Прикреплённый файлПрикреплённый файлcron.zip (3.05 Кбайт, скачиваний: 215)
          Вряд ли ruby будет быстрее. Возможно, 1.9. Да и тест не самый интересный. Тут узким местом MySQL похоже является, а не какой-либо из языков :)

          Его примущество в скорости разработки и качестве получаемого результата. Это важнее разницы выполнения в 5% :-)
          Плюс, связка ruby + rails имхо более располагает к масштабируемости, нежели месиво на PHP.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0485 ]   [ 16 queries used ]   [ Generated: 19.04.24, 06:11 GMT ]