alexmcmahon's blog

By alexmcmahon, history, 6 months ago, In English

Hello, Codeforces!

I'm excited to share my C++ library that can significantly improve the performance of your solutions, especially when dealing with large input and output.

https://github.com/emeraldacoustics/fast-io

Example

For years, I've been using this library myself, and it consistently delivers:

  • 5x faster I/O on average: Solve problems quicker and avoid unnecessary timeouts.

  • Blazing-fast performance for large data: Notice a 10x speedup for inputs/outputs exceeding 1MB.

But speed isn't everything! This library also prioritizes ease of use:

  • Seamless integration: Simply replace cin and cout with fin and fout in your code.

  • Familiar syntax: The library implements standard C++ stream operators for an intuitive experience.

  • Extended Compatibility: Handles all fundamental data types and offers precision control for floating-point numbers.

I'm confident this library can be a valuable asset for you, especially when dealing with large data. While this is just the first step, stay tuned for future posts where I'll introduce more tools and techniques to help you conquer Codeforces!

Thank you.

  • Vote: I like it
  • +33
  • Vote: I do not like it

»
6 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Auto comment: topic has been updated by alexmcmahon (previous revision, new revision, compare).

»
6 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Auto comment: topic has been updated by alexmcmahon (previous revision, new revision, compare).

»
6 months ago, # |
  Vote: I like it -8 Vote: I do not like it

Wow, this library is wonderful!

This is the most easy-to-use fast I/O library I've ever seen. Replacing cin and cout was a breeze.

I also love your recent repositories. Are you still working on them?

  • »
    »
    6 months ago, # ^ |
      Vote: I like it +1 Vote: I do not like it

    Thanks. I've been working on new competitive algorithm repos. I'll post them as soon as I finish the documentation.

»
6 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Does this work for interactive problems?

  • »
    »
    5 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    To be honest, no. Besides, interactive problems typically involve smaller data exchanges for communication with the judge

»
6 months ago, # |
  Vote: I like it 0 Vote: I do not like it

I saw your repository and would you mind telling how were you able to achieve those optimizations. Great work btw

  • »
    »
    5 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    The key idea is to reduce the number of calling fread() and fwrite() functions.

»
5 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Great work!!

»
5 months ago, # |
  Vote: I like it +10 Vote: I do not like it

did u do any comparison with the ios default fastIO:
cin.tie(0)->sync_with_stdio(0)??

  • »
    »
    5 months ago, # ^ |
    Rev. 2   Vote: I like it -14 Vote: I do not like it

    Aye, of course. I insert ios::sync_with_stdio(false); in my code by default. But, there are some problems where tie() and sync_with_stdio() ain't enough.

    • »
      »
      »
      5 months ago, # ^ |
        Vote: I like it -13 Vote: I do not like it

      Indeed. tie and sync_with_stdio are never enough especially for Chinese cp platforms. That's why we need additional fast IO libraries.

    • »
      »
      »
      5 months ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      So with the ios, 5 times faster? YES

»
5 months ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

It's quite useful, but its total size reaches 11.6 KB. Completely pasting it in our code will significantly increase our code size. Could you please compress your code a bit? alexmcmahon

  • »
    »
    5 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Thanks for your kind suggestion. I agree with the idea that the code size is quite humongous, and using stringstream to resolve the issue is being considered.

»
5 months ago, # |
  Vote: I like it -11 Vote: I do not like it

please let me know how to use it!!

  • »
    »
    5 months ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    Oh, my pleasure. Copy fiostream_x86.hpp source into your solution. If you need to input or output 128-bit integers, use fiostream_x64.hpp.

    Replace cin with fin, cout with fout, and endl with fendl.

    When you are testing fast-io via standard input and output, don't forget to input a null character at the end of your input, i.e., Ctrl+Z in Windows.

    • »
      »
      »
      4 months ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      Sorry I am new to computer stuff, when I have to use long long/long long int/long double, I need to use fiostream_x64.hpp, for int/double fiostream_x86.hpp is ok. Is my understanding correct?

      • »
        »
        »
        »
        4 months ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        I'm afraid not. fiostream_x86.hpp works for long long and long double. But you must choose fiostream_x64.hpp if 128-bit integers have to be input or output.

»
5 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Why are we downvoting the comments again?

  • »
    »
    5 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    I have no idea why they're downvoting this blog and its comments without any reason. I think this Fast I/O would give us a big help, and that no one would downvote it. I wanna know what the downvoters think. Why don't they just express their ideas about this blog?

»
5 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Have you tested it rigorously? In other words, can we be 100% confident that your program is correct? :)

  • »
    »
    5 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Yes, I have. My friends and I have tested this library for over 5 years, which has given us high confidence in its ability to handle a wide range of exceptions. This library has proven its reliability and efficiency on various CP platforms. I assure you that this library works correctly and provides the same behavior as the standard I/O streams.

    • »
      »
      »
      5 months ago, # ^ |
      Rev. 4   Vote: I like it 0 Vote: I do not like it

      Library is 5 years old and using namespaces std; is still there in header files? :)

      If you wrote custom stream buffers instead, everyone would be able to use them with other streams too.

      BTW, I wrote simple test program, ran it and got segmentation fault in fistream::next_buffer(). Maybe I did something wrong but let us consider the following program:

      #include <iostream>
      #include <string>
      
      int main()
      {
          std::cout << "Enter name: ";
      
          std::string name;
          std::cin >> name;
      
          return 0;
      }
      

      After replacement std::cout with fout and std::cin with fin we have this one:

      #include "fiostream_x86.hpp"
      #include <string>
      
      int main()
      {
          fout << "Enter name: ";
      
          std::string name;
          fin >> name;
      
          return 0;
      }
      

      But it does not even compile:

      fiostream_test.cpp:10:9: error: no match for ‘operator>>’ (operand types are ‘fistream’ and ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’})
      
      • »
        »
        »
        »
        5 months ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        Please have a look at fistream and fostream declaration. I'm afraid this library doesn't support input and output for std::string.

        fistream & operator >> (char &);
        fistream & operator >> (char *);
        fistream & operator >> (int &);
        fistream & operator >> (unsigned int &);
        fistream & operator >> (long long &);
        fistream & operator >> (unsigned long long &);
        fistream & operator >> (__int128 &);
        fistream & operator >> (unsigned __int128 &);
        fistream & operator >> (float &);
        fistream & operator >> (double &);
        fistream & operator >> (long double &);
        

        Thanks for your comment and I'll keep that in mind in updating my library.

»
5 months ago, # |
  Vote: I like it +3 Vote: I do not like it

I didn't know there were other competitive programmers in Ireland

»
4 months ago, # |
  Vote: I like it 0 Vote: I do not like it

main.cpp:1:10: fatal error: fiostream_x86.h: No such file or directory 1 | #include "fiostream_x86.h" | ^~~~~~~~~~~~~~~~~ compilation terminated.

  • »
    »
    4 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Do you mind sharing your main.cpp so that I can help you fix the errors?

»
4 months ago, # |
  Vote: I like it +1 Vote: I do not like it

eXXXXXXXXXXXXXXXXXXcellent work!

»
4 months ago, # |
  Vote: I like it 0 Vote: I do not like it

does this library use any x86 specific instruction ?? cause the files in the repo were named using it!

»
4 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Maybe I'm just stupid/ignorant at this point, but could anyone tell me how to use custom libraries in online judges in a reasonable way?

  • »
    »
    4 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Instead of including the custom libraries in the header, you can copy them into your source code if you want to use them for online judges.

»
3 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Nice. I have always wondered. How does one go about learning enough C++ to be able to code something like this?