{"id":465,"date":"2022-04-01T09:29:05","date_gmt":"2022-04-01T12:29:05","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/competir\/?page_id=465"},"modified":"2022-04-01T09:37:10","modified_gmt":"2022-04-01T12:37:10","slug":"melhorando-o-desempenho-da-entrada-e-saida-c","status":"publish","type":"page","link":"http:\/\/www.galirows.com.br\/meublog\/competir\/dicas\/otimizacoes-para-o-codigo\/melhorando-o-desempenho-da-entrada-e-saida-c\/","title":{"rendered":"Melhorando o desempenho da entrada e sa\u00edda [C++]"},"content":{"rendered":"\n<p id=\"yui_3_17_2_1_1648814988438_7773\">Inicialmente foi recomendo utilizar as instru\u00e7\u00f5es <em>scanf <\/em>e <em>printf <\/em>ao inv\u00e9s de <em>cin <\/em>e <em>cout<\/em>, mesmo para a linhagem C++. A quest\u00e3o do desempenho entre essa instru\u00e7\u00f5es equivalentes \u00e9 verdadeira, mas \u00e9 poss\u00edvel obter o mesmo desempenho com <em>cin\/cout<\/em> do que \u00e9 obtido com <em>scanf\/printf<\/em>.<\/p>\n\n\n\n<pre id=\"yui_3_17_2_1_1648814988438_7785\" class=\"wp-block-code\"><code class=\"\">ios_base::sync_with_stdio(false);<br>cin.tie(NULL);<\/code><\/pre>\n\n\n\n<p id=\"yui_3_17_2_1_1648814988438_7787\">A primeira instru\u00e7\u00e3o \u00e9 um membro est\u00e1tico da fun\u00e7\u00e3o <em>std::ios_base<\/em>. Ela ativa ou desativa a sincroniza\u00e7\u00e3o dos fluxos no padr\u00e3o da linguagem C++ com seus fluxos da linguagem C correspondente. Definir <em>sync_with_stdio (false)<\/em> evita essa sincroniza\u00e7\u00e3o antes das opera\u00e7\u00f5es de entrada e sa\u00edda.<br><br>A instru\u00e7\u00e3o <em>tie()<\/em> \u00e9 um m\u00e9todo que garante o esvaziamento do <em>cout<\/em> antes do <em>cin<\/em> aceitar uma entrada e \u00e9 importante na utiliza\u00e7\u00e3o do console, que necessita a atualiza\u00e7\u00e3o constante, mas acaba retardando a execu\u00e7\u00e3o com muitas entradas e sa\u00eddas (como \u00e9 o caso da programa\u00e7\u00e3o competitiva).<br>Por isso \u00e9 interessante definir a instru\u00e7\u00e3o com um ponteiro NULL.<\/p>\n\n\n\n<p id=\"yui_3_17_2_1_1648814988438_7796\">Agora, especificamente em rela\u00e7\u00e3o ao <em>cout<\/em>, embora utilizemos de maneira indiscriminada o <em>cout&lt;&lt;&#8216;\\n&#8217;<\/em> e o <em>cout&lt;&lt;endl<\/em> para gerar uma nova linha, existe uma diferen\u00e7a no desempenho. A instru\u00e7\u00e3o <em>cout&lt;&lt;endl<\/em> e equivalente \u00e0 <em>cout&lt;&lt;\u2018\\n\u2019&lt;&lt;flush<\/em>, e com isso o uso <em>endl <\/em>\u00e9 mais lento porque for\u00e7a o fluxo de descarga. Sendo assim, priorize a op\u00e7\u00e3o com o <em>\\n<\/em>.<\/p>\n\n\n\n<p>Para um c\u00f3digo que faz a leitura de uma grande quantidade de valores e mostra o valor lido imediatamente ap\u00f3s sua leitura, o c\u00f3digo ser\u00e1 o mostrado abaixo, com a inclus\u00e3o das linhas 7 e 8 e o uso do<em> \\n<\/em> na linha 12. Nada realmente dif\u00edcil.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp line-numbers\">#include &lt;iostream> \nusing namespace std;\n \nint main() {\n    int i,cont=0;\n \n    ios_base::sync_with_stdio(false);\n    cin.tie(NULL);   \n \n    do {\n        cin >> i;\n        cout &lt;&lt; i &lt;&lt; '\\n';\n        cont++;\n    } while (cont &lt; 999999);\n  \n    return 0;\n}<\/code><\/pre>\n\n\n\n<p id=\"yui_3_17_2_1_1648814988438_7805\">Para fins de compara\u00e7\u00e3o no tempo de execu\u00e7\u00e3o, preparei dois c\u00f3digos que podem ser acessados a seguir. Ambos fazem a mesma coisa, mas o primeiro n\u00e3o foi otimizado e leva em torno de 14 vezes mais tempo para executar com a quantidade de entradas colocadas para teste.<\/p>\n\n\n\n<ul class=\"wp-block-list\" id=\"yui_3_17_2_1_1648814988438_2154\"><li><a href=\"https:\/\/ideone.com\/g6l37f\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/ideone.com\/g6l37f<\/a> (vers\u00e3o n\u00e3o otimizada): executou em 0,01341 segundo<\/li><li><a href=\"https:\/\/ideone.com\/wy82qv\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/ideone.com\/wy82qv<\/a> (vers\u00e3o otimizada): executou em 0,000915 segundo<\/li><\/ul>\n\n\n\n<p id=\"yui_3_17_2_1_1648814988438_2179\">E s\u00f3 para complementar, tamb\u00e9m fiz uma vers\u00e3o sem a otimiza\u00e7\u00e3o, mas utilizando <em>scanf <\/em>e <em>printf <\/em>em C++, e uma vers\u00e3o em linguagem C. Ambas s\u00e3o bem melhores do que a vers\u00e3o n\u00e3o otimizada do c\u00f3digo, mas &#8220;perdem&#8221; para a vers\u00e3o otimizada.<\/p>\n\n\n\n<ul class=\"wp-block-list\" id=\"yui_3_17_2_1_1648814988438_2154\"><li><a href=\"https:\/\/ideone.com\/xsvKCY\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/ideone.com\/xsvKCY<\/a>: executou em 0,001165 segundo<\/li><li><a href=\"https:\/\/ideone.com\/mE3LpS\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/ideone.com\/mE3LpS<\/a>: executou em 0,001127 segundo<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Inicialmente foi recomendo utilizar as instru\u00e7\u00f5es scanf e printf ao inv\u00e9s de cin e cout, mesmo para a linhagem C++. A quest\u00e3o do desempenho entre essa instru\u00e7\u00f5es equivalentes \u00e9 verdadeira, mas \u00e9 poss\u00edvel obter o mesmo desempenho com cin\/cout do que \u00e9 obtido com scanf\/printf. A primeira instru\u00e7\u00e3o \u00e9 um membro est\u00e1tico da fun\u00e7\u00e3o std::ios_base. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":460,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-465","page","type-page","status-publish","hentry"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/pages\/465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/comments?post=465"}],"version-history":[{"count":2,"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/pages\/465\/revisions"}],"predecessor-version":[{"id":471,"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/pages\/465\/revisions\/471"}],"up":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/pages\/460"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/media?parent=465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}