LINUX.ORG.RU

Тестирование скорости выполнения sysread в зависимости от разовой порции данных


0

0

Я создал большой бинарный файл (134Мб) и решил найти закономерность - 
скорость чтения в зависимости от размера разовой порции.

Читающий скрипт
#!/usr/local/LAST/bin/perl
use strict;
use Time::Stopwatch;
 
my $size = @ARGV[0];
open FD,"<","1.bin" or die "Couldn't open file";
my $buf="";
my $buff="";
tie my $timer, 'Time::Stopwatch';
while (sysread(FD,$buff,$size))
{
  $buf .=$buff;
  $buff = "";
}
print "Len = " . length($buf) . " time = $timer \n";

Тестирующая обёртка
#!/usr/local/LAST/bin/perl
for (my $i=1000;$i<10000;$i+=1000)
{
   `echo "*********** $i ****************" >> log`;
   `./BinRead.pl $i >> log`;
   `./BinRead.pl $i >> log`;
   `./BinRead.pl $i >> log`;
}


А вот и результаты

*********** 1000 ****************
Len = 134184960 time = 1.44458103179932
Len = 134184960 time = 5.34793496131897
Len = 134184960 time = 12.9632449150085
*********** 2000 ****************
Len = 134184960 time = 12.9896860122681
Len = 134184960 time = 8.19250202178955
Len = 134184960 time = 2.76202511787415
*********** 3000 ****************
Len = 134184960 time = 6.86614799499512
Len = 134184960 time = 5.87107181549072
Len = 134184960 time = 24.3561189174652
*********** 4000 ****************
Len = 134184960 time = 10.9215641021729
Len = 134184960 time = 2.31534290313721
Len = 134184960 time = 7.81663918495178
*********** 5000 ****************
Len = 134184960 time = 2.64392805099487
Len = 134184960 time = 3.43289399147034
Len = 134184960 time = 6.88873481750488
*********** 6000 ****************
Len = 134184960 time = 4.62800908088684
Len = 134184960 time = 11.0599589347839
Len = 134184960 time = 6.89057993888855
*********** 7000 ****************
Len = 134184960 time = 7.4300639629364
Len = 134184960 time = 10.491378068924
Len = 134184960 time = 9.54563808441162
*********** 8000 ****************
Len = 134184960 time = 7.39949584007263
Len = 134184960 time = 7.56769704818726
Len = 134184960 time = 6.46512794494629
*********** 9000 ****************
Len = 134184960 time = 8.31921887397766
Len = 134184960 time = 10.0672011375427
Len = 134184960 time = 8.81646490097046


По ним то и вопросы
1) Почему в рамках одной порции настолько разные результаты
2) Какова в теории зависимость скорости от размера порции

P.S.
Может я провёл эксперимент неправильно?

Ответ на: комментарий от cvv

>потому что есть такое понятие как кеширование

Из результатов видно, что если кэширование и есть, то работает
оно по совершенно непонятному принципу (не работает т.е.)

Krivenok_Dmitry
() автор топика

тест не совсем корректен :
1) внутри цикла измерения есть оператор .=
   время исполнения которого мягко говоря плавает
2) (по следам первого) измерять надо только sysread
3) все измерения - проводить в отдельной функции,
   чтобы она была уже считанна в память (неплохо её один раз исполнить)
  (иначе при первом проходе результаты сбивает парсер)
4) последовательность измерений при разных параметрах - проводить
  в одном скрипте, чтобы не накладывалсь шумы от exec из внешнего шела.
etc etc

MKuznetsov ★★★★★
()

Несколько непонятно, что же именно ты тестируешь :-/
Судя по скрипту твоя задача - прочитать файл целиком в память
в буфер $buf.
Из общих соображений самый быстрый метод для этого:
sysread(FD,$buf,<размер-всего-файла>)
То есть сделать sysread() всего один раз. Таким образом ты избавишь
perl от постоянного выделения/копирования памяти (в $buf.=$buff)
и (скорее всего) perl сделает всего один вызов read(2).
Непонятно, зачем вообще вся эта возня с начитыванием по кусочкам -
ты что, попробовал вариант с одним sysread() и он тебя чем-то не
устроил?
На предмет того, как узнать размер файла - perldoc -f stat или
perldoc File::stat (стандартный модуль)

Еще несколько замечаний:
1. Используй use warnings или -w.

2. Очевидно, вместо $size = @ARGV[0] ты имел ввиду $size = $ARGV[0]
(если бы ты сказал use warnings то получил бы предупреждение):
Scalar value @ARGV[0] better written as $ARGV[0] at ./r.pl line 6

3. Не используй обратные кавычки (backticks) `` в void контексте.
Повтыкай в FAQ:
$ perldoc -q backticks
Found in /usr/lib/perl5/5.8.5/pod/perlfaq8.pod
What's wrong with using backticks in a void context?
.........

Короче - в целом неплохо, use strict используешь, читай доки и учись
толково формулировать вопросы. "Чтобы задать правильный вопрос, надо
знать половину ответа" (C)

HTH

Onanim
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.