# Aiuto per Fast I/O

**URL:** <https://forum.olinfo.it/t/aiuto-per-fast-i-o/6161>\
**Category:** Linguaggi\
**Created:** [21 Aprile 2020, 2:44pm UTC](https://forum.olinfo.it/t/aiuto-per-fast-i-o/6161 "2020-04-21T14:44:16Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Mat0k3](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/m/35a633/32.png) [@Mat0k3](https://forum.olinfo.it/u/Mat0k3)\
**Post date:** [21 Aprile 2020, 2:44pm UTC](https://forum.olinfo.it/t/aiuto-per-fast-i-o/6161/1 "2020-04-21T14:44:16Z")

</div>

Vorrei imparare a velocizzare i tempi di input e output, per ora conosco solo il fatto di aggiungere queste due righe:

```auto
ios_base::sync_with_stdio(false); 
cin.tie(NULL);

```

Conosco anche getc\_unlocked() e getchar\_unlocked() ma non riesco ad utilizzarli.  
Mi potreste dire come funziona e qual è il modo più ottimale per velocizzare l’input e l’output oppure se conoscete un sito abbastanza chiaro dove poterli studiare

---

<div class="post-metadata">

**Author:** ![zJack1342](https://forum.olinfo.it/user_avatar/forum.olinfo.it/zjack1342/32/711_2.png) [@zJack1342](https://forum.olinfo.it/u/zJack1342)\
**Post date:** [21 Aprile 2020, 4:37pm UTC](https://forum.olinfo.it/t/aiuto-per-fast-i-o/6161/2 "2020-04-21T16:37:20Z")

</div>

Per la maggior parte dei problemi quelle due righe sono più che sufficienti. Se ti serve un input ancora più veloce è molto probabile che la tua soluzione risulti lenta.  
Se proprio vuoi usare la fast i/o devi utilizzare quelle due funzioni e fare il parsing carattere per carattere. Occhio che la versione unlocked puoi utilizzarla solo su linux.  
Esempio per leggere e scrivere un **intero** :

```auto
inline static int scanInt(){
  register int n = 0;
  register int neg = 1;
  register char c = getchar_unlocked();
  if(c == '-')neg = -1;
  while(c <'0' || c > '9'){
    c = getchar_unlocked();
    if(c == '-')neg = -1;
  }
  while(c >= '0' && c <= '9'){
    n= (n << 3) + (n << 1) + c - '0';
    c=getchar_unlocked();
  }
  return n * neg;
}

inline static void writeInt(int v){
  static char buf[14];
  register int p=0;
  if(v==0){
    putchar_unlocked('0');
    return;
  }
  if(v < 0){
    putchar_unlocked('-');
    v = -v;
  }
  while(v){
    buf[p++] = v % 10;
    v /= 10;
  }
  while(p--){
    putchar_unlocked(buf[p] + '0');
  }
}

```

Occhio che queste due funzioni non le ho ancora testate, potrebbero essere non corrette 😅

---

<div class="post-metadata">

**Author:** ![Mat0k3](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/m/35a633/32.png) [@Mat0k3](https://forum.olinfo.it/u/Mat0k3)\
**Post date:** [21 Aprile 2020, 5:59pm UTC](https://forum.olinfo.it/t/aiuto-per-fast-i-o/6161/3 "2020-04-21T17:59:39Z")

</div>

ah ok ecco perché non funzionavano perché non sono da linux grazie comunque

---

<div class="post-metadata">

**Author:** ![simpatine](https://forum.olinfo.it/user_avatar/forum.olinfo.it/simpatine/32/444_2.png) [@simpatine](https://forum.olinfo.it/u/simpatine)\
**Post date:** [21 Aprile 2020, 7:15pm UTC](https://forum.olinfo.it/t/aiuto-per-fast-i-o/6161/4 "2020-04-21T19:15:15Z")

</div>

Per una lettura e scrittura ancora più veloce ti consiglio di usare il metodo di @MyK_00L🌚 [https://github.com/myk00l/fastio](https://github.com/myk00l/fastio)

---

<div class="post-metadata">

**Author:** ![Mat0k3](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/m/35a633/32.png) [@Mat0k3](https://forum.olinfo.it/u/Mat0k3)\
**Post date:** [21 Aprile 2020, 7:41pm UTC](https://forum.olinfo.it/t/aiuto-per-fast-i-o/6161/5 "2020-04-21T19:41:46Z")

</div>

Mi potresti spiegare come funziona? Dato che gli ho dato uno sguardo ma penso di non aver be capito cosa devo fare

---

<div class="post-metadata">

**Author:** ![simpatine](https://forum.olinfo.it/user_avatar/forum.olinfo.it/simpatine/32/444_2.png) [@simpatine](https://forum.olinfo.it/u/simpatine)\
**Post date:** [22 Aprile 2020, 10:08am UTC](https://forum.olinfo.it/t/aiuto-per-fast-i-o/6161/6 "2020-04-22T10:08:22Z")

</div>

Allora devi includere la libreria

```auto
#include <unistd.h>

```

Poi devi dichiarare, a seconda se vuoi input o output

```auto
#define NBIN 8000000
#define NBOUT 20
//NBIN e NBOUT variano a seconda della dimensione dell'input e dell'output

unsigned char input[NBIN];
unsigned inputi;

unsigned char output[NBOUT];
unsigned outputi;

```

Poi scrivere nel main `read(0,input,NBIN);` ti metterà i primi `NBIN` caratteri dello standard input in `input` e scrivere `write(1,output,outputi);` ti metterà i primi `outputi` caratteri di `output` nello standard output, queste due funzioni le richiami all’inizio e alla fine, nel mezzo richiami le macro che sono definite (ovviamente metti solo quelle che ti servono) che ti convertono i caratteri salvati in `input` in numeri e viceversa.

---

<div class="post-metadata">

**Author:** ![Mat0k3](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/m/35a633/32.png) [@Mat0k3](https://forum.olinfo.it/u/Mat0k3)\
**Post date:** [22 Aprile 2020, 10:43am UTC](https://forum.olinfo.it/t/aiuto-per-fast-i-o/6161/7 "2020-04-22T10:43:45Z")

</div>

Grazie ma penso che continuerò a usare il fast input quello più standard per comodità più che altro

---

<div class="post-metadata">

**Author:** ![simpatine](https://forum.olinfo.it/user_avatar/forum.olinfo.it/simpatine/32/444_2.png) [@simpatine](https://forum.olinfo.it/u/simpatine)\
**Post date:** [22 Aprile 2020, 2:21pm UTC](https://forum.olinfo.it/t/aiuto-per-fast-i-o/6161/8 "2020-04-22T14:21:57Z")

</div>

Sì, ammetto che una persona debba proprio volerlo quel primo tempo per usare qualcosa del genere 😅

---

<div class="post-metadata">

**Author:** ![Mat0k3](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/m/35a633/32.png) [@Mat0k3](https://forum.olinfo.it/u/Mat0k3)\
**Post date:** [22 Aprile 2020, 2:23pm UTC](https://forum.olinfo.it/t/aiuto-per-fast-i-o/6161/9 "2020-04-22T14:23:39Z")

</div>

Farebbe molto comodo se è cosi pigro per non cercare una soluzione più ottimale però comunque utilizzare un minimo di fast input può essere sempre comodo 😅
