LinuxForum.Fans
Тема

grep sed perl awk - что быстрее для простых выборок

Автор: valet 32 сообщений 9055 просмотров
#305692

Fat-Zer, какая версия Python у тебя? И какая у valet?
3.2 медленнее 2.7, 3.3 чуть медленнее 2.7.

UPD. Ага, уже указал...

ЗЗЫ. Хм, у меня Python отрабатывает быстрее Go.

#305726

Кстати, возник такой вопрос. Как организовать многопоточное построчное чтение текстового файла?

#305736
"-=Serj=-" написал:
Кстати, возник такой вопрос. Как организовать многопоточное построчное чтение текстового файла?

самое простое, что приходит на ум: mmap'ишь, первый поток читает с начала, второй — тычется в середину, находит конец строки и читает оттуда...

ИРЛ это даёт профит только если чтение с диска не требуется... так что отдельного потока чтения будет даже лучше в большинстве задач...

#305745
text
valet@valet-comp:~/Documents/all$ time ./go-grep foo all > /dev/null 

real 0m10.354s user 0m10.221s sys 0m0.124s valet@valet-comp:~/Documents/all$ time ./go-grep2 foo all > /dev/null

real 0m6.957s user 0m6.852s sys 0m0.100s

Совсем как-то медленно, че-то этот GO не очень...

Fat-Zer, спасибо за результаты - интересно.

По поводу версий:

Показать
text
valet@valet-comp:~/Documents/all$ grep --version
GNU grep 2.6.3

Copyright (C) 2009 Free Software Foundation, Inc. Лицензия GPLv3+: GNU GPL версии 3 или новее <http://gnu.org/licenses/gpl.html> Это свободное ПО: вы можете продавать и распространять его. Нет НИКАКИХ ГАРАНТИЙ до степени, разрешённой законом.

valet@valet-comp:~/Documents/all$ perl --version

This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi (with 59 registered patches, see perl -V for more detail)

Copyright 1987-2009, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page.

valet@valet-comp:~/Documents/all$ awk --version GNU Awk 3.1.7 Copyright (C) 1989, 1991-2009 Free Software Foundation.

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. valet@valet-comp:~/Documents/all$ sed --version GNU sed версия 4.2.1 Copyright (C) 2009 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law.

GNU sed home page: <http://www.gnu.org/software/sed/>. General help using GNU software: <http://www.gnu.org/gethelp/>. E-mail bug reports to: <bug-gnu-utils@gnu.org>. Be sure to include the word ``sed'' somewhere in the ``Subject:'' field. valet@valet-comp:~/Documents/all$ python --version Python 2.6.6 valet@valet-comp:~/Documents/all$

И все таки - почему же grep явный лидер, что там код настолько кардинально лучше написан, что оно выигрывает. В чем секрет?

#305746

"-=Serj=-" написал:
Кстати, возник такой вопрос. Как организовать многопоточное построчное чтение текстового файла?
xargs, не?
#305757
"valet" написал:
По поводу версий:

awk за три года всё же улучшили, видимо...

"valet" написал:
И все таки - почему же grep явный лидер, что там код настолько кардинально лучше написан, что оно выигрывает. В чем секрет?

просто он только и умеет, что искать строчки....

из явных отличий:
grep читает из файла по 32к блоками, а остальные(кроме питона) 4к-страницами....
скорей всего это из-за того, что sedperlawk читает через stdio'шные средства, а не системные... соответственно отсюда не меньше, чем 2-й оверхед при чтении..

за остальным - надо исходники курить... мне лень...

#305760

"Fat-Zer" написал:
awk за три года всё же улучшили, видимо...
может, у меня искаропки, не менял. Но у тебя же тоже он скоростью не выделяется.

"Fat-Zer" написал:
за остальным - надо исходники курить... мне лень...
Это понятно. Не знаю как кто, но я почему-то думал, что из всех этих grep самый медленный, просто его все юзают потому что он самый удобный, ошибался....
#305850
"Fat-Zer" написал:
ИРЛ это даёт профит только если чтение с диска не требуется...

Просто для эксперимента оставил в варианте на Python и GO только построчное чтение файла, дык GO оказался в несколько раз медленнее...

"Fat-Zer" написал:
так что отдельного потока чтения будет даже лучше в большинстве задач...

"Одного" ты хотел сказать?
Погуглив, выяснил, что GO быстрее работает со срезами байтов, чем со строками.

text

package main

import ( "bufio" "fmt" "os" "regexp" )

func main() {

if len(os.Args) != 3 { fmt.Printf("Usage: %s <substring> <filename>\n", os.Args[0]) return } substr := os.Args[1] fname := os.Args[2]

f, err := os.Open(fname) if err != nil { return } defer f.Close()

r := bufio.NewReader(f) patt, _ := regexp.Compile(substr)

for {

s, ok := r.ReadSlice('\n') if ok != nil { break } matches := patt.Match(s) if matches { fmt.Print(string(s)) }

}

}

Этот вариант в полтора раза быстрее... По скорости чтения слегка обошёл Python. Теперь затык в регулярке.

#305878

Про awk'и:
Есть несколько реализаций awk, которые принципиально отличаются по скорости.
Например на чтении 300МБ файла (1.5млн строк, источник) разница примерно следующая:
gawk - 0m1.871s
mawk - 0m0.469s

#306002
"Civil" написал:
Есть несколько реализаций awk, которые принципиально отличаются по скорости.
Например на чтении 300МБ файла (1.5млн строк, источник) разница примерно следующая:

это то понятно... меня удивило, что между гнутыми 3-м и 4-м разница в 4 раза получается...

#306061

Это тоже бывает. Для некоторых версий awk'а сильно помогает сказать LC_ALL="C", например.

#306118

"Civil" написал:
Для некоторых версий awk'а сильно помогает сказать LC_ALL="C", например.
зачем искать костыли, если и так четко видно что для данной задачи этот инструмент не подходит, так как выполняет ее в разы медленнее.
Войдите или зарегистрируйтесь, чтобы ответить.