Почему время выполнения моего Perl-кода изменяется так широко? - PullRequest
1 голос
/ 27 октября 2011

Я обнаружил, что следующий Perl-код выполняется с удивительно изменяющимися скоростями, иногда быстрыми, иногда очень медленными.У меня есть несколько папок, содержащих десятки тысяч файлов, через которые мне нужно выполнить этот код.Я запускаю это на cygwin с windows 7. Интересно, может кто-нибудь помочь мне ускорить его или, как минимум, выяснить, почему скорость меняется.Мой процессор и память должны быть обильными во всех этих ситуациях.

внешний цикл для перебора списка $ dir's

opendir(DIR, $dir);
@all=readdir(DIR);
@files = (0..$#all);
$i=-1;
foreach $current (@all){     
    if (-f "$dir/$current") {
        $files[++$i]=$current;
    }
}
push @Allfiles,@files[0..$i];
closedir(DIR);

Ответы [ 2 ]

7 голосов
/ 27 октября 2011

Вы, вероятно, связаны с вводом / выводом, поэтому изменения в вашем коде, вероятно, не повлияют на общее время выполнения - время выполнения будет зависеть от того, находятся ли записи каталога в кэше или нет.

Но ваш код использует временные массивы без веской причины, слишком много оперативной памяти, если каталоги очень большие. Вы можете упростить это до:

opendir(DIR, $dir);
while (my file = readdir(DIR)) {
    push @Allfiles, $file if (-f "$dir/$file");
}
closedir(DIR);

Нет временных массивов.

4 голосов
/ 27 октября 2011

Если в первый раз вы работаете медленно и быстро после этого, тогда проблема в том, что ваша система кэширует чтения. При первом запуске кода данные должны быть считаны с вашего диска. После этого данные все еще кэшируются в оперативной памяти. Если вы подождете достаточно долго, кэш будет очищен, и вам придется снова нажимать на диски.

Или иногда вы можете одновременно выполнять другие задачи, требующие большого количества диска, но не в другое время при запуске кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...