ivank
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору alexei Я просил написать код для вот такой задачки: Цитата: скрипт для "сортировки по пятому полю текстого файла с 10000 записей, где записи разделены переносом строки, а поля "|". И шлавное, что бы этот код рабтал быстрее чем ПХПшный (мой вариант) более чем на 10%... | Подготавливаем инфу в prepare.php: Код: <? $text = 'A typical post, a little bit longer... Like that<br>'; for( $i = 0; $i < 4; ++$i ) $text .= $text; $fp = fopen( 'data.txt', 'w' ); for( $i = 0; $i < 10000; ++$i ) { $line = time().'|ivank|Topic title|'.$text.'|'.rand( 0, 10000 )."\n"; fwrite( $fp, $line ); } fclose( $fp ); ?> | Затем, сортировка на PHP: Код: <? $start = getmicrotime(); $data = file( 'data.txt' ); $indicies = array(); foreach( $data as $id=>$line ) { $line = explode( '|', $line, 5 ); $indicies[ $id ] = $line[4]; } asort( $indicies, SORT_NUMERIC ); $fp = fopen( 'sorted_data.txt', 'w' ); foreach( $indicies as $id=>$cur ) fwrite( $fp, $data[$id] ); fclose( $fp ); echo getmicrotime() - $start; function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); return (float)$usec + (float)$sec; } ?> | Средний результат после пяти запусков: 7 секунд Вариант номер один перле (тормозной): Код: <? $start = getmicrotime(); $data = file( 'data.txt' ); $indicies = array(); foreach( $data as $id=>$line ) { $line = explode( '|', $line, 5 ); $indicies[ $id ] = $line[4]; } asort( $indicies, SORT_NUMERIC ); $fp = fopen( 'sorted_data.txt', 'w' ); foreach( $indicies as $id=>$cur ) fwrite( $fp, $data[$id] ); fclose( $fp ); echo getmicrotime() - $start; function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); return (float)$usec + (float)$sec; } ?> | Средний результат после пяти запусков -- 17 wallclock seconds. Вариант на Перле, попытка номер два (побыстрей): Код: use Benchmark; $start = new Benchmark; open( FILE, 'data.txt' ); @data = <FILE>; close( FILE ); @indicies = (); foreach $line( @data ) { ($trash, $trash, $trash, $trash, $key ) = split( /\|/, $line ); push @indicies, $key; } # Откомментированный кусок, и кусок следующий за ним. Работают с одинаковой # скоростью. #@new = @data[ sort { # $indicies[$a] <=> $indicies[$b] # } 0..$#data # ]; # open( FILE, '>sorted_data.txt' ); # foreach $line( @new ) # { # print FILE $line; # } # close( FILE ); @indicies = sort { $a <=> $b } @indicies; open( FILE, '>sorted_data.txt' ); foreach $index ( @indicies ) { print FILE $data[$index]; } close( FILE ); $end = new Benchmark; $td = timestr( timediff( $end, $start ) ); print $td; | Средний результат: семь. Так что робяты: где я не прав? (Хинт: я перла не знаю, так что где-нить уж точно ашипся...)
| Всего записей: 553 | Зарегистр. 24-01-2002 | Отправлено: 21:11 22-06-2002 | Исправлено: ivank, 21:15 22-06-2002 |
|