我们对文件写操作:
1.写多个文件,每个文件较小
2.直接写一个较大的文件
比较这两种方式的性能。
一般来说,读写文件可以适当缓冲区大一点,尽量减少多次读写文件操作。
写一个比较大的文件 比 写多个小文件 花费的时间要少很多。
同理:TCP通信中,可以适当减少发送和接收次数,而每次发送和接收的缓冲区可以适当大一些,来优化通信性能。
我们用实际程序测试【写文件】:
一个写入200个1KB的文件【累计文件大小为200KB】
直接写入一个2MB的文件【文件大小为2048KB,大约是200KB的十倍】
扫描二维码关注公众号,回复:
13486138 查看本文章
visual studio 2019新建控制台应用程序WriteMultipleFileDemo,输入测试代码,如下:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WriteMultipleFileDemo
{
class Program
{
static void Main(string[] args)
{
//写多个文件 200个1KB文件 写1个2MB所花费的时间比较
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 20; i++)
{
//52*20=1040字节,约1KB
sb.Append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
}
string content = sb.ToString();
Console.WriteLine("开始测试【写200个1KB文件】与【写一个2MB的文件】所花费的时间比较......");
Task taskMultiple = Task.Run(() =>
{
WriteFileUseTime(WriteMultipleFile, nameof(WriteMultipleFile), content);
});
Task taskSingle = Task.Run(() =>
{
WriteFileUseTime(WriteSingleFile, nameof(WriteSingleFile), content);
});
Task.WaitAll(taskMultiple, taskSingle);
Console.WriteLine("写一个比较大的文件 比 写多个小文件 花费的时间要少很多。\n同理:TCP通信中,可以适当减少发送和接收次数,而每次发送和接收的缓冲区可以适当大一些,来优化通信性能");
Console.ReadLine();
}
/// <summary>
/// 写文件用时
/// </summary>
/// <param name="actionWriteFile"></param>
/// <param name="methodName"></param>
/// <param name="content"></param>
static void WriteFileUseTime(Action<string> actionWriteFile, string methodName, string content)
{
Stopwatch stopwatch = Stopwatch.StartNew();
actionWriteFile(content);
Console.WriteLine($"【{methodName.PadRight(18)}】,写文件结束,用时【{stopwatch.Elapsed.TotalMilliseconds}】ms");
}
/// <summary>
/// 写100个1KB的文件
/// </summary>
/// <param name="content"></param>
static void WriteMultipleFile(string content)
{
string pathDirectory = AppDomain.CurrentDomain.BaseDirectory + "TestMultiple\\";
if (!Directory.Exists(pathDirectory))
{
Directory.CreateDirectory(pathDirectory);
}
for (int i = 1; i <= 200; i++)
{
string path = pathDirectory + DateTime.Now.ToString("yyyyMMdd_") + $"{i.ToString("D3")}.txt";
using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
{
using (StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8))
{
streamWriter.WriteLine(content);
streamWriter.Close();
fileStream.Close();
}
}
}
}
/// <summary>
/// 写1024行1KB的单个文件,也就是1MB
/// </summary>
/// <param name="content"></param>
static void WriteSingleFile(string content)
{
string pathDirectory = AppDomain.CurrentDomain.BaseDirectory + "TestSingle\\";
if (!Directory.Exists(pathDirectory))
{
Directory.CreateDirectory(pathDirectory);
}
string path = pathDirectory + DateTime.Now.ToString("yyyyMMdd") + ".txt";
using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
{
using (StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8))
{
for (int i = 0; i < 2048; i++)
{
streamWriter.WriteLine(content);
}
streamWriter.Close();
fileStream.Close();
}
}
}
}
}