Информация об изменениях

Сообщение Re[10]: BinaryWriter от 14.11.2024 6:17

Изменено 14.11.2024 6:20 tapatoon

Re[10]: BinaryWriter
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, tapatoon, Вы писали:

T>>Я ж написал — при оптимальном размере буфера в 4КБ разницы нет
S>Это не "оптимальный" размер буфера, а размер по умолчанию. Вот мне и интересно, что вы такое там намерили, что переделка его "на винапи" ускорила работу в 100 раз, или хотя бы в полтора.

В коде используются внутренние либы, если оставить суть, получится то, что я уже приводил. Но раз Вы настаиваете, приведу ешё раз:
using (FileStream file = new FileStream(filePath...)) // или Kernel32.CreateFile
{
    long bytesWritten = 0;
    do
    {
    var data = getData();
        file.Write(data, 0, data.Length); // или Kernel32.WriteFile
        bytesWritten += data.Length;
    }
    while (continueWrite(bytesWritten));
}


Когда я переписал на винапи, я накапливал по 4Кб и только тогда вызывал WriteFile. А как я уже писал, данные приходили небольшими порциями, а сначала и вовсе разных типов, поэтому была связка FileStream + BinaryWriter. Разница — сотни раз.
Потом Вы мне указали на лишний BinaryWriter — убрал. Разница стала полтора раза.
Потом Вы меня попросили код. Тут до меня дошло, что в FileStream передаются небольшие порции, а так не честно. Сделал размер буферов одинаковыми и FileStream молодцом, даже победил) О чём я и написал.

Итог, разница WriteFile с переданным буфером в 4Кб и
1) FileWriter + BinaryWriter + запись небольшими порциями — сотни раз
2) FileWriter + запись небольшими порциями — в разы (до 10 если отдавать по 1 байту)
3) FileWriter + запись в него по 4Кб — одинаковая скорость
Re[10]: BinaryWriter
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, tapatoon, Вы писали:

T>>Я ж написал — при оптимальном размере буфера в 4КБ разницы нет
S>Это не "оптимальный" размер буфера, а размер по умолчанию. Вот мне и интересно, что вы такое там намерили, что переделка его "на винапи" ускорила работу в 100 раз, или хотя бы в полтора.

В коде используются внутренние либы, если оставить суть, получится то, что я уже приводил. Но раз Вы настаиваете, приведу ешё раз:
using (FileStream file = new FileStream(filePath...)) // или Kernel32.CreateFile
{
    long bytesWritten = 0;
    do
    {
    var data = getData();
        file.Write(data, 0, data.Length); // или Kernel32.WriteFile
        bytesWritten += data.Length;
    }
    while (continueWrite(bytesWritten));
}


Когда я переписал на винапи, я накапливал по 4Кб и только тогда вызывал WriteFile. А как я уже писал, данные приходили небольшими порциями, а сначала и вовсе разных типов, поэтому была связка FileStream + BinaryWriter. Разница — сотни раз.
Потом Вы мне указали на лишний BinaryWriter — убрал. Разница стала полтора раза.
Потом Вы меня попросили код. Тут до меня дошло, что в FileStream передаются небольшие порции, а так не честно. Сделал размер буферов одинаковыми и FileStream молодцом, даже победил) О чём я и написал.

Итог, разница WriteFile с переданным буфером в 4Кб и
1) FileStream + BinaryWriter + запись небольшими порциями — сотни раз
2) FileStream + запись небольшими порциями — в разы (до 10 если отдавать по 1 байту)
3) FileStream + запись в него по 4Кб — одинаковая скорость