创建vs复制空文件,哪个操作最便宜?

时间:2012-02-08 15:51:16

标签: php

哪种方法在服务器上最便宜?我正在动态创建目录,并希望每个目录都包含一个空的html文件。还有一个衡量差异的方法呢?

$file = text.html;
$newDest = myDir/text.html;
copy($file, $newDest);

VS

$File = "myDir/text.html"; 
$Handle = fopen($File, 'w');
$Data = ''; 
fwrite($Handle, $Data);  
print "Data Written"; 
fclose($Handle); 

3 个答案:

答案 0 :(得分:4)

touchfile_put_contents几乎相同。它们的速度水平相同。我用以下函数做了一些基准测试。

define('MAX_ITERATION', 10000);

function create_empty_fpc($name) {
    file_put_contents(dirname(__FILE__)."/create_fpc/$name", "");
}

function create_empty_fopen($name) {
    if($fh=fopen(dirname(__FILE__)."/create_fopen/$name", "w"))
    fclose($fh);
}

function copy_empty($name) {
    copy(dirname(__FILE__).'/empty', dirname(__FILE__)."/copy/$name");
}

function touch_empty($name){
    touch(dirname(__FILE__)."/touch/$name");
}

结果

+-------------------------+---------------------------+
| Script name             | Execution time in seconds |
+-------------------------+---------------------------+
| With create_empty_fopen | 1.4960081577301           |
| With create_empty_fpc   | 1.2142379283905           |
| With copy_empty         | 1.4280989170074           |
| With touch_empty        | 1.0558199882507           |
+-------------------------+---------------------------+

结论

触摸速度最快。在那之后file_put_contents。复制并创建一个空文件的速度几乎相同。

答案 1 :(得分:3)

由于各种原因,复制操作通常非常昂贵。我每1000次运行以下操作来比较它们:

 copy
 touch
 fopen, fwrite, fclose
 fopen, fclose //this still creates the file
 fopen //files closed automatically, but this may take up more memory.

touch的速度始终是任何fopen方法的两倍(所有速度都相同)。 copy始终是最慢的。

就内存而言,fopen可能会使用更多内容,因为您必须存储文件句柄,而touchcopy只返回布尔值。

总之,请使用touch

答案 2 :(得分:1)

我相信这是最便宜的:

$file = "path/filename.html";
touch($file)
  or die("Error creating '$file'.\n");
echo "'$file' created\n";

如何衡量差异:

测量代码的执行时间称为 profiling ,并使用 profiler 完成。可选的xdebug模块provides profiling

您可以尝试直接在PHP中测量它:

$start = time();
// ...
$end = time();
$executionSeconds = $end - $start;
echo "Completed in $executionSeconds seconds.";

注意:我不希望这一点特别准确或有用。使用分析器是您的最佳选择。