C#写单个较大文件与写多个较小文件的性能比较

我们对文件写操作:

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(); 
                } 
            } 
        }
    }
}

测试结果如图:

猜你喜欢

转载自blog.csdn.net/ylq1045/article/details/112625035