
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.239.152.207] |
![]() |
|
Сообщ.
#1
,
|
|
|
Вот тут задался вопросом что быстрее Ruby или PHP и решил перевести свой небольшой рабочий скрипт на Ruby и посмотреть.
Суть скрипта собрать данные с 3 MySQL сервер и записать на 4 под cron Тест проводился на artaos (Debian 5.0) Вот мои результаты ![]() Разница 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 ![]() ![]() <? 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 ![]() ![]() 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 поставить пока не получилось. Так же попробую заменить некоторые циклы и глянуть))) |
Сообщ.
#2
,
|
|
|
Вот тут задался вопросом что быстрее Ruby или PHP и решил перевести свой небольшой рабочий скрипт на Ruby и посмотреть.
Суть скрипта собрать данные с 3 MySQL сервер и записать на 4 под cron Тест проводился на artaos (Debian 5.0) Вот мои результаты ![]() Разница 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 поставить пока не получилось. Так же попробую заменить некоторые циклы и глянуть))) Прикреплённый файл ![]() |
Сообщ.
#3
,
|
|
|
Вряд ли ruby будет быстрее. Возможно, 1.9. Да и тест не самый интересный. Тут узким местом MySQL похоже является, а не какой-либо из языков
![]() Его примущество в скорости разработки и качестве получаемого результата. Это важнее разницы выполнения в 5% :-) Плюс, связка ruby + rails имхо более располагает к масштабируемости, нежели месиво на PHP. |