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

Автор Hyado, история, 6 лет назад, По-английски

I got stuck in 102253L - Limited Permutation because of slow printf (´・_・`)

Does anyone know why printf is much slower than cout in C++17(64bit)?

I measured execution time in Custom Test

printf

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, a, n) for(ll i = a; i < n; ++i)
int main() {
  ll n = 10000000;
  rep(i, 0, n) printf("%d ", n);
}
  • 3587 ms(GNU C++17 9.2.0 (64bit,2msys))
  • 1996 ms(GNU C++17 7.3.0)

cout

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, a, n) for(ll i = a; i < n; ++i)

int main() {
  ll n = 10000000;
  rep(i, 0, n) cout << 1000000 << " ";
}
  • 1138 ms(GNU C++17 9.2.0 (64bit,2msys))
  • 1544 ms(GNU C++17 7.3.0)
  • Проголосовать: нравится
  • +21
  • Проголосовать: не нравится

»
6 лет назад, скрыть # |
 
Проголосовать: нравится +8 Проголосовать: не нравится

How cout and printf are written are pretty much implementation independent. If you are particularly bent on performance, you can write custom print functions with putchar or fwrite, which will definitely be faster.

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

printf:
0.52user 0.00system 0:00.53elapsed 99%CPU (0avgtext+0avgdata 3500maxresident)k 0inputs+0outputs (0major+124minor)pagefaults 0swaps

cout:
0.56user 0.00system 0:00.56elapsed 99%CPU (0avgtext+0avgdata 3340maxresident)k 0inputs+0outputs (0major+121minor)pagefaults 0swaps

»
6 лет назад, скрыть # |
 
Проголосовать: нравится +39 Проголосовать: не нравится

You can include #include <stdio.h> before #include <bits/stdc++.h> and you will get the same speed as with the 32bit version.