แž”แž„แŸ’แž€แžพแž“แž›แŸ’แž”แžฟแž“แžฏแž€แžŸแžถแžš C/C++ I/O แžŠแŸ„แž™แž˜แžทแž“แž”แŸ‚แž€แž‰แžพแžŸ

แž”แž„แŸ’แž€แžพแž“แž›แŸ’แž”แžฟแž“แžฏแž€แžŸแžถแžš C/C++ I/O แžŠแŸ„แž™แž˜แžทแž“แž”แŸ‚แž€แž‰แžพแžŸ

แž”แžปแž–แŸ’แžœแž€แžแžถ

แž˜แžถแž“แžงแž”แž€แžšแžŽแŸแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžŠแŸแžŸแžถแž˜แž‰แŸ’แž‰ แž“แžทแž„แž˜แžถแž“แž”แŸ’แžšแž™แŸ„แž‡แž“แŸแžแŸ’แž›แžถแŸ†แž„แžŽแžถแžŸแŸ‹แž“แŸ…แž›แžพแž–แžทแž—แž–แž›แŸ„แž€ - แž”แŸŠแžธแžŒแžธแž›แžแžถแž แžพแž™แžœแžถแž”แžถแž“แž€แžพแžแžกแžพแž„แžŠแžผแž…แŸ’แž“แŸแŸ‡แžœแžถแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž‰แŸ’แž…แžผแž›แž€แŸ’แž“แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž•แž›แžทแžแžšแž”แžŸแŸ‹แž™แžพแž„แžขแžŸแŸ‹แžšแž™แŸˆแž–แŸแž›แž‡แžถแž™แžผแžšแžŽแžถแžŸแŸ‹แž˜แž€แž แžพแž™ (แž‘แŸ„แŸ‡แž”แžธแž‡แžถแžœแžถแž˜แžทแž“แžขแžถแž…แžŠแŸ†แžกแžพแž„แž€แŸ†แžŽแŸ‚แžšแž”แžŸแŸ‹แžœแžถแž”แžถแž“แž€แŸแžŠแŸ„แž™ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžœแžถแž–แžทแžแž‡แžถแž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแž€แŸ†แžŽแŸ‚แž…แžปแž„แž€แŸ’แžšแŸ„แž™แžŠแŸ‚แž›แžขแžถแž…แž”แŸ’แžšแžพแž”แžถแž“แž‘แŸ)แŸ” แž™แžพแž„แž”แŸ’แžšแžพแžœแžถแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แŸ„แž›แž”แŸ†แžŽแž„แžŠแŸ‚แž›แž”แžถแž“แž‚แŸ’แžšแŸ„แž„แž‘แžปแž€ - แž€แžถแžšแž€แžŸแžถแž„แž”แŸ†แžŽแŸ‡แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž‚แŸ„แž›แž–แžธแžšแŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž€แŸ’แžšแžกแŸแž€แž˜แžพแž›แžขแŸ’แžœแžธแžŠแŸ‚แž›แž˜แžถแž“แž“แŸ…แž€แŸ’แž“แžปแž„แžƒแŸ’แž›แžถแŸ†แž„ แžœแžถแž–แžทแžแž‡แžถแž‚แžฝแžšแžฒแŸ’แž™แžŸแŸ„แž€แžŸแŸ’แžแžถแž™แž”แž“แŸ’แžแžทแž…แŸ– แžแžถแž˜แž–แžทแž แžœแžถแžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ„แŸ‡แž”แž„แŸ‹แž…แŸ„แž›แžแžถแŸ†แž„แž–แžธแž™แžผแžšแž™แžถแžšแžŽแžถแžŸแŸ‹แž˜แž€แž แžพแž™ แž แžพแž™แž—แžถแž‚แž…แŸ’แžšแžพแž“แžœแžถแž แžฝแžŸแžŸแž˜แŸแž™แžŽแžถแžŸแŸ‹ (แžขแžแžธแžแž˜แžทแžแŸ’แžแžšแžฝแž˜แž€แžถแžšแž„แžถแžšแžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แž’แŸ’แž›แžถแž”แŸ‹แž”แžถแž“แž’แŸ’แžœแžพแž€แžถแžšแž€แŸ‚แžŸแž˜แŸ’แžšแžฝแž›แž‡แžถแž…แŸ’แžšแžพแž“แž“แŸ…แž‘แžธแž“แŸ„แŸ‡ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžœแžถแž™แžผแžšแžŽแžถแžŸแŸ‹แž˜แž€แž แžพแž™) . แž‡แžถแž‘แžผแž‘แŸ… แžแŸ’แž‰แžปแŸ†แž”แžถแž“แžŸแž˜แŸ’แžšแŸแž…แž…แžทแžแŸ’แžแž’แŸ’แžœแžพแžฑแŸ’แž™แž”แž‰แŸ’แž แžถแž“แŸแŸ‡แžšแžŸแŸ‹แžกแžพแž„แžœแžทแž‰แŸ– แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž”แŸ†แž”แŸ‚แž€ แž”แŸ„แŸ‡แž…แŸ„แž›แž“แžผแžœแžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แž‰แžปแŸ†แž˜แžทแž“แž˜แžถแž“แž‚แž˜แŸ’แžšแŸ„แž„แž”แŸ’แžšแžพ แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž‚แž˜แŸ’แžšแŸ„แž„แž‘แŸ… แžŸแŸŠแžธแžแŸแž˜แžธแž€แŸ’แžšแžผแž˜แžปแžแž„แžถแžš "แž€แŸ’แžแŸ…" แžŠแŸ‚แž›แžŠแžถแž€แŸ‹แž”แž‰แŸ’แž…แžผแž› แž”แžถแž“แžŠแž€แžขแžถแžšแŸแž’แŸ†แŸ—แž…แŸแž‰แž–แžธแž‡แž„แŸ‹ (แž“แžทแž„แžขแžถแžšแŸแž“แŸƒแž”แŸ’แžšแžœแŸ‚แž„แžขแžแŸแžš แžŠแŸ‚แž›แž’แŸ’แžœแžพแžขแŸ„แž™แžแŸ’แž‰แžปแŸ† "แž”แŸ†แž•แŸ’แž‘แžปแŸ‡" แžŠแŸ„แž™แžŸแŸ’แž˜แŸ„แŸ‡แžแŸ’แžšแž„แŸ‹) แžšแžแŸ‹ 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 แž‡แžถแž˜แžฝแž™ _fwrite_nolock - แžขแŸ’แž“แž€แž˜แžทแž“แž…แžถแŸ†แž”แžถแž…แŸ‹แž†แŸ’แž›แžถแžแž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž”แŸ’แžšแž€แŸ‚แž€แž‘แŸแŸ” แžŸแžšแžปแž”แŸ– แžงแž”แžถแž™แž€แž›แžŠแŸแžŸแžถแž˜แž‰แŸ’แž‰แž“แŸแŸ‡แž”แžถแž“แž€แžถแžแŸ‹แž”แž“แŸ’แžแž™แž€แžถแžšแž…แŸ†แžŽแžถแž™แž›แžพแž€แžถแžšแž€แžแŸ‹แžแŸ’แžšแžถแž›แž‘แŸ’แž’แž•แž›แž™แŸ‰แžถแž„แž…แŸ’แžšแžพแž“ แžŠแŸ‚แž›แž“แŸ…แž€แŸ’แž“แžปแž„แž€แŸ†แžŽแŸ‚แžŠแžพแž˜แž˜แžถแž“แž…แŸ†แž“แžฝแž“แž‡แžทแžแž–แžถแž€แŸ‹แž€แžŽแŸ’แžแžถแž›แž“แŸƒแž–แŸแž›แžœแŸแž›แžถแžŠแŸ‚แž›แž”แžถแž“แž…แŸ†แžŽแžถแž™แŸ” แžŠแŸ„แž™แžœแžทแž’แžธแž“แŸแŸ‡แž“แŸ…แž€แŸ’แž“แžปแž„แž–แžทแž—แž– POSIX แž˜แžถแž“แž˜แžปแžแž„แžถแžšแžŸแŸ’แžšแžŠแŸ€แž„แž‚แŸ’แž“แžถ - fwrite_แžŠแŸ„แŸ‡แžŸแŸ„. แž“แžทแž™แžถแž™แž‡แžถแž‘แžผแž‘แŸ… แžŠแžผแž…แž‚แŸ’แž“แžถแž“แŸแŸ‡แžŠแŸ‚แžšแžขแž“แžปแžœแžแŸ’แžแž…แŸ†แž–แŸ„แŸ‡ 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)แŸ–

แž”แž„แŸ’แž€แžพแž“แž›แŸ’แž”แžฟแž“แžฏแž€แžŸแžถแžš C/C++ I/O แžŠแŸ„แž™แž˜แžทแž“แž”แŸ‚แž€แž‰แžพแžŸ

แž‘แžทแž“แŸ’แž“แž“แŸแž™แž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แž‘แž‘แžฝแž›แžŠแŸ„แž™แž€แžถแžšแž–แžทแžŸแŸ„แž’แž“แŸแž‡แžถแž˜แž’แŸ’แž™แž˜แž…แŸ†แž“แžฝแž“ 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

แž‘แžทแž‰แž€แžถแžšแž”แž„แŸ’แž แŸ„แŸ‡แžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS, แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS ๐Ÿ”ฅ แž‘แžทแž‰แžŸแŸแžœแžถแž”แž„แŸ’แž แŸ„แŸ‡แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS แž“แžทแž„แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS | ProHoster