System.IO.StreamReader 与 Get-Content 与 System.IO.File

Chr*_*her 5 .net powershell

我一直在比较在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
Run Code Online (Sandbox Code Playgroud)

它产生(当然略有变化)以下输出:

StreamReader time:  + 00:00:00.5493247
Get-Content time:  + 00:00:07.8424864
System.IO.File reader time:  + 00:00:00.7988032
Run Code Online (Sandbox Code Playgroud)

所以这似乎[System.IO.StreamReader]是“读取”文件最快的方法。

我的问题是:

假如说

[System.IO.File]::OpenText($file)
$content = $reader.ReadToEnd()
Run Code Online (Sandbox Code Playgroud)

相当于(因为它们都打开文件流):

$reader = New-Object System.IO.StreamReader($file)
$content = $reader.ReadToEnd()
Run Code Online (Sandbox Code Playgroud)

那么是什么让一个比另一个稍微快一点呢?运行大约 10 次,似乎[System.IO.StreamReader]总是快约 0.2 秒。

来源