文件修改时间检查的成本

doc*_*_id 12 php performance filemtime

对于Linux下包含少量字节的文件,我只需要处理自上次处理以来它被更改的时间.我通过clearstatcache(); filemtime();定期调用PHP来检查文件是否已更改.由于整个文件总是很小,因此删除对filemtime的调用并通过将内容与过去的内容进行比较来检查文件更改是否会提高性能?或者就性能而言,最好的方法是什么.

Geo*_*Geo 13

使用 filemtime + clearstatcache

为了增强@ Ben_D的测试:

<?php

$file = 'small_file.html';
$loops = 1000000;

// filesize (fast)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
    $file_size = filesize($file);
}
$end_time = microtime(1);
$time_for_file_size = $end_time - $start_time;

// filemtime (fastest)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
    $file_mtime = filemtime($file);
}
$end_time = microtime(1);
$time_for_filemtime = $end_time - $start_time;

// filemtime + no cache (fast and reliable)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
    clearstatcache();
    $file_mtime_nc = filemtime($file);
}
$end_time = microtime(1);
$time_for_filemtime_nc = $end_time - $start_time;

// file_get_contents  (slow and reliable)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
    $file_contents = file_get_contents($file);
}
$end_time = microtime(1);
$time_for_file_get_contents = $end_time - $start_time;

// output
echo "
<p>Working on file '$file'</p>
<p>Size: $file_size B</p>
<p>last modified timestamp: $file_mtime</p>
<p>file contents: $file_contents</p>

<h1>Profile</h1>
<p>filesize: $time_for_file_size</p>
<p>filemtime: $time_for_filemtime</p>
<p>filemtime + no cache: $time_for_filemtime_nc</p>
<p>file_get_contents: $time_for_file_get_contents</p>";

/* End of file */
Run Code Online (Sandbox Code Playgroud)

结果

  • 请注意,您只需要调用`clearstatcache();`如果您在同一请求期间需要多次**来自同一文件的新的`filemtime`信息**(并且如果可能的话,可能会修改文件)请求).请求完成后,`filemtime`缓存会丢失. (10认同)

Ben*_*n D 7

我知道我迟到了,但是一点点基准测试从不会影响讨论.即使在你考虑比较步骤之前,Brian Roach的直觉证明了声音:

考试:

$file = "small_file.html";
$file_size = filesize($file);

//get the filemtime 1,000,000 times
$start_time = microtime(true);
for($i=0;$i<1000000;$i++){
    $set_time = filemtime($file);
}
$end_time = microtime(true);

$time_for_filemtime = ($end_time-$start_time);

//get the time for file_get_contents 1,000,000 times
$start_time = microtime(true);
$file = "small_file.html";
for($i=0;$i<1000000;$i++){
    $set_time = file_get_contents($file);
}
$end_time = microtime(true);

$time_for_file_get_contents = ($end_time-$start_time);

echo "<p>Working on a file that is $file_size B long</p>
<p>filemtime: $time_for_filemtime vs file_get_contents: $time_for_file_get_contents";
Run Code Online (Sandbox Code Playgroud)

结果

处理长度为41 B的文件

filemtime:0.36287999153137 vs file_get_contents:16.191468000412

没有任何震惊:"向文件系统询问一些元数据"比"打开文件,读取文件并比较内容"要快.

  • 你没有调用`clearstatcache();`所以`filemtime`返回缓存的结果...... (6认同)