Forum Webscript.Ru

Программирование => Perl => Тема начата: Дерево познания от 25 Сентября 2003, 22:17:56

Название: Как копировать файлы?
Отправлено: Дерево познания от 25 Сентября 2003, 22:17:56
Как копировать файлы на перле? ну из каталога в каталог ессно :)
Название: Как копировать файлы?
Отправлено: Yaroslav от 26 Сентября 2003, 00:17:35
используй - system
Название: Как копировать файлы?
Отправлено: ondr от 26 Сентября 2003, 10:57:46
ни в коем случае не используй system для этого!
используй File::Copy
Название: Как копировать файлы?
Отправлено: NeoNox от 26 Сентября 2003, 10:58:05
Yaroslav
Как думаеш под всеми осями `cp` будет так как надо работать?
Дерево познания
perldoc File::Copy
Название: Как копировать файлы?
Отправлено: Yaroslav от 26 Сентября 2003, 12:46:07
Цитировать
NeoNox:
Yaroslav
Как думаеш под всеми осями `cp` будет так как надо работать?

не под всеми, но если работает, то даже у меня в книге  (Перл от Шварца) настоятельно рекомендуется :)
Название: Как копировать файлы?
Отправлено: ondr от 26 Сентября 2003, 12:52:17
Цитировать
Yaroslav:
не под всеми, но если работает, то даже у меня в книге (Перл от Шварца) настоятельно рекомендуется


1. Порождение процессов затормаживает выполнение скрипта.
2. Никогда не ориентируйся по одной книге. Прочитай несколько, составь свое мнение, думай логически.

ps: Да, и Perl все таки не от Шварца, он от Ларри :D
Название: Как копировать файлы?
Отправлено: NeoNox от 26 Сентября 2003, 12:55:06
Цитировать
Yaroslav:
даже у меня в книге (Перл от Шварца) настоятельно рекомендуется

Не верю в такую очевидную глупость.
Название: Как копировать файлы?
Отправлено: NeoNox от 26 Сентября 2003, 12:56:12
ondr cp будет быстрее File::Copy
будет время проверь.
Название: Как копировать файлы?
Отправлено: ondr от 26 Сентября 2003, 14:36:51
NeoNox

Вот, выбрал немного времени и провел небольшой тест.

Копирование 16 файлов, ~24KB

`cp` - 0.0616369247436523
File::Copy - 0.00580298900604248

Копирование 7 файлов, ~84MB

`cp` - 8.02530705928802
File::Copy - 8.39757001399994

Копирование 1 файла, ~284MB

`cp` - 31.0670880079269
File::Copy - 31.488056063652

При тестировании не учитывалось время загрузки модулей.
Машина Duron650/256/винт IDE 5400rpm, Linux RH7.2

Вывод: Дисковая подсистема далека от совершенства :D и не поспевает за обработкой, это видно на копировании больших файлов. В случае же с большим количеством маленьких файлов, межпроцессное взаимодейтвие напрочь портит всю картину.
Название: Как копировать файлы?
Отправлено: NeoNox от 26 Сентября 2003, 15:15:25
У меня совершенно другие результаты
cp везде выигрывает
причем раза в полтора-два
Название: Как копировать файлы?
Отправлено: ondr от 26 Сентября 2003, 15:27:52
Факт - штука упрямая. Тут трудно о чем то спорить...

Вот на всякий случай выложу скрипты:
http://t1.web39.net/test1.pl.txt
http://t1.web39.net/test2.pl.txt

Возможно результаты расходятся, т.к. я запускал "cp" для каждого файла, а не в совокупности...
Название: Как копировать файлы?
Отправлено: NeoNox от 26 Сентября 2003, 15:44:23
Посмотри что у тебя получится
#!/usr/bin/perl
use Benchmark;
use File::Copy;

$t = new Benchmark;
`cp ./* ./test/`;
$t1 = new Benchmark;
$td = timediff($t1,$t);
print "the code with \'cp\' took".timestr($td)."\\n";

$t = new Benchmark;
@files = `ls`;
foreach (@files){
chomp;
copy ("./$_", "./test1/$_")
}
$t1 = new Benchmark;
$td1 = timediff($t1,$t);
print "the code with \'File::Copy\' took".timestr($td1)."\\n";
Название: Как копировать файлы?
Отправлено: ondr от 26 Сентября 2003, 16:00:39
the code with \'cp\' took 1 wallclock secs ( 0.00 usr  0.00 sys +  0.00 cusr  0.13 csys =  0.13 CPU)
the code with \'File::Copy\' took 0 wallclock secs ( 0.01 usr +  0.00 sys =  0.01 CPU)

однако вот :)
7 MB 33 файла
Название: Как копировать файлы?
Отправлено: Yaroslav от 26 Сентября 2003, 16:02:02
Цитировать
ondr:
ps: Да, и Perl все таки не от Шварца, он от Ларри

"Изучаем Перл" Рэндал Л.Шварц, Том Кристиан (перевод Тимачева)
Цитировать
NeoNox:
Не верю в такую очевидную глупость.

- Применение в функции system списка, а не одной строки, экономит также один процесс shell, поэтому поступайте так при любой возможности.
Название: Как копировать файлы?
Отправлено: NeoNox от 26 Сентября 2003, 16:05:22
ondr
мдя
запусти раза 3-4
Yaroslav
я уже сказал почему ето неправилно
Название: Как копировать файлы?
Отправлено: ondr от 26 Сентября 2003, 16:21:31
Сорри. Забыл создать каталог "test1".

the code with \'cp\' took 6 wallclock secs ( 0.00 usr  0.00 sys +  0.00 cusr  1.76 csys =  1.76 CPU)
the code with \'File::Copy\' took14 wallclock secs ( 0.03 usr +  1.71 sys =  1.74 CPU)

94Мб 38 файлов

Тут то все понятно. Совокупность файлов "cp" значит быстрее выполняет.