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

 
+
-
edit
 

Balancer

администратор
★★★★★
Итак, есть 16Мб (391.4 тыс. строк) лог пакетов моей сетевухи за месяц. Вид такой:

UDP 213.252.121.73 137 213.252.121.68 137 192 0
ICMP 213.252.121.73 0 213.252.121.68 0 60 60
TCP 213.252.121.73 139 213.252.121.68 client 1367 1689
UDP 213.252.121.73 137 62.205.176.30 137 550 156
TCP 213.252.121.73 80 213.252.121.68 client 88 272

Т.е. Протокол, IP_источника(всегда мой), Порт_источника, IP_приёмника, Порт_приёмника, послано, получено (байт).

Надо посмотреть, с какого IP у меня какой трафик суммарный и отсортировать по трафику.

Для начала мой текущий рабочий для таких целей инструмент. Perl.
[/span]
CODE
Created with colorer-take5 library. Type 'perl'  open FH[color=#808030; ],[/color] [color=#0000e6; ]"[/color][color=#008c00; ]03[/color][color=#0000e6; ]-[/color][color=#008c00; ]05[/color][color=#0000e6; ]-any.txt"[/color] [color=#808030; ]or[/color] die $![color=#800080; ];[/color] while[color=#808030; ]([/color][color=#40015a; ]<FH>[/color][color=#808030; ])[/color] [color=#800080; ]{[/color]     $hosts[color=#800080; ]{[/color]$4[color=#800080; ]}[/color][color=#808030; ]+[/color][color=#808030; ]=[/color]$7 [color=#808030; ]if[/color][color=#0000e6; ] [/color][color=#800000; ]/[/color][color=#0000e6; ]^[/color][color=#0f69ff; ]\s[/color][color=#0000e6; ]+([/color][color=#0f69ff; ]\w[/color][color=#0000e6; ]+)[/color][color=#0f69ff; ]\s[/color][color=#0000e6; ]+([/color][color=#0f69ff; ]\d[/color][color=#0000e6; ]{[/color][color=#008c00; ]1[/color][color=#0000e6; ],[/color][color=#008c00; ]3[/color][color=#0000e6; ]}[/color][color=#0f69ff; ]\.[/color][color=#0f69ff; ]\d[/color][color=#0000e6; ]{[/color][color=#008c00; ]1[/color][color=#0000e6; ],[/color][color=#008c00; ]3[/color][color=#0000e6; ]}[/color][color=#0f69ff; ]\.[/color][color=#0f69ff; ]\d[/color][color=#0000e6; ]{[/color][color=#008c00; ]1[/color][color=#0000e6; ],[/color][color=#008c00; ]3[/color][color=#0000e6; ]}[/color][color=#0f69ff; ]\.[/color][color=#0f69ff; ]\d[/color][color=#0000e6; ]{[/color][color=#008c00; ]1[/color][color=#0000e6; ],[/color][color=#008c00; ]3[/color][color=#0000e6; ]})[/color][color=#0f69ff; ]\s[/color][color=#0000e6; ]+([/color][color=#0f69ff; ]\w[/color][color=#0000e6; ]+)[/color][color=#0f69ff; ]\s[/color][color=#0000e6; ]+([/color][color=#0f69ff; ]\d[/color][color=#0000e6; ]{[/color][color=#008c00; ]1[/color][color=#0000e6; ],[/color][color=#008c00; ]3[/color][color=#0000e6; ]}[/color][color=#0f69ff; ]\.[/color][color=#0f69ff; ]\d[/color][color=#0000e6; ]{[/color][color=#008c00; ]1[/color][color=#0000e6; ],[/color][color=#008c00; ]3[/color][color=#0000e6; ]}[/color][color=#0f69ff; ]\.[/color][color=#0f69ff; ]\d[/color][color=#0000e6; ]{[/color][color=#008c00; ]1[/color][color=#0000e6; ],[/color][color=#008c00; ]3[/color][color=#0000e6; ]}[/color][color=#0f69ff; ]\.[/color][color=#0f69ff; ]\d[/color][color=#0000e6; ]{[/color][color=#008c00; ]1[/color][color=#0000e6; ],[/color][color=#008c00; ]3[/color][color=#0000e6; ]})[/color][color=#0f69ff; ]\s[/color][color=#0000e6; ]+([/color][color=#0f69ff; ]\w[/color][color=#0000e6; ]+)[/color][color=#0f69ff; ]\s[/color][color=#0000e6; ]+([/color][color=#0f69ff; ]\d[/color][color=#0000e6; ]+)[/color][color=#0f69ff; ]\s[/color][color=#0000e6; ]+([/color][color=#0f69ff; ]\d[/color][color=#0000e6; ]+)[/color][color=#800000; ]/[/color][color=#800080; ];[/color] [color=#800080; ]}[/color]  open FH[color=#808030; ],[/color] [color=#0000e6; ]">perl.txt"[/color] [color=#808030; ]or[/color] die $![color=#800080; ];[/color] print FH [color=#0000e6; ]"[/color][color=#0000e6; ]$_[/color][color=#0000e6; ]: [/color][color=#0000e6; ]$hosts[/color][color=#0000e6; ]{[/color][color=#0000e6; ]$_[/color][color=#0000e6; ]}[/color][color=#0f69ff; ]\n[/color][color=#0000e6; ]"[/color] for sort [color=#800080; ]{[/color] $hosts[color=#800080; ]{[/color]$b[color=#800080; ]}[/color] [color=#40015a; ]<=>[/color] $hosts[color=#800080; ]{[/color]$a[color=#800080; ]}[/color] [color=#800080; ]}[/color] keys %hosts[color=#800080; ];[/color] 
[span class='postcolor']

Время написания - около 15 мин. Минут 5 на код, минут 10 на оптимизацию. Первоначальный вариант был раза в два больше и работал 40 секунд. Этот вариант: 3.7 сек. В отчёте - 1512 строк. Для примера, трафик Авиабазы занимает первое место и составляет 295Мб :)

Оптимизация была в подборе регекспа. Сперва он был совсем простой, с кучей \s+(.+?)\s+(.+?)... - вот эти .+? и тормозили :)

А, зачем регексп? - там не все строки в этом формате. Ещё есть строки со временем блока пакетов и т.п. Не нужные, в общем :) Только что в голову пришла мысль вместо регекспа попробовать split /\s+/ - сейчас сравню...
 
Это сообщение редактировалось 30.05.2003 в 11:32
+
-
edit
 

Balancer

администратор
★★★★★
Мде. Вариант
[/span]
CODE
Created with colorer-take5 library. Type 'perl'  open FH[color=#808030; ],[/color] [color=#0000e6; ]"[/color][color=#008c00; ]03[/color][color=#0000e6; ]-[/color][color=#008c00; ]05[/color][color=#0000e6; ]-any.txt"[/color] [color=#808030; ]or[/color] die $![color=#800080; ];[/color] while[color=#808030; ]([/color][color=#40015a; ]<FH>[/color][color=#808030; ])[/color] [color=#800080; ]{[/color]     @x[color=#808030; ]=[/color][color=#808030; ]split[/color][color=#0000e6; ] [/color][color=#800000; ]/[/color][color=#0f69ff; ]\s[/color][color=#0000e6; ]+[/color][color=#800000; ]/[/color][color=#800080; ];[/color]     $hosts[color=#800080; ]{[/color]$x[color=#808030; ][[/color][color=#008c00; ]4[/color][color=#808030; ]][/color][color=#800080; ]}[/color][color=#808030; ]+[/color][color=#808030; ]=[/color]$x[color=#808030; ][[/color][color=#008c00; ]7[/color][color=#808030; ]][/color] if $x[color=#808030; ][[/color][color=#008c00; ]4[/color][color=#808030; ]][/color] [color=#808030; ]and[/color] $x[color=#808030; ][[/color][color=#008c00; ]7[/color][color=#808030; ]][/color][color=#800080; ];[/color] [color=#800080; ]}[/color]  open FH[color=#808030; ],[/color] [color=#0000e6; ]">perl.txt"[/color] [color=#808030; ]or[/color] die $![color=#800080; ];[/color] print FH [color=#0000e6; ]"[/color][color=#0000e6; ]$_[/color][color=#0000e6; ]: [/color][color=#0000e6; ]$hosts[/color][color=#0000e6; ]{[/color][color=#0000e6; ]$_[/color][color=#0000e6; ]}[/color][color=#0f69ff; ]\n[/color][color=#0000e6; ]"[/color] for sort [color=#800080; ]{[/color] $hosts[color=#800080; ]{[/color]$b[color=#800080; ]}[/color] [color=#40015a; ]<=>[/color] $hosts[color=#800080; ]{[/color]$a[color=#800080; ]}[/color] [color=#800080; ]}[/color] keys %hosts[color=#800080; ];[/color] 
[span class='postcolor']
считает 10.8 секунд. Со сравнением с регекспом - шустрее :)
 
Это сообщение редактировалось 30.05.2003 в 11:32
+
-
edit
 

Balancer

администратор
★★★★★
PHP:
[/span]
CODE
Created with colorer-take5 library. Type 'php'  <?[/span]     $fh=fopen("03-05-any.txt","r");     while(!feof($fh))         if(preg_match("/^\s+(\w+)\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\w+)\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\w+)\s+(\d+)\s+(\d+)/",fgets($fh),$m))             $hosts[[/color]$m[color=#808030; background:#ffffe8; ][[/color]4[color=#808030; background:#ffffe8; ]]]+=$m[[/color]7[color=#808030; background:#ffffe8; ]];     arsort($hosts);     reset($hosts);     $fh=fopen("php.txt","w");     foreach($hostsas$ip=>$traff)     {         fputs($fh,"$ip: $traff\n");     }     fclose($fh); [span style='color:#a65700; background:#ffffe8; ']?> 
[span class='postcolor']

7.8 сек. Время написания - около 10 мин. Сперва был попробован вариант с родным split, но не заработал (нарезает по каждому пробелу, а не по их группе.) Вариант с preg_split не пробовал, т.к., скорее всего, будет хуже.

Уф, всё. Я - спать. Остальное - завтра :)
 
Это сообщение редактировалось 30.05.2003 в 11:33
+
-
edit
 

Balancer

администратор
★★★★★
Уф... Хватит с меня! "Голый" C++, без внешних либ, в лице VC7:
[/span]
CODE
Created with colorer-take5 library. Type 'cpp'  [color=#004a43; ]#[/color]include[color=#004a43; ] [/color][color=#0000e6; ]<stdio.h>[/color] [color=#004a43; ]#[/color]include[color=#004a43; ] [/color][color=#0000e6; ]<string.h>[/color]  void main[color=#808030; ]([/color]void[color=#808030; ])[/color] [color=#800080; ]{[/color]     const int max_items[color=#808030; ]=[/color][color=#008c00; ]20000[/color][color=#800080; ];[/color]      unsigned int keys[color=#808030; ][[/color]max_items[color=#808030; ]][/color][color=#800080; ];[/color]     int values[color=#808030; ][[/color]max_items[color=#808030; ]][/color][color=#800080; ];[/color]     int pos[color=#808030; ]=[/color][color=#008c00; ]0[/color][color=#800080; ];[/color]     char buf[color=#808030; ][[/color][color=#008c00; ]256[/color][color=#808030; ]][/color][color=#800080; ];[/color]      char proto[color=#808030; ][[/color][color=#008c00; ]6[/color][color=#808030; ]][/color][color=#800080; ];[/color]     char src[color=#808030; ][[/color][color=#008c00; ]16[/color][color=#808030; ]][/color][color=#800080; ];[/color]     char src_port[color=#808030; ][[/color][color=#008c00; ]16[/color][color=#808030; ]][/color][color=#800080; ];[/color]     char dst[color=#808030; ][[/color][color=#008c00; ]16[/color][color=#808030; ]][/color][color=#800080; ];[/color]     char dst_port[color=#808030; ][[/color][color=#008c00; ]16[/color][color=#808030; ]][/color][color=#800080; ];[/color]     int sent[color=#800080; ];[/color]     int [color=#008484; ]recv[/color][color=#800080; ];[/color]     unsigned int ip[color=#800080; ];[/color]     int ip_b1[color=#808030; ],[/color]ip_b2[color=#808030; ],[/color]ip_b3[color=#808030; ],[/color]ip_b4[color=#800080; ];[/color]      FILE[color=#808030; ]*[/color] fp[color=#808030; ]=[/color]fopen[color=#808030; ]([/color][color=#0000e6; ]"03-05-any.txt"[/color][color=#808030; ],[/color][color=#0000e6; ]"r"[/color][color=#808030; ])[/color][color=#800080; ];[/color]     while[color=#808030; ]([/color][color=#808030; ]![/color]feof[color=#808030; ]([/color]fp[color=#808030; ])[/color][color=#808030; ])[/color]     [color=#800080; ]{[/color]         fgets[color=#808030; ]([/color]buf[color=#808030; ],[/color][color=#008c00; ]254[/color][color=#808030; ],[/color]fp[color=#808030; ])[/color][color=#800080; ];[/color]         [color=#696969; ]// Разберём строку[/color]         fscanf[color=#808030; ]([/color]fp[color=#808030; ],[/color] [color=#0000e6; ]"[/color][color=#0f69ff; ]%s[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%s[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%s[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%s[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%s[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%d[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%d[/color][color=#0000e6; ]"[/color][color=#808030; ],[/color] proto[color=#808030; ],[/color] src[color=#808030; ],[/color] src_port[color=#808030; ],[/color] dst[color=#808030; ],[/color] dst_port[color=#808030; ],[/color] [color=#808030; ]&[/color]sent[color=#808030; ],[/color] [color=#808030; ]&[/color][color=#008484; ]recv[/color][color=#808030; ])[/color][color=#800080; ];[/color]         if[color=#808030; ]([/color][color=#008484; ]recv[/color] [color=#808030; ]&[/color][color=#808030; ]&[/color] strstr[color=#808030; ]([/color]dst[color=#808030; ],[/color][color=#0000e6; ]"."[/color][color=#808030; ])[/color][color=#808030; ]>[/color][color=#008c00; ]0[/color][color=#808030; ])[/color]         [color=#800080; ]{[/color]             [color=#696969; ]// Разберём IP и плучим его численное значение[/color]             sscanf[color=#808030; ]([/color]dst[color=#808030; ],[/color][color=#0000e6; ]"[/color][color=#0f69ff; ]%d[/color][color=#0000e6; ].[/color][color=#0f69ff; ]%d[/color][color=#0000e6; ].[/color][color=#0f69ff; ]%d[/color][color=#0000e6; ].[/color][color=#0f69ff; ]%d[/color][color=#0000e6; ]"[/color][color=#808030; ],[/color] [color=#808030; ]&[/color]ip_b1[color=#808030; ],[/color] [color=#808030; ]&[/color]ip_b2[color=#808030; ],[/color] [color=#808030; ]&[/color]ip_b3[color=#808030; ],[/color] [color=#808030; ]&[/color]ip_b4[color=#808030; ])[/color][color=#800080; ];[/color]             ip[color=#808030; ]=[/color]ip_b1[color=#808030; ]<[/color][color=#808030; ]<[/color][color=#008c00; ]24[/color][color=#808030; ]|[/color]ip_b2[color=#808030; ]<[/color][color=#808030; ]<[/color][color=#008c00; ]16[/color][color=#808030; ]|[/color]ip_b3[color=#808030; ]<[/color][color=#808030; ]<[/color][color=#008c00; ]8[/color][color=#808030; ]|[/color]ip_b4[color=#800080; ];[/color]                          [color=#696969; ]// Ищем этот IP в хеше[/color]             int found[color=#808030; ]=[/color][color=#808030; ]-[/color][color=#008c00; ]1[/color][color=#800080; ];[/color]             for[color=#808030; ]([/color]int i[color=#808030; ]=[/color][color=#008c00; ]0[/color][color=#800080; ];[/color] i[color=#808030; ]<[/color]pos[color=#800080; ];[/color] i[color=#808030; ]+[/color][color=#808030; ]+[/color][color=#808030; ])[/color]                 if[color=#808030; ]([/color]keys[color=#808030; ][[/color]i[color=#808030; ]][/color][color=#808030; ]=[/color][color=#808030; ]=[/color]ip[color=#808030; ])[/color] [color=#696969; ]// нашли[/color]                 [color=#800080; ]{[/color]                     found[color=#808030; ]=[/color]i[color=#800080; ];[/color]                      break[color=#800080; ];[/color]                 [color=#800080; ]}[/color]              if[color=#808030; ]([/color]found[color=#808030; ]=[/color][color=#808030; ]=[/color][color=#808030; ]-[/color][color=#008c00; ]1[/color][color=#808030; ])[/color] [color=#696969; ]// не нашли[/color]                 if[color=#808030; ]([/color]pos[color=#808030; ]<[/color]max_items[color=#808030; ])[/color]                     keys[color=#808030; ][[/color]found[color=#808030; ]=[/color]pos[color=#808030; ]+[/color][color=#808030; ]+[/color][color=#808030; ]][/color][color=#808030; ]=[/color]ip[color=#800080; ];[/color]                 else                     printf[color=#808030; ]([/color][color=#0000e6; ]"Ошибка: переполнение хеша![/color][color=#0f69ff; ]\n[/color][color=#0000e6; ]"[/color][color=#808030; ])[/color][color=#800080; ];[/color]              if[color=#808030; ]([/color]found[color=#808030; ]![/color][color=#808030; ]=[/color][color=#808030; ]-[/color][color=#008c00; ]1[/color][color=#808030; ])[/color]                 values[color=#808030; ][[/color]found[color=#808030; ]][/color][color=#808030; ]+[/color][color=#808030; ]=[/color][color=#008484; ]recv[/color][color=#800080; ];[/color]          [color=#800080; ]}[/color]     [color=#800080; ]}[/color]     fclose[color=#808030; ]([/color]fp[color=#808030; ])[/color][color=#800080; ];[/color]      [color=#696969; ]// Быстрая (Q) сортировка[/color]     for[color=#808030; ]([/color]int i[color=#808030; ]=[/color][color=#008c00; ]0[/color][color=#800080; ];[/color] i[color=#808030; ]<[/color]pos[color=#800080; ];[/color] i[color=#808030; ]+[/color][color=#808030; ]+[/color][color=#808030; ])[/color]     [color=#800080; ]{[/color]         int [color=#008484; ]max[/color][color=#808030; ]=[/color][color=#808030; ]-[/color][color=#008c00; ]1[/color][color=#800080; ];[/color]          int max_pos[color=#808030; ]=[/color][color=#808030; ]-[/color][color=#008c00; ]1[/color][color=#800080; ];[/color]         for[color=#808030; ]([/color]int j[color=#808030; ]=[/color]i[color=#808030; ]+[/color][color=#008c00; ]1[/color][color=#800080; ];[/color] j[color=#808030; ]<[/color]pos[color=#800080; ];[/color] j[color=#808030; ]+[/color][color=#808030; ]+[/color][color=#808030; ])[/color]         [color=#800080; ]{[/color]             if[color=#808030; ]([/color]values[color=#808030; ][[/color]j[color=#808030; ]][/color][color=#808030; ]>[/color][color=#008484; ]max[/color][color=#808030; ])[/color]             [color=#800080; ]{[/color]                 [color=#008484; ]max[/color][color=#808030; ]=[/color]values[color=#808030; ][[/color]j[color=#808030; ]][/color][color=#800080; ];[/color]                 max_pos[color=#808030; ]=[/color]j[color=#800080; ];[/color]             [color=#800080; ]}[/color]         [color=#800080; ]}[/color]         if[color=#808030; ]([/color][color=#008484; ]max[/color][color=#808030; ]>[/color][color=#008c00; ]0[/color][color=#808030; ])[/color]         [color=#800080; ]{[/color]             int tmp[color=#808030; ]=[/color]  keys[color=#808030; ][[/color]i[color=#808030; ]][/color][color=#800080; ];[/color]   keys[color=#808030; ][[/color]i[color=#808030; ]][/color][color=#808030; ]=[/color]  keys[color=#808030; ][[/color]max_pos[color=#808030; ]][/color][color=#800080; ];[/color]   keys[color=#808030; ][[/color]max_pos[color=#808030; ]][/color][color=#808030; ]=[/color]tmp[color=#800080; ];[/color]                 tmp[color=#808030; ]=[/color]values[color=#808030; ][[/color]i[color=#808030; ]][/color][color=#800080; ];[/color] values[color=#808030; ][[/color]i[color=#808030; ]][/color][color=#808030; ]=[/color]values[color=#808030; ][[/color]max_pos[color=#808030; ]][/color][color=#800080; ];[/color] values[color=#808030; ][[/color]max_pos[color=#808030; ]][/color][color=#808030; ]=[/color]tmp[color=#800080; ];[/color]         [color=#800080; ]}[/color]     [color=#800080; ]}[/color]      fp[color=#808030; ]=[/color]fopen[color=#808030; ]([/color][color=#0000e6; ]"cpp.txt"[/color][color=#808030; ],[/color][color=#0000e6; ]"w"[/color][color=#808030; ])[/color][color=#800080; ];[/color]      for[color=#808030; ]([/color]int i[color=#808030; ]=[/color][color=#008c00; ]0[/color][color=#800080; ];[/color] i[color=#808030; ]<[/color]pos[color=#800080; ];[/color] i[color=#808030; ]+[/color][color=#808030; ]+[/color][color=#808030; ])[/color]     [color=#800080; ]{[/color]         ip_b1[color=#808030; ]=[/color][color=#808030; ]([/color]keys[color=#808030; ][[/color]i[color=#808030; ]][/color][color=#808030; ]>[/color][color=#808030; ]>[/color][color=#008c00; ]24[/color][color=#808030; ])[/color] [color=#808030; ]&[/color] [color=#008000; ]0xFF[/color][color=#800080; ];[/color]         ip_b2[color=#808030; ]=[/color][color=#808030; ]([/color]keys[color=#808030; ][[/color]i[color=#808030; ]][/color][color=#808030; ]>[/color][color=#808030; ]>[/color][color=#008c00; ]16[/color][color=#808030; ])[/color] [color=#808030; ]&[/color] [color=#008000; ]0xFF[/color][color=#800080; ];[/color]         ip_b3[color=#808030; ]=[/color][color=#808030; ]([/color]keys[color=#808030; ][[/color]i[color=#808030; ]][/color][color=#808030; ]>[/color][color=#808030; ]>[/color] [color=#008c00; ]8[/color][color=#808030; ])[/color] [color=#808030; ]&[/color] [color=#008000; ]0xFF[/color][color=#800080; ];[/color]         ip_b4[color=#808030; ]=[/color] keys[color=#808030; ][[/color]i[color=#808030; ]][/color]      [color=#808030; ]&[/color] [color=#008000; ]0xFF[/color][color=#800080; ];[/color]         fprintf[color=#808030; ]([/color]fp[color=#808030; ],[/color][color=#0000e6; ]"[/color][color=#0f69ff; ]%d[/color][color=#0000e6; ].[/color][color=#0f69ff; ]%d[/color][color=#0000e6; ].[/color][color=#0f69ff; ]%d[/color][color=#0000e6; ].[/color][color=#0f69ff; ]%d[/color][color=#0000e6; ]: [/color][color=#0f69ff; ]%u[/color][color=#0f69ff; ]\n[/color][color=#0000e6; ]"[/color][color=#808030; ],[/color]ip_b1[color=#808030; ],[/color]ip_b2[color=#808030; ],[/color]ip_b3[color=#808030; ],[/color]ip_b4[color=#808030; ],[/color] values[color=#808030; ][[/color]i[color=#808030; ]][/color][color=#808030; ])[/color][color=#800080; ];[/color]     [color=#800080; ]}[/color]      fclose[color=#808030; ]([/color]fp[color=#808030; ])[/color][color=#800080; ];[/color] [color=#800080; ]}[/color] 
[span class='postcolor']

1.0 сек. Но! Считает неправильно. Угрохан уже час - около получаса на написание, около получаса на поиск, почему считает неправильно... Так и не нашёл. C++ - мастдай! :D
 
Это сообщение редактировалось 30.05.2003 в 11:34
BG Реконструктор #30.05.2003 10:10
+
-
edit
 


Выложи файл, пусть каждый испытает себя и свой любимый язык ;)
 
+
-
edit
 

Balancer

администратор
★★★★★
Шо, все 16Мб выкладывать?? :D Вы уж лучше исходники давайте. Ну, или бинарники, если у меня такого компилятора/транслятора нет.

Только тест не слишком удачный вышел. Если честно, я думал, что время обработки такого файла будет идти на минуты и у Perl/PHP и C++. Оказалось - слишком просто :)

Подсчёт слов в тексте для Perl/PHP будет такой же скорости, а для C++ - посложнее, поскольку придётся вводить уже полноценый хэш, а не упрощение, основанную на том, что IP все целочисленные. Но такие задачи передо мной не стоят...

Хотя! Есть у меня ещё задачка. Но посложнее, примеры не столь прозрачными будут. Есть 12Мб список незанятых двух/трёх/четырёхзначных доменов в .ru. Есть словари русских и английских слов. Русский можно транслитерировать фонетически, а можно - по совпадению внешнего написания букв (привет, TbMA! :)). Найти среди списка всех доменов домены, входящте в эти списки слов... Перловый скрипт тоже был быстро написан, за минуты, но медленно работал :) Мне хватило, поскольку операция одноразовая, но для теста задание сгодится :)
 
+
-
edit
 

Serge77

модератор

> Найти среди списка всех доменов домены, входящте в эти списки слов...

Если я не ошибаюсь, задача сводится к нахождению логического пересечения двух списков? Разве для этого нет стандартных средств?
+
-
edit
 

Balancer

администратор
★★★★★
А разве в каком-то ЯВУ есть такие стандартные средства? :)

Хотя, в PHP, кажется, появилось недавно. Не смотрел. Но дело не в том. Список доменов - 12Мб. Если загрузить всё сразу... Не сдохнет ли машинка? :) Одних списков слов - 11Мб. А их-то уж точно придётся грузить в память :)
 
+
-
edit
 

Serge77

модератор

Balancer>А разве в каком-то ЯВУ есть такие стандартные средства? :)

Я вообще-то не знаток, но немного знаю GNU textutils, там есть uniq.exe, он делает эту операцию над предварительно отсортированными списками.

А для сортировки там же есть gsort.exe
BG Реконструктор #30.05.2003 13:53
+
-
edit
 
А если попробывать загрузить всё это в память? Типа:

[/span]
CODE
Created with colorer-take5 library. Type 'cpp'    struct mystruct  [color=#800080; ]{[/color]  long ip[color=#800080; ];[/color]  long traffic[color=#800080; ];[/color]  char is_processed[color=#800080; ];[/color] [color=#800080; ]}[/color] 
[span class='postcolor']

Создать массив из таких структур и потом обрабатывать?
 
Это сообщение редактировалось 30.05.2003 в 16:59
+
-
edit
 

Balancer

администратор
★★★★★
Навскидку - будет медленнее. Поскольку читать файл всё равно придётся, а потом ещё и анализировать его отдельно. Двойная работа.
 
+
-
edit
 

Serge77

модератор

Balancer>Найти среди списка всех доменов домены, входящте в эти списки слов...

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

Это будет быстро?
US ComputerMage #30.05.2003 16:29
+
-
edit
 

ComputerMage

втянувшийся



Balancer>Уф... Хватит с меня! "Голый" C++, без внешних либ, в лице VC7:


Гхм, я бы сказал даже "голый" С, без плюсов =)


Balancer>1.0 сек. Но! Считает неправильно. Угрохан уже час - около получаса на написание, около получаса на поиск, почему считает неправильно... Так и не нашёл. C++ - мастдай! :D



Вот вариант



[/span]
CODE
Created with colorer-take5 library. Type 'cpp'    [color=#004a43; ]#[/color]include[color=#004a43; ] [/color][color=#0000e6; ]<stdio.h>[/color] [color=#004a43; ]#[/color]include[color=#004a43; ] [/color][color=#0000e6; ]<string.h>[/color] [color=#004a43; ]#[/color]include[color=#004a43; ] [/color][color=#0000e6; ]<string>[/color] [color=#004a43; ]#[/color]include[color=#004a43; ] [/color][color=#0000e6; ]<map>[/color]  using namespace std[color=#800080; ];[/color] typedef map[color=#808030; ]<[/color]string[color=#808030; ],[/color]int[color=#808030; ]>[/color] ipMap[color=#800080; ];[/color] typedef ipMap[color=#808030; ]:[/color][color=#808030; ]:[/color]iterator ipMapIter[color=#800080; ];[/color]  void main[color=#808030; ]([/color]void[color=#808030; ])[/color] [color=#800080; ]{[/color]    const int max_items[color=#808030; ]=[/color][color=#008c00; ]20000[/color][color=#800080; ];[/color]     ipMap ipTraffic[color=#800080; ];[/color]    ipMapIter iter[color=#800080; ];[/color]    int pos[color=#808030; ]=[/color][color=#008c00; ]0[/color][color=#800080; ];[/color]    char buf[color=#808030; ][[/color][color=#008c00; ]256[/color][color=#808030; ]][/color][color=#800080; ];[/color] [color=#696969; ]// Ненавижу buffer overflows :D[/color]     char proto[color=#808030; ][[/color][color=#008c00; ]6[/color][color=#808030; ]][/color][color=#800080; ];[/color] [color=#696969; ]// Ненавижу buffer overflows :D[/color]    char src[color=#808030; ][[/color][color=#008c00; ]16[/color][color=#808030; ]][/color][color=#800080; ];[/color] [color=#696969; ]// Ненавижу buffer overflows :D[/color]    char src_port[color=#808030; ][[/color][color=#008c00; ]16[/color][color=#808030; ]][/color][color=#800080; ];[/color] [color=#696969; ]// Ненавижу buffer overflows :D[/color]    char dst[color=#808030; ][[/color][color=#008c00; ]16[/color][color=#808030; ]][/color][color=#800080; ];[/color] [color=#696969; ]// Ненавижу buffer overflows :D[/color]    char dst_port[color=#808030; ][[/color][color=#008c00; ]16[/color][color=#808030; ]][/color][color=#800080; ];[/color] [color=#696969; ]// Ненавижу buffer overflows :D[/color]       int sent[color=#800080; ];[/color]    int [color=#008484; ]recv[/color][color=#800080; ];[/color]    unsigned int ip[color=#800080; ];[/color]    int ip_b1[color=#808030; ],[/color]ip_b2[color=#808030; ],[/color]ip_b3[color=#808030; ],[/color]ip_b4[color=#800080; ];[/color]     FILE[color=#808030; ]*[/color] fp[color=#808030; ]=[/color]fopen[color=#808030; ]([/color][color=#0000e6; ]"03-05-any.txt"[/color][color=#808030; ],[/color][color=#0000e6; ]"r"[/color][color=#808030; ])[/color][color=#800080; ];[/color]    while[color=#808030; ]([/color][color=#808030; ]![/color]feof[color=#808030; ]([/color]fp[color=#808030; ])[/color][color=#808030; ])[/color]    [color=#800080; ]{[/color]        fgets[color=#808030; ]([/color]buf[color=#808030; ],[/color][color=#008c00; ]254[/color][color=#808030; ],[/color]fp[color=#808030; ])[/color][color=#800080; ];[/color]        [color=#696969; ]// Разберём строку[/color]        fscanf[color=#808030; ]([/color]fp[color=#808030; ],[/color] [color=#0000e6; ]"[/color][color=#0f69ff; ]%s[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%s[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%s[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%s[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%s[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%d[/color][color=#0000e6; ] [/color][color=#0f69ff; ]%d[/color][color=#0000e6; ]"[/color][color=#808030; ],[/color] proto[color=#808030; ],[/color] src[color=#808030; ],[/color] src_port[color=#808030; ],[/color] dst[color=#808030; ],[/color] dst_port[color=#808030; ],[/color] [color=#808030; ]&[/color]sent[color=#808030; ],[/color] [color=#808030; ]&[/color][color=#008484; ]recv[/color][color=#808030; ])[/color][color=#800080; ];[/color]        if[color=#808030; ]([/color][color=#008484; ]recv[/color] [color=#808030; ]&[/color][color=#808030; ]&[/color] strstr[color=#808030; ]([/color]dst[color=#808030; ],[/color][color=#0000e6; ]"."[/color][color=#808030; ])[/color][color=#808030; ]>[/color][color=#008c00; ]0[/color][color=#808030; ])[/color]        [color=#800080; ]{[/color]              ipTraffic[color=#808030; ][[/color]dst[color=#808030; ]][/color] [color=#808030; ]+[/color][color=#808030; ]=[/color] [color=#008484; ]recv[/color][color=#800080; ];[/color]        [color=#800080; ]}[/color]    [color=#800080; ]}[/color]    fclose[color=#808030; ]([/color]fp[color=#808030; ])[/color][color=#800080; ];[/color]     [color=#696969; ]// В gcc map уже сортирован[/color]       fp[color=#808030; ]=[/color]fopen[color=#808030; ]([/color][color=#0000e6; ]"cpp.txt"[/color][color=#808030; ],[/color][color=#0000e6; ]"w"[/color][color=#808030; ])[/color][color=#800080; ];[/color]     for[color=#808030; ]([/color]int iter[color=#808030; ]=[/color]ipTraffic[color=#808030; ].[/color]begin[color=#808030; ]([/color][color=#808030; ])[/color][color=#800080; ];[/color] iter [color=#808030; ]![/color][color=#808030; ]=[/color] ipTraffic[color=#808030; ].[/color]end[color=#808030; ]([/color][color=#808030; ])[/color][color=#800080; ];[/color] iter[color=#808030; ]+[/color][color=#808030; ]+[/color][color=#808030; ])[/color]    [color=#800080; ]{[/color]        fprintf[color=#808030; ]([/color]fp[color=#808030; ],[/color][color=#0000e6; ]"[/color][color=#0f69ff; ]%s[/color][color=#0000e6; ]: [/color][color=#0f69ff; ]%u[/color][color=#0f69ff; ]\n[/color][color=#0000e6; ]"[/color][color=#808030; ],[/color][color=#808030; ]([/color]char [color=#808030; ]*[/color][color=#808030; ])[/color]iter[color=#808030; ].[/color]first[color=#808030; ].[/color]c_str[color=#808030; ]([/color][color=#808030; ])[/color][color=#808030; ],[/color] iter[color=#808030; ].[/color]second[color=#808030; ])[/color][color=#800080; ];[/color]    [color=#800080; ]}[/color]     fclose[color=#808030; ]([/color]fp[color=#808030; ])[/color][color=#800080; ];[/color] [color=#800080; ]}[/color] 
[span class='postcolor']



Не проверял, но работать должна. Сортировать ничего не надо, потому как в map обычно уже встроены rb-trees, и все ключи отсортированы в восходящем порядке.

PS: ЛИчно я предпочитаю AVL-trees вместо RB-trees

Быть или не быть?!
Вот только у кого спросить?!
 
Это сообщение редактировалось 30.05.2003 в 17:09
+
-
edit
 

Balancer

администратор
★★★★★
Ох, блин, повешусь я с этой раскраской... Пошёл зарбираться :)
 
+
-
edit
 

Balancer

администратор
★★★★★
>Вот вариант

Блин. Ничего не понимаю. В моих примерах с раскраской всё ок. :( Сейчас из IE попробую.
 
+
-
edit
 

Balancer

администратор
★★★★★


Так и не понял, с чего его заглючило. Может, с того, что [code] блок в визуальном редакторе в италике оказался... Муть какая-то... Ладно, разберусь ещё. Пока - так поправил.


ComputerMage>   char buf[256]; // Ненавижу buffer overflows :D


А что делать... C++... :) А делать на каждой итерации new/delete... Глядишь, ещё и тормознее, чем на Perl выйдет :D


>Не проверял, но работать должна. Сортировать ничего не надо, потому как в map обычно уже встроены rb-trees, и все ключи отсортированы в восходящем порядке.


Нужна сортировка по значению и в убывающем порядке :)
 
US ComputerMage #30.05.2003 20:30
+
-
edit
 

ComputerMage

втянувшийся



>Так и не понял, с чего его заглючило. Может, с того, что [code] блок в визуальном редакторе в италике оказался... Муть какая-то... Ладно, разберусь ещё. Пока - так поправил.


ComputerMage>   char buf[256]; // Ненавижу buffer overflows :D


А что делать... C++... :) А делать на каждой итерации new/delete... Глядишь, ещё и тормознее, чем на Perl выйдет :D


>Не проверял, но работать должна. Сортировать ничего не надо, потому как в map обычно уже встроены rb-trees, и все ключи отсортированы в восходящем порядке.


Кстати, скачай Thinking in C++ с http://www.bruceeckel.com рекомендую второй том, очень хорошо STL и design patterns расписаны. Я его иногда как справочник использую.


Нужна сортировка по значению и в убывающем порядке :)



Можно сделать через algorithm'овый sort:


[/span]
CODE
Created with colorer-take5 library. Type 'cpp'    [color=#004a43; ]#[/color]include[color=#004a43; ] [/color][color=#0000e6; ]<algorithm>[/color]  sort [color=#808030; ]([/color] ipTraffic[color=#808030; ].[/color]begin[color=#808030; ]([/color][color=#808030; ])[/color][color=#808030; ],[/color] ipTraffic[color=#808030; ].[/color]end[color=#808030; ]([/color][color=#808030; ])[/color] [color=#808030; ])[/color][color=#800080; ];[/color]  [color=#696969; ]// если не отсортируется можно описать mySort и подать её на вход:[/color]  sort [color=#808030; ]([/color] ipTraffic[color=#808030; ].[/color]begin[color=#808030; ]([/color][color=#808030; ])[/color][color=#808030; ],[/color] ipTraffic[color=#808030; ].[/color]end[color=#808030; ]([/color][color=#808030; ])[/color][color=#808030; ],[/color] mySort [color=#808030; ])[/color][color=#800080; ];[/color]   
[span class='postcolor']
Быть или не быть?!
Вот только у кого спросить?!
 
+
-
edit
 

Mishka

модератор
★★★
А зачем сортировать? Возьми reverse_iterator и делай в обратном порядке

[/span]
CODE
Created with colorer-take5 library. Type 'cpp'    for[color=#808030; ]([/color]ipMap[color=#808030; ]:[/color][color=#808030; ]:[/color]reverse_iterator iter[color=#808030; ]=[/color]ipTraffic[color=#808030; ].[/color]rend[color=#808030; ]([/color][color=#808030; ])[/color][color=#800080; ];[/color] iter [color=#808030; ]![/color][color=#808030; ]=[/color] ipTraffic[color=#808030; ].[/color]rbegin[color=#808030; ]([/color][color=#808030; ])[/color][color=#800080; ];[/color] iter[color=#808030; ]-[/color][color=#808030; ]-[/color][color=#808030; ])[/color]   [color=#800080; ]{[/color]       fprintf[color=#808030; ]([/color]fp[color=#808030; ],[/color][color=#0000e6; ]"[/color][color=#0f69ff; ]%s[/color][color=#0000e6; ]: [/color][color=#0f69ff; ]%u[/color][color=#0f69ff; ]\n[/color][color=#0000e6; ]"[/color][color=#808030; ],[/color][color=#808030; ]([/color]char [color=#808030; ]*[/color][color=#808030; ])[/color]iter[color=#808030; ].[/color]first[color=#808030; ].[/color]c_str[color=#808030; ]([/color][color=#808030; ])[/color][color=#808030; ],[/color] iter[color=#808030; ].[/color]second[color=#808030; ])[/color][color=#800080; ];[/color]   [color=#800080; ]}[/color] 
[span class='postcolor']

Здесь можно много чего найти - это страничка поддерживаемая Степановым - http://www.sgi.com/tech/stl/.

А понял, не по ключу, а по значению - пардон за пример
 

BrAB

аксакал
★★
Надеюсь не пройдёте мимо....

Вообщем красотой реализации на перле восхищён. Но вот как решить чуть более сложную задачу - придумать не могу.

Есть лог вида

адрес_источника адрес_получателя объём_в_байтах

адресов получателей много - но число их конечно. вообщем нужно получить N таблиц (где N - число адресов получателей) как в примере Балансера, т. е. адрес источника - количество полученых байт.

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

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

Сергей-4030

исключающий третье
★★
Только тест не слишком удачный вышел. Если честно, я думал, что время обработки такого файла будет идти на минуты и у Perl/PHP и C++. Оказалось - слишком просто
 


Есть такое мнение, что после выкидывания регэкспов (для неинтерпретируемых языков, а также и для некоторых интерпретируемых) тестируем не эффективность кода, а transfer rate диска. :) Считать строку и пропарсить ее? Копейки. Найти в дереве ключ и если не нашли - добавить узел? Смешно. Надо глядеть в параметры HDD, имхо - там и результаты тестирования будут. ;)
 
+
-
edit
 

Balancer

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

Не совсем понятно, но если достаточно решения на Perl, то будет так (не тестировано):

code perl
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4.  
  5. my %bytes;
  6.  
  7. while(<>)
  8. {
  9.         $bytes{$2} += int($3) if /^(.+)\s+(.+)\s+(.+)/;
  10. }
  11.  
  12. for(sort keys %bytes)
  13. {
  14.         print "$_: $bytes{$_}\n";
  15. }


Файл подавать на вход скрипта через стандартный вход ("perl script_name.pl < data.log")
 

FR0

новичок
Вот вариант на C++:

code text
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <string>
  5. #include <vector>
  6. #include <map>
  7.  
  8. using namespace std;
  9. typedef pair<string, int> tp;
  10.  
  11. inline bool traffic_sort(const tp &t1, const tp &t2)
  12. {
  13. return t2.second < t1.second;
  14. }
  15.  
  16. int main()
  17. {
  18. string proto, src, src_port, dst, dst_port;
  19. map<string, int> traffic;
  20.  
  21. ifstream flog("data.log");
  22. stringstream line;
  23.  
  24. while(!flog.eof())
  25.  {
  26.  int sent = 0, recv = 0;
  27.  getline(flog, src);
  28.  if(src.find('.') != string::npos)
  29.   {
  30.   line.clear(); line.str(src);
  31.   line >> proto >> src >> src_port >> dst >> dst_port >> sent >> recv;
  32.   traffic[dst] += recv;
  33.   }
  34.  }
  35.  
  36. vector<tp> traffic_s(traffic.begin(), traffic.end());
  37. sort(traffic_s.begin(), traffic_s.end(), traffic_sort);
  38.  
  39. ofstream fres("cpp.txt");
  40. for(int i = 0; i < traffic_s.size(); ++i)
  41.  {
  42.  fres << traffic_s[i].first << ":  " << traffic_s[i].second << endl;
  43.  }
  44.  
  45. return 0;
  46. }


Немного исправил так как сначала не учел что могут быть строки неправильного формата и что учитывать надо только входящий трафик.
 
Это сообщение редактировалось 02.05.2005 в 14:38

FR0

новичок
Тоже на питоне:

code text
  1. traffic = {}
  2.  
  3. for line in open('data.log'):
  4.         if '.' in line:
  5.                 sline = line.split()
  6.                 if not traffic.has_key(sline[3]): traffic[sline[3]] = 0
  7.                 traffic[sline[3]] += int(sline[-1])
  8.  
  9. traffic_s = [(x, traffic[x]) for x in traffic]
  10. traffic_s.sort(lambda x, y: cmp(y[1], x[1]))
  11.  
  12. fres = open('python.txt', 'w')
  13. for i in traffic_s: fres.write("%s:  %i\n" % (i[0], i[1]))

 
+
-
edit
 

trainer

втянувшийся

Еще один вариант решения первоначальной задачи. Действительно чистый C++ :) Компилируется, но работоспособность не проверял. С учетом указанного выше замечания о наличии также строк другого формата работать правильно, вероятно, не будет - потребуется дополнительная обработка
#include
#include
#include
#include
#include
#ifdef _WIN32
 #include
#else
 #include
#endif

using namespace std;
// хранит данные IP и размер принятых данных
struct record {
   struct in_addr destination_ip;
   unsigned long incoming_size;
   // для сортировки(sort)
   bool operator      return ( incoming_size              ( destination_ip.S_un.S_addr    }
   // для поиска(find)
   bool operator==(const record& arg) const {
     return destination_ip.S_un.S_addr == arg.destination_ip.S_un.S_addr;
   }
};

typedef vector array;

// для ввода значений
istream& operator>>(istream& is, record& rec) {
   string protocol, src_addr_str, dest_addr_str;
   unsigned int src_port, dest_port, outcoming;

   is>>protocol>>src_addr_str>>src_port>>dest_addr_str>>dest_port>>outcoming>>rec.incoming_size;
   rec.destination_ip.S_un.S_addr = inet_addr(dest_addr_str.c_str());

   return is;
}
// для вывода результата
ostream& operator    return os }

// обработчик
class processor : private unary_function {
public:
   processor(array* arg) : data(arg) {;}
   void operator()(const record& rec) {
     array::iterator pos = find(data->begin(),data->end(),rec);
     if( pos != data->end() )
         pos->incoming_size += rec.incoming_size;
     else
         data->push_back(rec);
   }
private:
   array * data;
};

int main(int argc, char** argv) {
   ifstream input(argv[1]);
   ofstream output(argv[2]);
   array data;

   for_each(istream_iterator(input),istream_iterator(),processor(&data));
   sort(data.begin(),data.end());
   copy(data.rbegin(),data.rend(),ostream_iterator(output));
}
Вместо vector можно использовать и list или map
Во имя Ctrl, Alt и святаго Del. Enter!
 
Это сообщение редактировалось 02.05.2005 в 20:55

FR0

новичок
trainer> Еще один вариант решения первоначальной задачи. Действительно чистый C++ :)

Проще надо :)
 

в начало страницы | новое
 
1918: С Днём советской армии и военно-морского флота! (100 лет).
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru