将文件转换为流的最快方法
Fastest way to convert File to Stream
我做了 google 并看到了读取和写入文件的不同方法,但我需要最快的方法将文件转换为流。
我正在努力改进一种将文件简单地转换为流的方法的性能。这将每天被调用无数次,我们正在考虑提高它的性能。下面请看我写的方法
public static Stream GetFileStream(string fileName)
{
Stream result;
try
{
if (File.Exists(fileName))
{
result = File.OpenRead(fileName);
if (result.Length > 0)
{
result.Seek(0, SeekOrigin.Begin);
}
}
else
{
throw new Exception(string.Format("{0} file not found.", fileName));
}
}
catch (Exception ex)
{
throw ex;
}
return result;
}
示例测试调用代码(我无法控制,如下所示)
List<string> fileNames = new List<string>();
//add almost 30,000 file names to string
List<Stream> fileStreams = new List<Stream>();
foreach(string fileName in fileNames)
{
Stream fileStream = FileUtility.GetFileStream(fileName);
fileStreams.Add(fileStream);
}
我正在研究如何提高我的方法 ConvertToStream 的性能。
提前致谢。
更新 1
按照下面的朋友,我把我的方法转换成下面的样子
public static Stream ConvertToStream(string fileName)
{
Stream result;
try
{
result = File.OpenRead(fileName);
}
catch (Exception ex)
{
throw ex;
}
return result;
}
我会让你知道性能。
更新 2
我收到来电者的回复说重构代码不会破坏任何东西。我们正在寻求重构此方法之外的代码。我觉得这个方法不错。谢谢 yaakov 和大家...
FileStream
constructor有什么问题?
请注意,文件 I/O 永远不会是 "fast"。当然,您可以以更高效的方式做事,但是文件 I/O 通常是应用程序中速度较慢的部分之一。
public static Stream GetFileStream(string fileName) => File.OpenRead(fileName);
您的其余代码基本上是多余的:
- 外部
try
/catch
重新抛出现有异常,尽管它破坏了进程中的堆栈跟踪。
- 如果文件不存在,
File.OpenRead
将抛出 FileNotFoundException
。你不需要自己做这个检查,如果文件在调用 File.Exists
和 File.OpenRead
. 之间被删除,那么无论如何这样做都会为竞争条件留出空间
- 新打开的文件流会从文件的开头开始,所以不需要
Seek
到开头。
我做了 google 并看到了读取和写入文件的不同方法,但我需要最快的方法将文件转换为流。
我正在努力改进一种将文件简单地转换为流的方法的性能。这将每天被调用无数次,我们正在考虑提高它的性能。下面请看我写的方法
public static Stream GetFileStream(string fileName)
{
Stream result;
try
{
if (File.Exists(fileName))
{
result = File.OpenRead(fileName);
if (result.Length > 0)
{
result.Seek(0, SeekOrigin.Begin);
}
}
else
{
throw new Exception(string.Format("{0} file not found.", fileName));
}
}
catch (Exception ex)
{
throw ex;
}
return result;
}
示例测试调用代码(我无法控制,如下所示)
List<string> fileNames = new List<string>();
//add almost 30,000 file names to string
List<Stream> fileStreams = new List<Stream>();
foreach(string fileName in fileNames)
{
Stream fileStream = FileUtility.GetFileStream(fileName);
fileStreams.Add(fileStream);
}
我正在研究如何提高我的方法 ConvertToStream 的性能。
提前致谢。
更新 1
按照下面的朋友,我把我的方法转换成下面的样子
public static Stream ConvertToStream(string fileName)
{
Stream result;
try
{
result = File.OpenRead(fileName);
}
catch (Exception ex)
{
throw ex;
}
return result;
}
我会让你知道性能。
更新 2
我收到来电者的回复说重构代码不会破坏任何东西。我们正在寻求重构此方法之外的代码。我觉得这个方法不错。谢谢 yaakov 和大家...
FileStream
constructor有什么问题?
请注意,文件 I/O 永远不会是 "fast"。当然,您可以以更高效的方式做事,但是文件 I/O 通常是应用程序中速度较慢的部分之一。
public static Stream GetFileStream(string fileName) => File.OpenRead(fileName);
您的其余代码基本上是多余的:
- 外部
try
/catch
重新抛出现有异常,尽管它破坏了进程中的堆栈跟踪。 - 如果文件不存在,
File.OpenRead
将抛出FileNotFoundException
。你不需要自己做这个检查,如果文件在调用File.Exists
和File.OpenRead
. 之间被删除,那么无论如何这样做都会为竞争条件留出空间
- 新打开的文件流会从文件的开头开始,所以不需要
Seek
到开头。