Forum Webscript.Ru
Программирование => Perl => Тема начата: Дерево познания от 25 Сентября 2003, 22:17:56
-
Как копировать файлы на перле? ну из каталога в каталог ессно :)
-
используй - system
-
ни в коем случае не используй system для этого!
используй File::Copy
-
Yaroslav
Как думаеш под всеми осями `cp` будет так как надо работать?
Дерево познания
perldoc File::Copy
-
NeoNox:
Yaroslav
Как думаеш под всеми осями `cp` будет так как надо работать?
не под всеми, но если работает, то даже у меня в книге (Перл от Шварца) настоятельно рекомендуется :)
-
Yaroslav:
не под всеми, но если работает, то даже у меня в книге (Перл от Шварца) настоятельно рекомендуется
1. Порождение процессов затормаживает выполнение скрипта.
2. Никогда не ориентируйся по одной книге. Прочитай несколько, составь свое мнение, думай логически.
ps: Да, и Perl все таки не от Шварца, он от Ларри :D
-
Yaroslav:
даже у меня в книге (Перл от Шварца) настоятельно рекомендуется
Не верю в такую очевидную глупость.
-
ondr cp будет быстрее File::Copy
будет время проверь.
-
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 и не поспевает за обработкой, это видно на копировании больших файлов. В случае же с большим количеством маленьких файлов, межпроцессное взаимодейтвие напрочь портит всю картину.
-
У меня совершенно другие результаты
cp везде выигрывает
причем раза в полтора-два
-
Факт - штука упрямая. Тут трудно о чем то спорить...
Вот на всякий случай выложу скрипты:
http://t1.web39.net/test1.pl.txt
http://t1.web39.net/test2.pl.txt
Возможно результаты расходятся, т.к. я запускал "cp" для каждого файла, а не в совокупности...
-
Посмотри что у тебя получится
#!/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";
-
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 файла
-
ondr:
ps: Да, и Perl все таки не от Шварца, он от Ларри
"Изучаем Перл" Рэндал Л.Шварц, Том Кристиан (перевод Тимачева)
NeoNox:
Не верю в такую очевидную глупость.
- Применение в функции system списка, а не одной строки, экономит также один процесс shell, поэтому поступайте так при любой возможности.
-
ondr
мдя
запусти раза 3-4
Yaroslav
я уже сказал почему ето неправилно
-
Сорри. Забыл создать каталог "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" значит быстрее выполняет.