Блог пользователя SPyofgame

Автор SPyofgame, история, 4 года назад, По-английски

----------

Purpose:

  • First, sorry for my bad English.
  • Second, I know there are lots of topics about this. But after solving a problem that need FastIO, I feel interested in FastIO and decide to do the implementations and comparing them. But it maybe time-consuming so I make this post for ones who maybe try to find the Effeciency-Simple-IO, so you can save time instead of searching more.
  • Third, usually it is need not to use FastIO. In the contest, they usually have twice or more time of the solutions code than the given time limitation. Dont worry about faster IO if it is not needed, you should improve your algorithms first, maybe you can use Bitwise Operations for x8 x32 x64 faster.
  • Fourth, if the problem need to be solve in O(n) ~ O(n log n), and your algorithms work in O(n ^ 2), this Micro-Optimization doesnt help you at all (maybe you will get some more points but hard get AC), you should change the algorithms for further approach.
  • Final, for some problems that needed to be solved by FastIO, you can use the suitable template and modify it for your solving the problem. Dont use the template if you dont really know how to use (I may add a guide path to the post in the future)
  • Conclusion, this post is about comparing the implementations for each version of C++ language and you should choose the most suitable for you.

Here are some implementations to output numbers I found

Time to write first 10.000.000 non-negative numbers

(base on Codeforces Custom Test // GNU G++ 17 7.3.0 // GNU G++ 14 6.4.0 // GNU G++ 11 5.1.0)

Sort by GNU G++ 17 7.3.0
Sort by GNU G++ 14 6.4.0
Sort by GNU G++ 11 5.1.0
Sort by Microsoft Visual C++ 2010
Sort by Microsoft Visual C++ 2017

Time to write 1.000 times first 10000 numbers

(base on Codeforces Custom Test // GNU G++ 17 7.3.0 // GNU G++ 14 6.4.0 // GNU G++ 11 5.1.0)

Sort by GNU G++ 17 7.3.0
Sort by GNU G++ 14 6.4.0
Sort by GNU G++ 11 5.1.0
Sort by Microsoft Visual C++ 2010
Sort by Microsoft Visual C++ 2017

Time to write first 10.000.000 non-positive numbers

(base on Codeforces Custom Test // GNU G++ 17 7.3.0 // GNU G++ 14 6.4.0 // GNU G++ 11 5.1.0)

Sort by GNU G++ 17 7.3.0
Sort by GNU G++ 14 6.4.0
Sort by GNU G++ 11 5.1.0
Sort by Microsoft Visual C++ 2010
Sort by Microsoft Visual C++ 2017

Single Line Template

Putchar Non-recursive toString Implementation
Putchar Non-recursive Dividing Implementation
Putchar Reverse Implementation
Putchar Recursive Implementation
Unlocked-Putchar Non-recursive toString Implementation
Unlocked-Putchar Non-recursive Dividing Implementation
Unlocked-Putchar Reverse Implementation
Unlocked-Putchar Recursive Implementation
Printf Implementation
synchronized(off) Implementation
synchronized(true) Implementation
Cout Implementation
fwrite buffer Implementation

----------

About:

----------

Similiar Topic:

----------

Planning:

  • Test about random 10.000.000 big numbers
  • Test about 10.000.000 numbers 2 ^ k, k integer
  • More implementations (Actually the post is about Faster and Faster Short Output Implementation but I will add some for speed comparing)
  • New output types (long long, double, string)
  • Проголосовать: нравится
  • +62
  • Проголосовать: не нравится

»
4 года назад, # |
Rev. 12   Проголосовать: нравится 0 Проголосовать: не нравится

Post's Source is too big to put into the spoiler :'(

Preparing
»
4 года назад, # |
Rev. 9   Проголосовать: нравится 0 Проголосовать: не нравится

Past: Add and sort Unlocked-Putchar Implementations

Curr: Start working on Input Implementations

Next: Test with Microsoft Visual C++

»
4 года назад, # |
  Проголосовать: нравится +25 Проголосовать: не нравится

let me tell you about c++11:

  • »
    »
    4 года назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    Oh, wow, I thought C++ 17 is always faster ? This is new to me, thanks <3

    I will test C++ 11 and C++ 14 later after the contest. Thanks for your suggestion

    By the way, do you know where can I input large amount of code and count the time to run the program ? I want to test Input Implementations too

»
4 года назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

If you are interested, I have an implementation of fast input and output classes on github. Link.

Behavior is same as std::cin or std::cout in most competitive programming cases: operator<< and operator>> can be used, there is setprecision for real numbers. There is examples of using there.

Your testcase
  • »
    »
    4 года назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Thanks and Yes I am interested <3 But for now I just want to test some implementations which are simple (easy to code and debug or modify) but efficiency to output

»
4 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

does it mean that cout is faster than printf, isn't it?

»
4 года назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Replacing the putchar function with _putchar_nolock which avoids thread-locking overhead in GNU G++17 as follows reduced the execution time of your "Putchar Non-recursive Dividing Implementation" code using Codeforces Custom Test from 3649ms to less than 850ms.

#include <iostream>
using namespace std;

void write_int_aux(int x) {
    if (x > 9) 
        write_int_aux(x/10);
    _putchar_nolock('0'+x%10); }

inline void write_int(int x) {
    if (x < 0) 
        _putchar_nolock('-'), x = -x;
    write_int_aux(x); }

int main() {
    int q = 1e7;
    while (q--) 
        write_int(-q); }
  • »
    »
    4 года назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Oh, I read somewhere that cant use putchar_unlocked() am going to test those

    • »
      »
      »
      4 года назад, # ^ |
      Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

      The function _putchar_nolock is not availble in GNU G++11 5.1.0. The fastest performance of your code with this function (561 msec) is achieved using Microsoft Visual C++ 2010.

      • »
        »
        »
        »
        4 года назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится

        _putchar_nolock is slower than putchar in c++11 but still better option on c++17

        • »
          »
          »
          »
          »
          4 года назад, # ^ |
          Rev. 5   Проголосовать: нравится 0 Проголосовать: не нравится

          Which C++11 compiler, header file and namespace did you use? I got the following error message when I used the GNU G++11 5.1.0 compiler in Codeforces Custom Test with

          #include <iostream>
          using namespace std;
          

          Invocation failed [COMPILATION_ERROR] Can't compile file: program.cpp: In function 'void write_int_aux(int)': program.cpp:7:29: error: '_putchar_nolock' was not declared in this scope

          • »
            »
            »
            »
            »
            »
            4 года назад, # ^ |
              Проголосовать: нравится +5 Проголосовать: не нравится

            _putchar_nolock is not a thing on c++11

            just saying that _putchar_nolock on c++17 is slower than putchar on c++11