เจชเจธเฉ€เจจเจพ เจตเจนเจพเจ เจฌเจฟเจจเจพเจ‚ C/C++ เจซเจพเจˆเจฒ I/O เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเฉ‹

เจชเจธเฉ€เจจเจพ เจตเจนเจพเจ เจฌเจฟเจจเจพเจ‚ C/C++ เจซเจพเจˆเจฒ I/O เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเฉ‹

เจฎเฉเจ–เจฌเฉฐเจง

เจฆเฉเจจเฉ€เจ† เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ…เจœเจฟเจนเฉ€ เจธเจงเจพเจฐเจจ เจ…เจคเฉ‡ เจฌเจนเฉเจค เจ‰เจชเจฏเฉ‹เจ—เฉ€ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจนเฉˆ - เจฌเฉ€เจกเฉˆเจฒเจŸเจพ, เจ…เจคเฉ‡ เจ‡เจน เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจนเฉ‹เจ‡เจ† เจ•เจฟ เจ‡เจน เจฌเจนเฉเจค เจฒเฉฐเจฌเฉ‡ เจธเจฎเฉ‡เจ‚ เจคเฉ‹เจ‚ เจธเจพเจกเฉ€ เจ‰เจคเจชเจพเจฆเจจ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจธเฉ€ (เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ‡เจธเจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจธเจฅเจพเจชเจค เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจจเจนเฉ€เจ‚ เจธเฉ€, เจชเจฐ เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจ†เจ–เจฐเฉ€ เจ‰เจชเจฒเจฌเจง เจจเจนเฉ€เจ‚ เจธเฉ€)เฅค เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ‡เจธเจฆเฉ‡ เจ‰เจฆเฉ‡เจธเจผ เจ‰เจฆเฉ‡เจธเจผ เจฒเจˆ เจตเจฐเจคเจฆเฉ‡ เจนเจพเจ‚ - เจฌเจพเจˆเจจเจฐเฉ€ เจชเฉˆเจš เจฌเจฃเจพเจ‰เจฃเจพเฅค เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจ•เฉ€ เจนเฉˆ เจ‰เจธ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจ‡เจน เจฅเฉ‹เฉœเจพ เจ‰เจฆเจพเจธ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ: เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจ‡เจธเจจเฉ‚เฉฐ เจฌเจนเฉเจค เจธเจฎเจพเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ›เฉฑเจก เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจธเฉ€ เจ…เจคเฉ‡ เจ‡เจธเจฆเจพ เจฌเจนเฉเจค เจธเจพเจฐเจพ เจนเจฟเฉฑเจธเจพ เจฌเจนเฉเจค เจชเฉเจฐเจพเจฃเจพ เจนเฉˆ (เจฎเฉ‡เจฐเฉ‡ เจธเจพเจฌเจ•เจพ เจธเจนเจฟเจฏเฉ‹เจ—เฉ€ เจจเฉ‡ เจ‡เฉฑเจ• เจตเจพเจฐ เจ‰เฉฑเจฅเฉ‡ เจ•เจˆ เจธเฉฐเจชเจพเจฆเจจ เจ•เฉ€เจคเฉ‡ เจธเจจ, เจชเจฐ เจ‡เจน เจฌเจนเฉเจค เจธเจฎเจพเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจธเฉ€) . เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจฎเฉˆเจ‚ เจ‡เจธ เจฎเจพเจฎเจฒเฉ‡ เจจเฉ‚เฉฐ เจฎเฉเฉœ เจœเจผเจฟเฉฐเจฆเจพ เจ•เจฐเจจ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ: เจฎเฉˆเจ‚ เจซเฉ‹เจฐเจ• เจ•เฉ€เจคเจพ, เจ‰เจน เจšเฉ€เจœเจผ เจฌเจพเจนเจฐ เจธเฉเฉฑเจŸ เจฆเจฟเฉฑเจคเฉ€ เจœเฉ‹ เจฎเฉˆเจ‚ เจตเจฐเจคเจฃ เจฆเฉ€ เจฏเฉ‹เจœเจจเจพ เจจเจนเฉ€เจ‚ เจธเฉ€, เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ cmake, เจ‡เจจเจฒเจพเจˆเจจเจก "เจนเฉŒเจŸ" เจฎเจพเจˆเจ•เฉเจฐเฉ‹เจซเฉฐเจ•เจธเจผเจจ, เจธเจŸเฉˆเจ• เจคเฉ‹เจ‚ เจตเฉฑเจกเฉ‡ เจเจฐเฉ‡ เจนเจŸเจพเจ (เจ…เจคเฉ‡ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฒเฉฐเจฌเจพเจˆ เจฆเฉ‡ เจเจฐเฉ‡, เจœเฉ‹ เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจฎเฉˆเจจเฉ‚เฉฐ "เจฌเฉฐเจฌ" เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจจ), เจชเฉเจฐเฉ‹เจซเจพเจˆเจฒเจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเจพเจฐ เจซเจฟเจฐ เจšเจฒเจพเจ‡เจ† - เจ…เจคเฉ‡ เจชเจคเจพ เจฒเฉฑเจ—เจพ เจ•เจฟ เจฒเจ—เจญเจ— 40% เจธเจฎเจพเจ‚ เจ‡เจธ 'เจคเฉ‡ เจ–เจฐเจš เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจฒเจฟเจ–เฉ‹...

เจคเจพเจ‚ fwrite เจจเจพเจฒ เจ•เฉ€ เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ?

เจ‡เจธ เจ•เฉ‹เจก เจตเจฟเฉฑเจš, fwrite (เจฎเฉ‡เจฐเฉ‡ เจ–เจพเจธ เจŸเฉˆเจธเจŸ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš: เจ•เจฐเฉ€เจฌ 300 MB เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ เจ‡เฉฑเจ• เจชเฉˆเจš เจฌเจฃเจพเจ‰เจฃเจพ, เจ‡เจจเจชเฉเจŸ เจกเฉ‡เจŸเจพ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจตเจฟเฉฑเจš เจนเฉˆ) เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ‡ เจฌเจซเจฐ เจ†เจ•เจพเจฐ เจจเจพเจฒ เจฒเฉฑเจ–เจพเจ‚ เจตเจพเจฐ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡, เจ‡เจน เจšเฉ€เจœเจผ เจนเฉŒเจฒเฉ€ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เฉ€, เจ…เจคเฉ‡ เจ‡เจธ เจฒเจˆ เจฎเฉˆเจ‚ เจ•เจฟเจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚ เจ‡เจธ เจฌเฉ‡เจ‡เฉฑเจœเจผเจคเฉ€ เจจเฉ‚เฉฐ เจชเฉเจฐเจญเจพเจตเจฟเจค เจ•เจฐเจจเจพ เจšเจพเจนเจพเจ‚เจ—เจพ. เจ•เจˆ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ‡ เจกเฉ‡เจŸเจพ เจธเจฐเฉ‹เจคเจพเจ‚, เจ…เจธเจฟเฉฐเจ•เจฐเฉ‹เจจเจธ เจ‡เจจเจชเฉเจŸ-เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจ…เจœเฉ‡ เจคเฉฑเจ• เจ•เฉ‹เจˆ เจ‡เฉฑเจ›เจพ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจธเจฐเจฒ เจนเฉฑเจฒ เจฒเฉฑเจญเจฃเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจธเฉ€. เจชเจนเจฟเจฒเฉ€ เจ—เฉฑเจฒ เจœเฉ‹ เจฎเจจ เจตเจฟเฉฑเจš เจ†เจˆ เจ‰เจน เจธเฉ€ เจฌเจซเจฐ เจฆเจพ เจ†เจ•เจพเจฐ เจตเจงเจพเจ‰เจฃเจพ

setvbuf(file, nullptr, _IOFBF, 64* 1024)

เจชเจฐ เจฎเฉˆเจจเฉ‚เฉฐ เจจเจคเฉ€เจœเฉ‡ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจธเฉเจงเจพเจฐ เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเจฟเจ† (เจนเฉเจฃ fwrite เจธเจฎเฉ‡เจ‚ เจฆเฉ‡ เจฒเจ—เจญเจ— 37% เจฒเจˆ เจ–เจพเจคเจพ เจนเฉˆ) - เจœเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ…เจœเฉ‡ เจตเฉ€ เจกเจฟเจธเจ• 'เจคเฉ‡ เจ…เจ•เจธเจฐ เจกเฉ‡เจŸเจพ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจ—เฉฑเจฒ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค fwrite เจฆเฉ‡ "เจนเฉเฉฑเจก เจฆเฉ‡ เจนเฉ‡เจ เจพเจ‚" เจฆเฉ‡เจ–เจฆเฉ‡ เจนเฉ‹เจ, เจคเฉเจธเฉ€เจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจ‡เฉฑเจ• เจฒเจพเจ•/เจ…เจจเจฒเจพเจ• FILE เจขเจพเจ‚เจšเจพ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ (เจธเฉ‚เจกเฉ‹-เจ•เฉ‹เจก, เจธเจพเจฐเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจตเจฟเจœเจผเฉ‚เจ…เจฒ เจธเจŸเฉ‚เจกเฉ€เจ“ 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;
}

เจชเฉเจฐเฉ‹เจซเจพเจˆเจฒเจฐ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ, _fwrite_nolock เจธเจฟเจฐเจซ 6% เจธเจฎเฉ‡เจ‚ เจฒเจˆ เจ–เจพเจคเจพ เจนเฉˆ, เจฌเจพเจ•เฉ€ เจ“เจตเจฐเจนเฉˆเฉฑเจก เจนเฉˆเฅค เจฎเฉ‡เจฐเฉ‡ เจ–เจพเจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจฅเจฐเจฟเฉฑเจก เจธเฉเจฐเฉฑเจ–เจฟเจ† เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจ“เจตเจฐเจ•เจฟเจฒ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจฎเฉˆเจ‚ fwrite เจ•เจพเจฒ เจจเฉ‚เฉฐ เจ‡เจธ เจจเจพเจฒ เจฌเจฆเจฒ เจ•เฉ‡ เจ•เฉเจฐเจฌเจพเจจ เจ•เจฐเจพเจ‚เจ—เจพ _fwrite_nolock - เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเจฒเฉ€เจฒเจพเจ‚ เจจเจพเจฒ เจนเฉเจธเจผเจฟเจ†เจฐ เจนเฉ‹เจฃ เจฆเฉ€ เจตเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ•เฉเฉฑเจฒ: เจ‡เจธ เจธเจงเจพเจฐเจฃ เจนเฉ‡เจฐเจพเจซเฉ‡เจฐเฉ€ เจจเฉ‡ เจจเจคเฉ€เจœเจพ เจฐเจฟเจ•เจพเจฐเจก เจ•เจฐเจจ เจฆเฉ€ เจฒเจพเจ—เจค เจจเฉ‚เฉฐ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจฃ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ˜เจŸเจพ เจฆเจฟเฉฑเจคเจพ, เจœเฉ‹ เจ•เจฟ เจ…เจธเจฒ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš เจ–เจฐเจšเฉ‡ เจ—เจ เจธเจฎเฉ‡เจ‚ เจฆเฉ‡ เจฒเจ—เจญเจ— เจ…เฉฑเจงเฉ‡ เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจธเฉ€เฅค เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ, เจชเฉ‹เจธเจฟเจ•เจธ เจธเฉฐเจธเจพเจฐ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจฎเจพเจจ เจซเฉฐเจ•เจธเจผเจจ เจนเฉˆ - fwrite_unlocked. เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจ‡เจนเฉ€ เจซเจฐเฉˆเฉฑเจก 'เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ. เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, # เจชเจฐเจฟเจญเจพเจธเจผเจพเจตเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจœเฉ‹เฉœเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจคเฉเจธเฉ€เจ‚ เจฌเฉ‡เจฒเฉ‹เฉœเฉ‡ เจคเจพเจฒเฉ‡ เจฆเฉ‡ เจฌเจฟเจจเจพเจ‚ เจ‡เฉฑเจ• เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจ•เจฐเจพเจธ-เจชเจฒเฉ‡เจŸเจซเจพเจฐเจฎ เจนเฉฑเจฒ เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเฉ‡เจ•เจฐ เจ‰เจน เจœเจผเจฐเฉ‚เจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเจจ (เจ…เจคเฉ‡ เจ…เจœเจฟเจนเจพ เจ…เจ•เจธเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉˆ)เฅค

fwrite, _fwrite_nolock, setvbuf

เจ†เจ“ เจฎเฉ‚เจฒ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจคเฉ‹เจ‚ เจฆเฉ‚เจฐ เจšเจฒเฉ‡ เจœเจพเจˆเจ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ–เจพเจธ เจ•เฉ‡เจธ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ 'เจคเฉ‡ เจงเจฟเจ†เจจ เจ•เฉ‡เจ‚เจฆเจฐเจฟเจค เจ•เจฐเฉ€เจ: เจ‡เฉฑเจ• เจตเฉฑเจกเฉ€ เจซเจพเจˆเจฒ (512 MB) เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจ›เฉ‹เจŸเฉ‡ เจนเจฟเฉฑเจธเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฃเจพโ€”เจนเจฐเฉ‡เจ• เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฌเจพเจˆเจŸเฅค เจŸเฉˆเจธเจŸ เจธเจฟเจธเจŸเจฎ: AMD Ryzen 7 1700, 16 GB RAM, 7200 rpm HDD, 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เฅค เจ†เจ‰ เจนเฉเจฃ setvbuf เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ _fwrite_nolock เจฆเฉ‡ เจธเฉฐเจšเจพเจฒเจจ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ€เจ: 7262221 ยตs, เจธเจชเฉ€เจก - 70.5 Mb/s!

เจ…เฉฑเจ—เฉ‡, เจ†เจ“ เจฌเจซเจฐ เจ†เจ•เจพเจฐ (setvbuf) เจจเจพเจฒ เจชเฉเจฐเจฏเฉ‹เจ— เจ•เจฐเฉ€เจ:

เจชเจธเฉ€เจจเจพ เจตเจนเจพเจ เจฌเจฟเจจเจพเจ‚ C/C++ เจซเจพเจˆเจฒ I/O เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเฉ‹

เจกเจพเจŸเจพ เจ”เจธเจคเจจ 5 เจชเฉเจฐเจฏเฉ‹เจ—เจพเจ‚ เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€; เจฎเฉˆเจ‚ เจ—เจฒเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจ—เจฃเจจเจพ เจ•เจฐเจจ เจฒเจˆ เจฌเจนเฉเจค เจ†เจฒเจธเฉ€ เจธเฉ€เฅค เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ, 93 MB/s เจœเจฆเฉ‹เจ‚ เจ‡เฉฑเจ• เจจเจฟเจฏเจฎเจค HDD เจตเจฟเฉฑเจš 1 เจฌเจพเจˆเจŸ เจฒเจฟเจ–เจฃเจพ เจ‡เฉฑเจ• เจฌเจนเฉเจค เจตเจงเฉ€เจ† เจจเจคเฉ€เจœเจพ เจนเฉˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจ…เจจเฉเจ•เฉ‚เจฒ เจฌเจซเจผเจฐ เจ†เจ•เจพเจฐ (เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, 256 KB เจฌเจฟเจฒเจ•เฉเจฒ เจธเจนเฉ€ เจนเฉˆ) เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ…เจคเฉ‡ fwrite เจจเฉ‚เฉฐ _fwrite_nolock/fwrite_unlocked เจจเจพเจฒ เจฌเจฆเจฒเฉ‹ ( เจœเฉ‡ เจงเจพเจ—เฉ‡ เจฆเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจฌเฉ‡เจธเจผเจ•).
เจ‡เจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจซเจฐเฉˆเฉฑเจก เจฆเฉ‡ เจจเจพเจฒ. เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจฒ เจฒเฉ€เจจเจ•เจธ เจตเจพเจฒเฉ€ เจนเจพเจฐเจกเจตเฉ‡เจ…เจฐ เจฎเจธเจผเฉ€เจจ เจจเจนเฉ€เจ‚ เจนเฉˆ (เจธเจฟเฉฐเจ—เจฒ-เจฌเฉ‹เจฐเจก เจ•เฉฐเจชเจฟเจŠเจŸเจฐเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ), เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ (เจนเจพเจˆเจชเจฐ-เจตเฉ€, เจ“เจชเจจเจธเฉ‚เจธเฉ‡ 15, เจœเฉ€เจธเฉ€เจธเฉ€ 8.3.1) 'เจคเฉ‡ เจ‡เฉฑเจ• เจธเฉ€เจฎเจค เจชเฉเจฐเจฏเฉ‹เจ— เจ•เจฐเจจ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆ - เจชเฉˆเจŸเจฐเจจ, เจธเจฟเจงเจพเจ‚เจค เจตเจฟเฉฑเจš, เจ‰เจนเฉ€ เจนเฉˆ: โ€œเจจเฉฐเจ—เฉ‡โ€ fwrite 20 Mb/s, fwrite + 256 KB เจฌเจซเจฐ เจจเฉ‡ 23 Mb/s, fwrite_unlocked เจ‰เจธเฉ‡ เจฌเจซเจฐ เจจเจพเจฒ - 35 Mb/s (64-เจฌเจฟเฉฑเจŸ เจฌเจพเจˆเจจเจฐเฉ€, เจ…เจธเฉˆเจ‚เจฌเจฒเจก g++ -o2 - s -static-libgcc -static-libstdc++ fwrite_test. cpp -o fwrite_test)เฅค

เจฌเจพเจ…เจฆ

เจ‡เจธ เจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ เจฆเจพ เจ‰เจฆเฉ‡เจธเจผ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจ…เจคเฉ‡ เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ€ เจคเจ•เจจเฉ€เจ• เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจเจพ เจธเฉ€ (เจฎเฉˆเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ•เจฆเฉ‡ เจตเฉ€ _fwrite_nolock/fwrite_unlocked เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจ†เจ‡เจ†, เจ‰เจน เจฌเจนเฉเจค เจฎเจธเจผเจนเฉ‚เจฐ เจจเจนเฉ€เจ‚ เจนเจจ - เจชเจฐ เจตเจฟเจ…เจฐเจฅ)เฅค เจฎเฉˆเจ‚ เจ‡เจน เจฆเจฟเจ–เจพเจตเจพ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจ•เจฟ เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเจตเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจฎเฉˆเจจเฉ‚เฉฐ เจ‰เจฎเฉ€เจฆ เจนเฉˆ เจ•เจฟ เจฒเฉ‡เจ– เจญเจพเจˆเจšเจพเจฐเฉ‡ เจฒเจˆ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

เจธเจฐเฉ‹เจค: www.habr.com

DDoS เจธเฉเจฐเฉฑเจ–เจฟเจ†, VPS VDS เจธเจฐเจตเจฐเจพเจ‚ เจตเจพเจฒเฉ€เจ†เจ‚ เจธเจพเจˆเจŸเจพเจ‚ เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจ–เจฐเฉ€เจฆเฉ‹ ๐Ÿ”ฅ DDoS เจธเฉเจฐเฉฑเจ–เจฟเจ†, VPS VDS เจธเจฐเจตเจฐเจพเจ‚ เจจเจพเจฒ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸ เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจ–เจฐเฉ€เจฆเฉ‹ | ProHoster