我一直在比较各种方法,以便在Powershell中快速阅读相对较大的文本文档。这些文件的范围从50kb到200mb。我需要快速解析它们的特定行和/或特定字符串。
读取文件的三个常用工具(我所知道的,并且没有构建我自己的C#库)是:System.IO.StreamReader,System.IO.File和Powershell Cmdlet Get-Content。
所以我写了一个快速的小比较脚本:
$file = Get-Childitem -path "MyLogFile.txt" #This is a 100mb txt file
$t1 = Measure-Command{
$reader = New-Object System.IO.StreamReader($file)
$content = $reader.ReadToEnd()
$reader.Close()
}
Write-host "StreamReader time: " + $t1
$t2 = Measure-Command{
Get-Content $file
}
Write-host "Get-Content time: " + $t2
$t3 = Measure-Command {
$reader = [System.IO.File]::OpenText($file)
$content = $reader.ReadToEnd()
$reader.Close()
}
Write-Host "System.IO.File reader time: " + $t3
产生以下输出(当然略有变化):
StreamReader time: + 00:00:00.5493247
Get-Content time: + 00:00:07.8424864
System.IO.File reader time: + 00:00:00.7988032
所以[System.IO.StreamReader]
似乎是“读取”文件的最快方式。
我的问题是:
假设
[System.IO.File]::OpenText($file)
$content = $reader.ReadToEnd()
等效(因为它们都打开文件流)为:
$reader = New-Object System.IO.StreamReader($file)
$content = $reader.ReadToEnd()
然后是什么让一个比另一个稍快?运行大约10次,似乎[System.IO.StreamReader]
总是快0.2秒。
来源