
แแปแแแแแแถ
แแถแแงแแแแแแแแแพแแแแถแแแแแแถแแแแ แแทแแแถแแแแแแแแแแแแแถแแแแถแแแแ
แแพแแทแแแแแ - แ แพแแแถแแถแแแพแแกแพแแแผแ
แแแแแแถแแแแผแแแถแแแแแ
แผแแแแแปแแแแแพแแแถแแแแทแแแแแแแพแแขแแแแแแแแแแถแแผแแแถแแแแแ แพแ (แแแแแธแแถแแถแแทแแขแถแ
แแแกแพแแแแแแแแแแแถแแถแแแแแแ แแแปแแแแแแถแแทแแแถแแทแแแแแแถแแแแแ
แปแแแแแแแแแแขแถแ
แแแแพแแถแแแ)แ แแพแแแแแพแแถแแแแแถแแแแแแแแแแแแแแถแแแแแแแแปแ - แแถแแแแถแแแแแแแแแแแแแแแแแแธแแ แแแแแทแแแพแขแแแแแแแกแแแแพแแขแแแธแแแแแถแแแ
แแแแปแแแแแถแแ แแถแแทแแแถแแฝแแฒแแแแแแแแแถแแแแแแทแ
แ แแถแแแทแ แแถแแแแผแแแถแแแแแแแแ
แแแแถแแแแธแแผแแแถแแแถแแแแแ แพแ แ แพแแแถแแ
แแแพแแแถแ แฝแแแแแแแถแแ (แขแแธแแแทแแแแแฝแแแถแแแถแแแแแแแแแปแแแแแถแแแแถแแแแแพแแถแแแแแแแแฝแแแถแ
แแแพแแแ
แแธแแแ แแแปแแแแแแถแแผแแแถแแแแแ แพแ) . แแถแแผแแ
แแแแปแแแถแแแแแแแ
แ
แทแแแแแแแพแฑแแแแแแ แถแแแแแแแกแพแแแทแแ แแแแปแแแถแแแแแแ แแแแ
แแแแผแแขแแแธแแแแแแแปแแแทแแแถแแแแแแแแแแแพ แแแแถแแแแแแผแแแแแแแแแ
แแธแแแแผแแปแแแถแ "แแแแ
" แแแแแถแแแแแแ
แผแ แแถแแแแขแถแแแแแแ
แแแแธแแแ (แแทแแขแถแแแแแแแแแแแขแแแ แแแแแแแพแขแแแแแแปแ "แแแแแแปแ" แแแแแแแแแแแแแ) แแแ profiler แแแแแแแ แ แพแแแถแแแแแพแแแถแแแแ แแ 40% แแแแแแแแแถแแแแผแแแถแแ
แแแถแแแพ ...
แ แปแfwrite แแถแแขแแแธแแแแแ?
แแ แแแแปแแแผแแแแ fwrite (แแแแปแแแแแธแแถแแแแแแแถแแแแถแแแแแแแแแแปแแ แแถแแแแแแพแแแแแแแแถแแฏแแแถแแแทแ 300 MB แแทแแแแแแแแแแ แผแแแบแแ แแแแปแแแแทแแถแแแแแแปแ) แแแแผแแแถแแแแ แ แแถแแถแแแแถแแแแแถแแฝแแแนแแแแ แแแแแปแแแผแ แแฝแแ แแถแแแแแแแ แแฟแแแแแแนแแแแ แปแ แ แพแแแผแ แแแแแแแแปแแ แแแแถแแฅแแแแทแแแแพแแถแแขแถแแแถแแแแแแ แแทแแแถแแแแถแแแแแแแแแถแแแแถแแพแแแแธแขแแปแแแแแแแแแแแแแแแแแแแแแแแแแทแแแแแแ แขแแแแถแ I/O แแ แแแแปแแ แแแแแแแแแแแแแแแแแแถแแแแแถแแแแแแถแแแแแ แแฟแแแแแผแแแแแแทแแแบแแถแแแแแแพแแแแ แแแแทแแแแแแแขแถแแแแ
setvbuf(file, nullptr, _IOFBF, 64* 1024)แแแปแแแแแแแแปแแแทแแแถแแแแฝแแแถแแแแแแแขแแฝแแฑแแแแแแแแแแถแแแแ แแแแปแแแแแแแแแ (แฅแกแผแแแแ fwrite แแถแแ แแแฝแแแแแ แแ 37% แแแแแแแแแถ) - แแแแแถแแแแแแถแแถแแ แแแแทแแแแแแถแแแแ แถแแแแถแแแแแแแแทแแแแแแแแถแแนแแแถแแแแ แแถแแแแแแแ แแแแพแ "แแ แแแแแแแแแแถแแ" แแ fwrite แขแแแแขแถแ แแพแแแพแแแถแแ แแถแแแแแแแแแ แถแแแแ / แแแแแแฏแแแถแแแแแปแแแพแแกแพแแแ แแถแแแแแปแแขแแแธแแฝแแแผแ แแแ (แแผแแแแแแแแแแถแ แแถแแแทแแถแแแถแแแขแแแแแแผแแแถแแขแแปแแแแแแ แแแแแ Visual Studio 2017)แ
size_t fwrite (const void *buffer, size_t size, size_t count, FILE *stream)
{
size_t retval = 0;
_lock_str(stream); /* lock stream */
__try
{
retval = _fwrite_nolock(buffer, size, count, stream);
}
__finally
{
_unlock_str(stream); /* unlock stream */
}
return retval;
}
แแแแแถแ โโProfiler แแแแธ _fwrite_nolock แแแแแถแแแแ 6% แแแแแแแแแถแแแแแ แแแแแบแแพแแ แแแแปแแแแแธแแทแแแแแแแแแแแปแ แแปแแแแแทแแถแแแแแแแแแกแถแแแบแ แแแถแแแแถแแแ แฝแแ แแแป แแผแ แแแแแแแแปแแแนแแแแแแแแถแแแแแแแฝแแแถแแ แ fwrite แแถแแฝแ - แขแแแแแทแแ แถแแแถแ แแแแแถแแแถแแฝแแแนแแแถแแแแแแแแแแ แแแปแแ แงแแถแแแแแแแถแแแแแแแแแถแแแถแแแแแแแแแถแแ แแแถแแแพแแถแแแแแแแแถแแแแแแแแแถแแ แแแพแ แแแแแ แแแแปแแแแแแแพแแแถแแ แแแฝแแแทแแแถแแแแแแแถแแแแแแแแแแถแแแแแถแแ แแแถแแ แแแแแทแแธแแแแแ แแแแปแแแทแแ POSIX แแถแแแปแแแถแแแแแแแแแแแถ - . แแทแแถแแแถแแผแแ แแผแ แแแแถแแแแแแแขแแปแแแแแ แแแแ fread แ แแผแ แแแแแแแแแแแพ #defines แแฝแแแผ แขแแแแขแถแ แแแฝแแแถแแแแแแแแแแถแแแแแแแแแทแแถแแถแแแแแแปแแแแแแทแแ แถแแแถแ แแ แถแแแแแ แแแแแทแแแพแแทแแ แถแแแถแ แ (แ แพแแแถแแพแแกแพแแแถแแนแแแถแแ)แ
fwrite, _fwrite_nolock, setvbuf
แ แผแแแพแแแถแแ แแแแธแแแแแแแแพแ แ แพแแแแแแแแพแแถแแแถแแแแแแแแแธแแถแแแแถแแแแฝแแ แแถแแแแแแแฏแแแถแแแแแฝแ (512 MB) แแถแแแแแแแผแ แแแแแปแ - แแฝแแแแแแแปแแแฝแแแแ แแแแแแแแแแถแแแแแแ AMD Ryzen 7 1700, RAM 16 GB, HDD 7200 rpm, แแแแถแแแแแแแถแแ 64 MBแ Windows 10 แแ แแแแถแ 1809 แแแแแแแแแแแแแธแแแแแผแแแถแแแแแแพแแกแพแแแถ 32 แแแธแ แแถแแแแแแพแแแแแแทแแแแแถแแแแแผแแแถแแแพแ แแแแแถแแแแแแแผแแแถแแแแแถแแแแถแแทแแทแแแแแ
แแแแผแแแแแถแแแแถแแแทแแแแแแ
#include <chrono>
#include <cstdio>
#include <inttypes.h>
#include <memory>
#ifdef _MSC_VER
#define fwrite_unlocked _fwrite_nolock
#endif
using namespace std::chrono;
int main()
{
std::unique_ptr<FILE, int(*)(FILE*)> file(fopen("test.bin", "wb"), fclose);
if (!file)
return 1;
constexpr size_t TEST_BUFFER_SIZE = 256 * 1024;
if (setvbuf(file.get(), nullptr, _IOFBF, TEST_BUFFER_SIZE) != 0)
return 2;
auto start = steady_clock::now();
const uint8_t b = 77;
constexpr size_t TEST_FILE_SIZE = 512 * 1024 * 1024;
for (size_t i = 0; i < TEST_FILE_SIZE; ++i)
fwrite_unlocked(&b, 1, sizeof(b), file.get());
auto end = steady_clock::now();
auto interval = duration_cast<microseconds>(end - start);
printf("Time: %lldn", interval.count());
return 0;
}
แขแแแแแนแแแถแ TEST_BUFFER_SIZE แ แพแแแแแแถแแแแแแธแแฝแแ แแแฝแ แแพแแแนแแแแแฝแ fwrite_unlocked แแแ fwriteแ แ แผแแ แถแแแแแแพแแแถแแฝแแแแแธ fwrite แแแแแทแแแแแแแแแ แแแแทแแแแแแแขแถแแแแ (แแแแ แแแแแท setvbuf แแทแแแแแแผแแแแแแถแแแแแแแ)แ แแแแแแแถ 27048906 ยตs แแแแฟแแแแแแ - 18.93 MB/s แ แฅแกแผแแแแแแแแแแแแ แแแแทแแแแแแแขแถแแแแแแ 64 KB: แแแแแแแถ - 25037111 ฮผs แแแแฟแ - 20.44 Mb/s แ แฅแกแผแแแแแแผแแแถแแแแแแแแแแทแแแแแทแแถแแแแแ _fwrite_nolock แแแแแทแแ แถแแแถแ แแ แ setvbuf: 7262221 ยตs แแแแฟแ - 70.5 Mb/s!
แแแแแถแแโแแ แแพแโแแถแแแแแโแแแ แโแแแทแแแแแแโแขแถแแแแ (setvbuf)แ

แแทแแแแแแแแแแแแแผแแแถแแแแฝแแแแแแถแแแทแแแแแแแถแแแแแแ
แแแฝแ 5 แแแแปแแแแแทแแแแแปแแแถแแแแแถแแแ แปแแ แแแแแถแแแแแแปแ 93 MB/s แแ
แแแแแแแแ 1 แแแแ
HDD แแแแแแถแแบแแถแแแแแแแแแขแแถแแ แขแแแแแแแถแแแแแแแแผแแแแแพแแแพแแแแ แแแแแปแแแแขแแแแปแ (แแแแปแแแแแธแแแแแแแแปแ 256 KB แแบแแแแนแแแแแผแ) แ แพแแแแแฝแ fwrite แแถแแฝแ _fwrite_nolock/fwrite_unlocked ( แแแแปแแแแแธแแแแแทแแแพแแปแแแแแทแแถแแแแแแแแแกแถแแแทแแแแแผแแแถแ แแถแแถแแแทแ)แ
แแผแ
แแแแถแแแแแแแแถแแฝแแแนแ fread แแ
แแแแปแแแแแแแแแแแแแแแแแแแถแ แแแแแถแแแแแปแแแทแแแถแแแแถแแแธแแแแแแแแนแแแถแแฝแแแธแแปแ
แแ
แแนแแแ (แแปแแแแแผแแแแแแแแแแแแฝแแแทแแแถแแแแแแ
แผแแแ) แแแแปแแแถแแแแแแแ
แ
แทแแแแแแแพแแถแแแทแแแแแแแถแแแแแแแแพแแแถแแแธแแแทแแแแทแ (Hyper-V, OpenSUSE 15, GCC 8.3.1) - the แแถแแแแแถแแแ แแแแถแแแบแแผแ
แแแแถแ "แขแถแแแแถแ" fwrite 20 Mb/s, fwrite + 256 KB buffer แแแทแ 23 Mb/s, fwrite_unlocked with the same buffer - 35 Mb/s (64-bit binary, assembled g++ -o2 - s -static-libgcc -static-libstdc++ fwrite_test. cpp -o fwrite_test)แ
Afterword
แแแแแแแแแแแถแแแแแแแขแแแแแแแแแแบแแพแแแแธแแทแแแแแถแขแแแธแแ แแ แแแแแแแแแถแแแแ แแทแแแถแแแแแแทแแแแแถแแแแแปแแแแแธแแถแ แแแพแ (แแแแปแแแทแแแแแแแแแแถแแแแปแแแถแ _fwrite_nolock/fwrite_unlocked แแธแแปแแแแแ แแฝแแแแแทแแแถแแแแแแถแแแแทแแแถแแแแแถแแแแ - แแแปแแแแแฅแแแแแแแแแ)แ แแแแปแโแแทแโแแแแพโแแปแโแแถโแแถโแแแแแถแแโแแแโแแแแธโแแ แแแปแแแแโแแแแปแโแแแแแนแโแแถโแขแแแแแโแแนแโแแถแโแแแแแแแแโแแแแแถแแโแแ แแแแแ
แแแแแ: www.habr.com
