Я столкнулся с проблемой производительности при использовании функции FileStream.Write.
У меня есть консольное приложение, которое я использую для чтения строки Base64 из файла (размер ~ 400 КБ) с помощью объекта StreamReader. Я конвертирую эту строку в массив байтов с помощью Convert.FromBase64String. Затем я записываю этот байтовый массив в файл с помощью объекта FileStream. Полученная длина массива байтов составила 334991.
Я измерил время, затраченное на запись массива байтов, и оказалось, что оно составляет примерно 0,116 секунды.
Просто для удовольствия я получил массив байтов из той же закодированной в Base64 строки с помощью функции ASCIIEncoding.GetBytes (хотя я знал, что это не даст правильного вывода DECODED - я просто хотел попробовать). Я записал этот байтовый массив в файл с помощью объекта FileStream. Полученная длина массива байтов составила 458414.
Я измерил время, затраченное на запись массива байтов, используя эту методологию, и оно составило примерно 0,008 секунды.
Вот пример кода:
class Program
{
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
TimeSpan executionTime;
StreamReader sr = new StreamReader("foo.txt");
string sampleString = sr.ReadToEnd();
sr.Close();
////1. Convert to bytes using Base64 Decoder (The real output!)
//byte[] binaryData = Convert.FromBase64String(sampleString);
//2. Convert to bytes using AsciiEncoding (Just for Fun!)
byte[] binaryData = new System.Text.ASCIIEncoding().GetBytes(sampleString);
Console.WriteLine("Byte Length: " + binaryData.Length);
stopWatch.Start();
FileStream fs = new FileStream("bar.txt", FileMode.Create, FileAccess.Write);
fs.Write(binaryData, 0, binaryData.Length);
fs.Flush();
fs.Close();
stopWatch.Stop();
executionTime = stopWatch.Elapsed;
Console.WriteLine("FileStream Write - Total Execution Time: " + executionTime.TotalSeconds.ToString());
Console.Read();
}
}
Я провел тесты примерно для 5000 файлов, содержащих строку в кодировке Base64, и разница между временем, затраченным на запись этих двух типов байтовых массивов, составляет почти 10 раз (с записью байтового массива с использованием параметра real strong > декодирование занимает больше времени).
Длина массива байтов, полученного с помощью Convert.FromBase64String, меньше, чем длина, полученная с помощью функции ASCIIEncoding.GetBytes.
Интересно, что все, что я пытаюсь сделать, это записать кучу байтов, используя объект FileStream. Так почему же должна быть такая резкая разница в производительности (по затраченному времени) при записи байтового массива на диск?
Или я что-то ужасно не так делаю? Пожалуйста, порекомендуйте.