āϘāĻžāĻŽ āύāĻž āϭ⧇āϙ⧇ C/C++ āĻĢāĻžāχāϞ I/O āĻ¤ā§āĻŦāϰāĻžāĻ¨ā§āĻŦāĻŋāϤ āĻ•āϰ⧁āύ

āϘāĻžāĻŽ āύāĻž āϭ⧇āϙ⧇ C/C++ āĻĢāĻžāχāϞ I/O āĻ¤ā§āĻŦāϰāĻžāĻ¨ā§āĻŦāĻŋāϤ āĻ•āϰ⧁āύ

āĻ­ā§‚āĻŽāĻŋāĻ•āĻž

āĻĒ⧃āĻĨāĻŋāĻŦā§€āϤ⧇ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āϏāĻšāϜ āĻāĻŦāĻ‚ āϖ⧁āĻŦ āĻĻāϰāĻ•āĻžāϰ⧀ āχāωāϟāĻŋāϞāĻŋāϟāĻŋ āϰāϝāĻŧ⧇āϛ⧇ - āĻŦāĻŋāĻĄā§‡āĻ˛ā§āϟāĻž, āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻāĻŽāύāχ āϘāĻŸā§‡āϛ⧇ āϝ⧇ āĻāϟāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āωāĻ¤ā§āĻĒāĻžāĻĻāύ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϝāĻŧ āϖ⧁āĻŦ āĻĻā§€āĻ°ā§āϘ āϏāĻŽāϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āϜāĻĄāĻŧāĻŋāϤ āĻ›āĻŋāϞ (āϝāĻĻāĻŋāĻ“ āĻāϟāĻŋāϰ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻž āϏāĻŽā§āĻ­āĻŦ āĻ›āĻŋāϞ āύāĻž, āϤāĻŦ⧇ āĻāϟāĻŋ āĻ…āĻŦāĻļā§āϝāχ āĻļ⧇āώ āωāĻĒāϞāĻŦā§āϧ āĻ›āĻŋāϞ āύāĻž)āĨ¤ āφāĻŽāϰāĻž āĻāϟāĻŋāϕ⧇ āĻāϰ āωāĻĻā§āĻĻ⧇āĻļā§āϝāĻŽā§‚āϞāĻ• āωāĻĻā§āĻĻ⧇āĻļā§āϝ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋ - āĻŦāĻžāχāύāĻžāϰāĻŋ āĻĒā§āϝāĻžāϚ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāĨ¤ āĻ­āĻžāĻ¨ā§āĻĄāĻžāϰ⧇ āϝāĻž āφāϛ⧇ āϤāĻž āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āĻĻ⧇āϖ⧇āύ āϤāĻŦ⧇ āĻāϟāĻŋ āĻ•āĻŋāϛ⧁āϟāĻž āĻĻ⧁āσāĻ–āϜāύāĻ• āĻšāϝāĻŧ⧇ āĻ“āϠ⧇: āφāϏāϞ⧇, āĻāϟāĻŋ āĻ…āύ⧇āĻ• āφāϗ⧇ āĻĒāϰāĻŋāĻ¤ā§āϝāĻ•ā§āϤ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āĻāĻŦāĻ‚ āĻāϰ āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ—āχ āĻĒ⧁āϰāĻžāύ⧋ (āφāĻŽāĻžāϰ āĻĒā§āϰāĻžāĻ•ā§āϤāύ āϏāĻšāĻ•āĻ°ā§āĻŽā§€ āĻāĻ•āĻŦāĻžāϰ āϏ⧇āĻ–āĻžāύ⧇ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰ⧇āĻ›āĻŋāϞ⧇āύ, āϤāĻŦ⧇ āĻāϟāĻŋ āĻ…āύ⧇āĻ• āφāϗ⧇ āĻ›āĻŋāϞ) . āϏāĻžāϧāĻžāϰāĻŖāĻ­āĻžāĻŦ⧇, āφāĻŽāĻŋ āĻāχ āĻŦāĻŋāώāϝāĻŧāϟāĻŋāϕ⧇ āĻĒ⧁āύāϰ⧁āĻ¤ā§āĻĨāĻŋāϤ āĻ•āϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋ: āφāĻŽāĻŋ āĻ•āĻžāρāϟāĻžāϚāĻžāĻŽāϚ āĻ•āϰ⧇āĻ›āĻŋ, āϝāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻĒāϰāĻŋāĻ•āĻ˛ā§āĻĒāύāĻž āĻ•āϰāĻŋāύāĻŋ āϤāĻž āĻĢ⧇āϞ⧇ āĻĻāĻŋāϝāĻŧ⧇āĻ›āĻŋ, āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϟāĻŋāϕ⧇ āĻāϤ⧇ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰāĻŋāϤ āĻ•āϰ⧇āĻ›āĻŋ cmake, āχāύāϞāĻžāχāύāϝ⧁āĻ•ā§āϤ "āĻšāϟ" āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĢāĻžāĻ‚āĻļāύāϗ⧁āϞāĻŋ, āĻ¸ā§āĻŸā§āϝāĻžāĻ• āĻĨ⧇āϕ⧇ āĻŦāĻĄāĻŧ āĻ…ā§āϝāĻžāϰ⧇āϗ⧁āϞāĻŋ āϏāϰāĻŋāϝāĻŧ⧇ (āĻāĻŦāĻ‚ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāĻļā§€āϞ āĻĻ⧈āĻ°ā§āĻ˜ā§āϝ⧇āϰ āĻ…ā§āϝāĻžāϰ⧇, āϝāĻž āĻ¸ā§āĻĒāĻˇā§āϟāϤāχ āφāĻŽāĻžāϕ⧇ "āĻŦā§‹āĻŽāĻž" āĻ•āϰ⧇ āϤ⧋āϞ⧇), āĻĒā§āϰ⧋āĻĢāĻžāχāϞāĻžāϰāϟāĻŋ āφāĻŦāĻžāϰ āϚāĻžāϞāĻžāϝāĻŧ - āĻāĻŦāĻ‚ āϖ⧁āρāĻœā§‡ āĻĒ⧇āϝāĻŧ⧇āĻ›āĻŋ āϝ⧇ āĻĒā§āϰāĻžāϝāĻŧ 40% āϏāĻŽāϝāĻŧ āĻŦā§āϝāϝāĻŧ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ fwrite...

āϤāĻžāχ fwrite āϏāĻ™ā§āϗ⧇ āĻ•āĻŋ āφāĻĒ?

āĻāχ āϕ⧋āĻĄā§‡, fwrite (āφāĻŽāĻžāϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇: āĻ•āĻžāĻ›āĻžāĻ•āĻžāĻ›āĻŋ 300 MB āĻĢāĻžāχāϞ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϝāĻžāϚ āϤ⧈āϰāĻŋ āĻ•āϰāĻž, āχāύāĻĒ⧁āϟ āĻĄā§‡āϟāĻž āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖāϰ⧂āĻĒ⧇ āĻŽā§‡āĻŽāϰāĻŋāϤ⧇ āĻĨāĻžāϕ⧇) āĻāĻ•āϟāĻŋ āϛ⧋āϟ āĻŦāĻžāĻĢāĻžāϰ āφāĻ•āĻžāϰ āϏāĻš āϞāĻ•ā§āώ āϞāĻ•ā§āώ āĻŦāĻžāϰ āĻŦāϞāĻž āĻšāϝāĻŧāĨ¤ āĻ¸ā§āĻĒāĻˇā§āϟāϤāχ, āĻāχ āϜāĻŋāύāĻŋāϏāϟāĻŋ āϧ⧀āϰ āĻšāϝāĻŧ⧇ āϝāĻžāĻŦ⧇, āĻāĻŦāĻ‚ āϏ⧇āχāϜāĻ¨ā§āϝ āφāĻŽāĻŋ āĻāχ āĻ…āĻĒāĻŽāĻžāύāϕ⧇ āϕ⧋āύ⧋āĻ­āĻžāĻŦ⧇ āĻĒā§āϰāĻ­āĻžāĻŦāĻŋāϤ āĻ•āϰāϤ⧇ āϚāĻžāχāĨ¤ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āϧāϰāύ⧇āϰ āĻĄā§‡āϟāĻž āϏ⧋āĻ°ā§āϏ, āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāϏ āχāύāĻĒ⧁āϟ-āφāωāϟāĻĒ⧁āϟ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āϕ⧋āύ⧋ āχāĻšā§āĻ›āĻž āĻāĻ–āύāĻ“ āύ⧇āχ, āφāĻŽāĻŋ āĻāĻ•āϟāĻŋ āϏāĻšāϜ āϏāĻŽāĻžāϧāĻžāύ āϖ⧁āρāĻœā§‡ āĻĒ⧇āϤ⧇ āĻšā§‡āϝāĻŧ⧇āĻ›āĻŋāϞāĻžāĻŽāĨ¤ āĻĒā§āϰāĻĨāĻŽ āϜāĻŋāύāĻŋāϏ āϝāĻž āĻŽāύ⧇ āĻāϏ⧇āĻ›āĻŋāϞ āϤāĻž āĻšāϞ āĻŦāĻžāĻĢāĻžāϰ āφāĻ•āĻžāϰ āĻŦāĻžāĻĄāĻŧāĻžāύ⧋

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

āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāĻŋ āĻĢāϞāĻžāĻĢāϞ⧇ āωāĻ˛ā§āϞ⧇āĻ–āϝ⧋āĻ—ā§āϝ āωāĻ¨ā§āύāϤāĻŋ āĻĒāĻžāχāύāĻŋ (āĻāĻ–āύ āĻĒā§āϰāĻžāϝāĻŧ 37% āϏāĻŽāϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ fwrite āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ) - āϝāĻžāϰ āĻŽāĻžāύ⧇ āĻāϟāĻŋ āĻāĻ–āύāĻ“ āĻĄāĻŋāĻ¸ā§āϕ⧇ āϘāύ āϘāύ āĻĄā§‡āϟāĻž āϞ⧇āĻ–āĻžāϰ āĻŦāĻŋāώāϝāĻŧ āύāϝāĻŧāĨ¤ fwrite-āĻāϰ "āĻšā§āĻĄā§‡āϰ āύ⧀āĻšā§‡" āϖ⧁āρāϜāϛ⧇āύ, āφāĻĒāύāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻšā§āϛ⧇āύ āϝ⧇ āĻāĻ•āϟāĻŋ āϞāĻ•/āφāύāϞāĻ• āĻĢāĻžāχāϞ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻāϰāĻ•āĻŽ āĻ•āĻŋāϛ⧁āϰ āĻ­āĻŋāϤāϰ⧇ āϘāϟāϛ⧇ (āĻ›āĻĻā§āĻŽ-āϕ⧋āĻĄ, āϏāĻŽāĻ¸ā§āϤ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻ­āĻŋāĻœā§āϝ⧁āϝāĻŧāĻžāϞ āĻ¸ā§āϟ⧁āĻĄāĻŋāĻ“ 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 - āφāĻĒāύāĻžāϰ āϝ⧁āĻ•ā§āϤāĻŋāϤ⧇ āϚāĻžāϞāĻžāĻ• āĻšāĻ“āϝāĻŧāĻžāϰ āĻĻāϰāĻ•āĻžāϰ āύ⧇āχāĨ¤ āĻŽā§‹āϟ: āĻāχ āϏāĻžāϧāĻžāϰāĻŖ āĻŽā§āϝāĻžāύāĻŋāĻĒ⧁āϞ⧇āĻļāύāϟāĻŋ āĻĢāϞāĻžāĻĢāϞ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰāĻžāϰ āĻ–āϰāϚ āωāĻ˛ā§āϞ⧇āĻ–āϝ⧋āĻ—ā§āϝāĻ­āĻžāĻŦ⧇ āĻšā§āϰāĻžāϏ āĻ•āϰ⧇āϛ⧇, āϝāĻž āĻŽā§‚āϞ āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇ āĻŦā§āϝāϝāĻŧ āĻ•āϰāĻž āϏāĻŽāϝāĻŧ⧇āϰ āĻĒā§āϰāĻžāϝāĻŧ āĻ…āĻ°ā§āϧ⧇āĻ•āĨ¤ āϝāĻžāχāĻšā§‹āĻ•, POSIX āĻŦāĻŋāĻļā§āĻŦ⧇ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧂āĻĒ āĻĢāĻžāĻ‚āĻļāύ āϰāϝāĻŧ⧇āϛ⧇ - fwrite_unlocked. āϏāĻžāϧāĻžāϰāĻŖāĻ­āĻžāĻŦ⧇ āĻŦāϞāϤ⧇ āϗ⧇āϞ⧇, āĻĢā§āϰ⧇āĻĄā§‡āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇āĻ“ āĻāĻ•āχ āĻ•āĻĨāĻž āĻĒā§āϰāϝ⧋āĻœā§āϝāĨ¤ āĻāχāĻ­āĻžāĻŦ⧇, āĻāĻ•āĻœā§‹āĻĄāĻŧāĻž #defines āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āφāĻĒāύāĻŋ āĻ…āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āϞāĻ• āĻ›āĻžāĻĄāĻŧāĻžāχ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•ā§āϰāϏ-āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ āϏāĻŽāĻžāϧāĻžāύ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύ āϝāĻĻāĻŋ āϏ⧇āϗ⧁āϞāĻŋ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āύāĻž āĻšāϝāĻŧ (āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻĒā§āϰāĻžāϝāĻŧāĻļāχ āϘāĻŸā§‡)āĨ¤

fwrite, _fwrite_nolock, setvbuf

āϚāϞ⧁āύ āĻŽā§‚āϞ āĻĒā§āϰāĻœā§‡āĻ•ā§āϟ āĻĨ⧇āϕ⧇ āϏāϰ⧇ āĻāϏ⧇ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦāĻŋāώāϝāĻŧ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āĻĻāĻŋāϕ⧇ āĻŽāύ⧋āϝ⧋āĻ— āĻĻāĻŋāχ: āĻāĻ•āϟāĻŋ āĻŦāĻĄāĻŧ āĻĢāĻžāχāϞ (ā§Ģ⧧⧍ āĻāĻŽāĻŦāĻŋ) āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āϛ⧋āϟ āϛ⧋āϟ āĻ–āĻŖā§āĻĄā§‡â€”āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻāĻ• āĻŦāĻžāχāϟ āĻ•āĻ°ā§‡â€”āϞ⧇āĻ–āĻžāĨ¤ āĻŸā§‡āĻ¸ā§āϟ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ: āĻāĻāĻŽāĻĄāĻŋ āϰāĻžāχāĻœā§‡āύ ā§­ ā§§ā§­ā§Ļā§Ļ, ā§§ā§Ŧ āϜāĻŋāĻŦāĻŋ āĻ°â€ā§āϝāĻžāĻŽ, ⧭⧍ā§Ļā§Ļ āφāϰāĻĒāĻŋāĻāĻŽ āĻāχāϚāĻĄāĻŋāĻĄāĻŋ, ā§Ŧā§Ē āĻāĻŽāĻŦāĻŋ āĻ•ā§āϝāĻžāĻļāĨ¤ Windows 10 ā§§ā§Žā§Ļ⧝, āĻŦāĻžāχāύāĻžāϰāĻŋāϟāĻŋ ā§Šā§¨-āĻŦāĻŋāϟ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦāĻŋāĻ˛ā§āĻĄ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āĻ…āĻĒāϟāĻŋāĻŽāĻžāχāĻœā§‡āĻļāύ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰāĻž āφāϛ⧇, āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāϟāĻŋ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻŋāĻ•ā§āϝāĻžāϞāĻŋ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻžāĨ¤

āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϜāĻ¨ā§āϝ āύāĻŽā§āύāĻž:


#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: 7262221 Âĩs, āĻ—āϤāĻŋ - 70.5 Mb/s āĻ•āϞ āύāĻž āĻ•āϰ⧇ _fwrite_nolock-āĻāϰ āĻ…āĻĒāĻžāϰ⧇āĻļāύ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āϝāĻžāĻ•!

āĻāϰ āĻĒāϰ⧇, āĻŦāĻžāĻĢāĻžāϰ āφāĻ•āĻžāϰ (setvbuf) āύāĻŋāϝāĻŧ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āϝāĻžāĻ•:

āϘāĻžāĻŽ āύāĻž āϭ⧇āϙ⧇ C/C++ āĻĢāĻžāχāϞ I/O āĻ¤ā§āĻŦāϰāĻžāĻ¨ā§āĻŦāĻŋāϤ āĻ•āϰ⧁āύ

5āϟāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āĻ—āĻĄāĻŧ āĻ•āϰ⧇ āĻĄā§‡āϟāĻž āĻĒā§āϰāĻžāĻĒā§āϤ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ; āφāĻŽāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋāϗ⧁āϞāĻŋ āĻ—āĻŖāύāĻž āĻ•āϰāϤ⧇ āϖ⧁āĻŦ āĻ…āϞāϏ āĻ›āĻŋāϞāĻžāĻŽāĨ¤ āφāĻŽāĻžāϰ āϜāĻ¨ā§āϝ, āύāĻŋāϝāĻŧāĻŽāĻŋāϤ HDD-āϤ⧇ 93 āĻŦāĻžāχāϟ āϞ⧇āĻ–āĻžāϰ āϏāĻŽāϝāĻŧ 1 MB/s āĻāĻ•āϟāĻŋ āϖ⧁āĻŦ āĻ­āĻžāϞ āĻĢāϞāĻžāĻĢāϞ, āφāĻĒāύāĻžāϕ⧇ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϏāĻ°ā§āĻŦā§‹āĻ¤ā§āϤāĻŽ āĻŦāĻžāĻĢāĻžāϰ āφāĻ•āĻžāϰ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ (āφāĻŽāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, 256 KB āĻ āĻŋāĻ• āφāϛ⧇) āĻāĻŦāĻ‚ fwrite-āĻāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ _fwrite_nolock/fwrite_unlocked ( āϝāĻĻāĻŋ āĻĨā§āϰ⧇āĻĄ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύāĻž āĻšāϝāĻŧ, āĻ…āĻŦāĻļā§āϝāχ)āĨ¤
āĻ…āύ⧁āϰ⧂āĻĒ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ fread āϏāĻ™ā§āϗ⧇ āĻāĻ•āχāĻ­āĻžāĻŦ⧇. āϝ⧇āĻšā§‡āϤ⧁ āφāĻŽāĻžāϰ āĻšāĻžāϤ⧇ āϞāĻŋāύāĻžāĻ•ā§āϏ āϏāĻš āĻāĻ•āϟāĻŋ āĻšāĻžāĻ°ā§āĻĄāĻ“āϝāĻŧā§āϝāĻžāϰ āĻŽā§‡āĻļāĻŋāύ āύ⧇āχ (āĻāĻ•āĻ•-āĻŦā§‹āĻ°ā§āĻĄ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ āĻ—āĻŖāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ āύāĻž), āϤāĻžāχ āφāĻŽāĻŋ āĻāĻ•āϟāĻŋ āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞ āĻŽā§‡āĻļāĻŋāύ⧇ āĻāĻ•āϟāĻŋ āϏ⧀āĻŽāĻŋāϤ āĻĒāϰ⧀āĻ•ā§āώāĻž āϚāĻžāϞāĻžāύ⧋āϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋ (āĻšāĻžāχāĻĒāĻžāϰ-āĻ­āĻŋ, āĻ“āĻĒ⧇āύāϏ⧁āϏ 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