У меня проблема с производительностью при использовании функции 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 декодирование занимает больше времени).
Длина байтового массива, полученного с помощью Convert.FromBase64String, меньше длины массива, полученного с помощью функции ASCIIEncoding.GetBytes.
Интересно, что все, что я пытаюсь сделать, это написать группу байтов, используя объект FileStream. Так почему же при записи байтового массива на диск должна быть такая резкая разница в производительности (затраченное время)?
Или я что-то делаю ужасно неправильно? Пожалуйста, порекомендуйте.