Реальный бенчмарк по разным языкам.

 
+
-
edit
 

trainer

втянувшийся

Религия не позволяет. :)
Во имя Ctrl, Alt и святаго Del. Enter!
 
+
-
edit
 

Balancer

администратор
★★★★★
trainer> Религия не позволяет. :) [»]

"Если на пути к Истине встретишь Будду - убей Будду". Первая заповедь Дзэн :)
 
+
-
edit
 

trainer

втянувшийся

А Colorer-то ваш с C++ не очень дружит :)
Во имя Ctrl, Alt и святаго Del. Enter!
 
+
-
edit
 

Balancer

администратор
★★★★★
trainer> А Colorer-то ваш с C++ не очень дружит :) [»]

А что не так? :)
Разве что двоеточния за обозначения смайлов принял, так это в парсере баг, не в колорере. Подправлю потом :)
 

BrAB

аксакал
★★
BrAB>> Вообщем красотой реализации на перле восхищён. Но вот как решить чуть более сложную задачу - придумать не могу.
BrAB>> Есть лог вида
BrAB>> адрес_источника адрес_получателя объём_в_байтах
BrAB>> адресов получателей много - но число их конечно. вообщем нужно получить N таблиц (где N - число адресов получателей) как в примере Балансера, т. е. адрес источника - количество полученых байт.
Balancer> Не совсем понятно, но если достаточно решения на Perl, то будет так (не тестировано):

Спасибо, но я видимо неправильно объяснил
Подробнее. Вот например

222.222.222.222 192.168.0.1 55
222.222.111.111 192.168.0.2 34
222.222.222.222 192.168.0.1 53
222.222.222.222 192.168.0.2 51
222.222.133.133 192.168.0.1 44
222.222.222.222 192.168.0.2 23
222.222.111.111 192.168.0.2 23
222.222.133.133 192.168.0.1 33

Тут ДВА адреса получателей - 192.168.0.1 и 192.168.02
Поэтому на выходе должно быть две таблицы
Первая для 192.168.0.1
адрес_источника сумма
222.222.222.222 108
222.222.133.133 77
Вторая для 192.168.0.2
адрес_источника сумма
222.222.111.111 57
222.222.222.222 74

Т. е. то же что и в начальном примере топика, только там адрес получателя всегда один - а у меня их много и для каждого нужно сделать такую таблицу....
Вот я и не могу сообразить как сделать.
Было у еврея всё плохо. Пришел за советом к равину. Тот - напиши над дверью - "Так будет не всегда". Стало всё ок. Пошел он благодарить. А тот ему - надпись не стирай. Злой чечен ползет на берег. ©Лермонтов  
Это сообщение редактировалось 03.05.2005 в 10:41
+
-
edit
 

Balancer

администратор
★★★★★
BrAB> Спасибо, но я видимо неправильно объяснил
BrAB> Подробнее. Вот например

Ага, задача другая :)
code perl
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4.  
  5. my %bytes;
  6.  
  7. while(<>)
  8. {
  9.         $bytes{"$2-$1"} += int($3) if /^(.+)\s+(.+)\s+(.+)/;
  10. }
  11.  
  12. my $last_ip = "";
  13.  
  14. for(sort keys %bytes)
  15. {
  16.     my($dest, $src) = split/\-/;
  17.     if($dest ne $last_ip)
  18.     {
  19.                 print "Data for $dest:\n";
  20.                 $last_ip  = $dest;
  21.         }
  22.         print "    $src: $bytes{$_}\n";
  23. }


Несколько коряво, на работает. Вывод в духе:
code text
  1. Data for 192.168.0.1:
  2.     222.222.133.133: 77
  3.     222.222.222.222: 108
  4. Data for 192.168.0.2:
  5.     222.222.111.111: 57
  6.     222.222.222.222: 74


Тут бы мог помочь многомерный хеш, но я не знаю, как с ними работать, что-то глючит или меня, или Perl :)
 

BrAB

аксакал
★★
BrAB>> Спасибо, но я видимо неправильно объяснил
BrAB>> Подробнее. Вот например
Balancer> Ага, задача другая :)

Ну говорить как я благодарен бесполезно - монитор не вместит мою благодарность :)

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

P. S. что нужно курить чтобы начать понимать регулярные выражения? или это только после просветления?
Было у еврея всё плохо. Пришел за советом к равину. Тот - напиши над дверью - "Так будет не всегда". Стало всё ок. Пошел он благодарить. А тот ему - надпись не стирай. Злой чечен ползет на берег. ©Лермонтов  

Balancer

администратор
★★★★★
BrAB> P. S. что нужно курить чтобы начать понимать регулярные выражения? или это только после просветления? [»]

да нет, практика :) начинаешь с самых простых (в этом примере, как раз, ничего сложного) и понемногу усложняешь, усложняешь... Во-первых, perldoc perlre, во вторых - запросы на всяких форумах по Perl и т.п., можно тут у меня :D Ну а потом свой опыт будет расти. Многого в регекспах я и сам ещё не умею :)

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

/^(.+)\s+(.+)\s+(.+)/

/.../ - ограничители выражения
^ - искать от начала строки
(.+) - любые символы (".") от одного и больше ("+"), результат занести в системную переменную (первое упоминание - $1, второе - $2 и т.д.)
\s+ - пробел (точнее, пробелы, табуляции и т.п. - "\s") от одного и больше

Т.е. это выражение первую цепочку символов заносит в переменную $1, потом пропускает пробелы, потом - вторую цепочку в $2, опять игнорируем пробелы, третью - в $3.

$bytes{"$2-$1"} += int($3)

Добавляем в хеш по ключу вида "192.168.0.1-222.222.222.222" наш размер.

for(sort keys %bytes) - цикл по отсортированным ключам кеша

my($dest, $src) = split/\-/; - разрезаем ключ "192.168.0.1-222.222.222.222" по знаку "-" (экранируется слешем, т.к. первый аргумент split'а - регексп, а минус там значащий символ)

...

Что там ещё

while(<>) - это просто цикл по строкам входного потока.

Часто используется неявная переменная $_

for(sort keys %bytes)

Полный формат был бы for $key (sort keys %bytes) - переменной цикла была бы $key. Но мы её не указываем, цикл пойдёт с $_;

split/\-/; - полный формат "split /\-/, $var;", но если переменная не указана, то разделяться будет текущая переменная $_

Вроде, всё разобрал :)
 

FR0

новичок
Balancer> Тут бы мог помочь многомерный хеш, но я не знаю, как с ними работать, что-то глючит или меня, или Perl :) [»]

А что это такое многомерный хеш?
В питоне это можно сделать с помощью вложенных словарей:

code text
  1. traffic = {}
  2.  
  3. for line in open('data2.log'):
  4.         sline = line.split()
  5.         if not traffic.has_key(sline[1]): traffic[sline[1]] = {sline[0] : 0}
  6.         map = traffic[sline[1]]
  7.         if not map.has_key(sline[0]): map[sline[0]] = 0
  8.         map[sline[0]] += int(sline[2])
  9.  
  10. fres = open('python2.txt', 'w')
  11. for map in traffic:
  12.         print >> fres, map
  13.         for i in traffic[map]:
  14.                 print  >> fres, i, traffic[map][i]
  15.         print >> fres
 
RU Dem_anywhere #03.05.2005 13:17
+
-
edit
 

Dem_anywhere

аксакал
★☆
Может проще загнать в базу и сделать выборку?
 
+
-
edit
 

Balancer

администратор
★★★★★
Dem_anywhere> Может проще загнать в базу и сделать выборку? [»]

Из пушки по воробьям :)
 

BrAB

аксакал
★★
Dem_anywhere> Может проще загнать в базу и сделать выборку? [»]
вы будете смеяться, но этот скрипт как раз и предназначен чтобы загонять в базу уже обработанные данные. Дело в том, что это кусок системы подсчёта трафика (я билинг на диплом делаю). Просто я смутно подозреваю что если mysql пихать данные о заголовке каждого Ip пакета - то рано или поздно он здохнет. а так - храню выжимку

Было у еврея всё плохо. Пришел за советом к равину. Тот - напиши над дверью - "Так будет не всегда". Стало всё ок. Пошел он благодарить. А тот ему - надпись не стирай. Злой чечен ползет на берег. ©Лермонтов  
+
-
edit
 

Balancer

администратор
★★★★★
MySQL на средней машине (~512мб оперативки и т.п.) на таких данных потянет до ~миллиона строк данных при приемлемом времени выборки (секунды). Так что прикинь, если он этот миллион забъёт за месяц, то, конечно, лучше сразу обработанные данные грузить (точнее - это всегда лучше :D ), если за 10 лет - то можно сразу в БД всё втягивать, а дальше уже выборки.
 

BrAB

аксакал
★★
Balancer> MySQL на средней машине (~512мб оперативки и т.п.) на таких данных потянет до ~миллиона строк данных при приемлемом времени выборки (секунды). Так что прикинь, если он этот миллион забъёт за месяц, то, конечно, лучше сразу обработанные данные грузить (точнее - это всегда лучше :D ), если за 10 лет - то можно сразу в БД всё втягивать, а дальше уже выборки. [»]

Ну по прикидкам запросто 500 тысяч записей за сутки может быть. Так что я лучше уж скриптом.......
Было у еврея всё плохо. Пришел за советом к равину. Тот - напиши над дверью - "Так будет не всегда". Стало всё ок. Пошел он благодарить. А тот ему - надпись не стирай. Злой чечен ползет на берег. ©Лермонтов  
+
-
edit
 

Balancer

администратор
★★★★★
В таком случае - да, предварительная обработка неизбежна :)
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru