Enviado em 12/11/2021 - 17:59h
Boa Tarde a todos,#include <stdio.h> int main(void) { putchar('\n'); }
putchar('\n');
Enviado em 13/11/2021 - 11:42h
Nos meus programas, quando quero apenas pular linha, sempre uso putchar('\n') (ou fputc('\n', arquivo), não não for no terminal). Mas eu raramente uso isso. Sempre que possível, tento combinar as escritas das quebras de linha com alguma operação de escrita mais complexa que venha imediatamente antes ou imediatamente depois.#include <stdio.h> #include <sys/stat.h> int main(void){ struct stat st; lstat(".", &st); // Marcador somente, para eu saber onde acabam as // chamadas referentes à inicialização do programa, // depois das quais começam as providências associ- // adas ao código dentro de main(). putchar('\n'); for(int i=0; i<5; ++i){ lstat(".", &st); putchar('\n'); } lstat(".", &st); }
$ gcc -static -Wall -Werror -O2 -pedantic-errors x.c -o x $ strace ./x execve("./x", ["./x"], 0x7fff130e3f70 /* 63 vars */) = 0 brk(NULL) = 0x195e000 brk(0x195f1c0) = 0x195f1c0 arch_prctl(ARCH_SET_FS, 0x195e880) = 0 uname({sysname="Linux", nodename="kvmsrv01.ap.ppires.org", ...}) = 0 readlink("/proc/self/exe", "/tmp/x", 4096) = 6 brk(0x19801c0) = 0x19801c0 brk(0x1981000) = 0x1981000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) lstat(".", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=33, ...}) = 0 fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 1), ...}) = 0 write(1, "\n", 1 ) = 1 lstat(".", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=33, ...}) = 0 write(1, "\n", 1 ) = 1 lstat(".", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=33, ...}) = 0 write(1, "\n", 1 ) = 1 lstat(".", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=33, ...}) = 0 write(1, "\n", 1 ) = 1 lstat(".", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=33, ...}) = 0 write(1, "\n", 1 ) = 1 lstat(".", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=33, ...}) = 0 write(1, "\n", 1 ) = 1 lstat(".", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=33, ...}) = 0 exit_group(0) = ? +++ exited with 0 +++
#include <stdio.h> int main(void){ putchar('\n'); puts(""); printf("\n"); }
$ gcc -O0 -Wall -Werror -pedantic-errors -fverbose-asm -S y.c -c $ cat y.s /* Algumas linhas de comentário no topo do arquivo suprimidas. */ .text .section .rodata .LC0: .string "" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp # .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp #, .cfi_def_cfa_register 6 # y.c:4: putchar('\n'); movl $10, %edi #, call putchar@PLT # # y.c:5: puts(""); leaq .LC0(%rip), %rdi #, call puts@PLT # # y.c:6: printf("\n"); movl $10, %edi #, call putchar@PLT # movl $0, %eax #, _5 # y.c:7: } popq %rbp # .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0" .section .note.GNU-stack,"",@progbits
$ gcc -O0 -Wall -Werror -pedantic-errors -fverbose-asm -fno-builtin -S y.c -c $ cat y.s /* Algumas linhas de comentário no topo do arquivo suprimidas. */ .text .section .rodata .LC0: .string "" .LC1: .string "\n" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp # .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp #, .cfi_def_cfa_register 6 # y.c:4: putchar('\n'); movl $10, %edi #, call putchar@PLT # # y.c:5: puts(""); leaq .LC0(%rip), %rdi #, call puts@PLT # # y.c:6: printf("\n"); leaq .LC1(%rip), %rdi #, movl $0, %eax #, call printf@PLT # movl $0, %eax #, _5 # y.c:7: } popq %rbp # .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0" .section .note.GNU-stack,"",@progbits[/b]
#include <stdio.h> #include <time.h> #define OP_MAX 100000000u int main(void){ setlinebuf(stdout); // Força buffer orientado a linha, mesmo que não seja um terminal. // Só para garantir a inicialização do stream antes do teste propriamente dito. putchar('\n'); fflush(stdout); clock_t start, end; start=clock(); for(unsigned i=0; i<OP_MAX; ++i) putchar('\n'); end=clock(); fprintf(stderr, "Tempo para %u de putchar()s: %fs.\n", OP_MAX, (double)(end-start)/CLOCKS_PER_SEC); start=clock(); for(unsigned i=0; i<OP_MAX; ++i) puts(""); end=clock(); fprintf(stderr, "Tempo para %u de puts()s: %fs.\n", OP_MAX, (double)(end-start)/CLOCKS_PER_SEC); start=clock(); for(unsigned i=0; i<OP_MAX; ++i) printf("\n"); end=clock(); fprintf(stderr, "Tempo para %u de printf()s: %fs.\n", OP_MAX, (double)(end-start)/CLOCKS_PER_SEC); start=clock(); for(unsigned i=0; i<OP_MAX; ++i) putchar_unlocked('\n'); end=clock(); fprintf(stderr, "Tempo para %u de putchar_unlocked()s: %fs.\n", OP_MAX, (double)(end-start)/CLOCKS_PER_SEC); }
$ gcc -static -Wall -Werror -O2 -pedantic-errors -O2 x.c -o x $ ./x > /dev/null Tempo para 100000000 de putchar()s: 39.047441s. Tempo para 100000000 de puts()s: 39.829803s. Tempo para 100000000 de printf()s: 39.246048s. Tempo para 100000000 de putchar_unlocked()s: 38.999111s. $ gcc -fno-builtin -static -Wall -Werror -O2 -pedantic-errors -O2 x.c -o x $ ./x > /dev/null Tempo para 100000000 de putchar()s: 39.069366s. Tempo para 100000000 de puts()s: 39.968769s. Tempo para 100000000 de printf()s: 41.510248s. Tempo para 100000000 de putchar_unlocked()s: 38.873645s.
$ gcc -static -Wall -Werror -O2 -pedantic-errors -O2 x.c -o x $ ./x >/dev/null Tempo para 1000000000 de putchar()s: 1.632126s. Tempo para 1000000000 de puts()s: 11.005662s. Tempo para 1000000000 de printf()s: 4.055162s. Tempo para 1000000000 de putchar_unlocked()s: 1.761776s. $ gcc -fno-builtin -static -Wall -Werror -O2 -pedantic-errors -O2 x.c -o x $ ./x >/dev/null Tempo para 1000000000 de putchar()s: 2.125477s. Tempo para 1000000000 de puts()s: 9.659515s. Tempo para 1000000000 de printf()s: 22.045084s. Tempo para 1000000000 de putchar_unlocked()s: 1.659177s.
#include <stdio.h> #include <time.h> #define OP_MAX 1000000000u char buffer[OP_MAX+1]; int main(void){ setvbuf(stdout, buffer, _IOFBF, sizeof buffer); // Só para garantir a inicialização do stream antes do teste propriamente dito. putchar('\n'); fflush(stdout); clock_t start, end; start=clock(); for(unsigned i=0; i<OP_MAX; ++i) putchar('\n'); fflush(stdout); end=clock(); fprintf(stderr, "Tempo para %u de putchar()s: %fs.\n", OP_MAX, (double)(end-start)/CLOCKS_PER_SEC); start=clock(); for(unsigned i=0; i<OP_MAX; ++i) puts(""); fflush(stdout); end=clock(); fprintf(stderr, "Tempo para %u de puts()s: %fs.\n", OP_MAX, (double)(end-start)/CLOCKS_PER_SEC); start=clock(); for(unsigned i=0; i<OP_MAX; ++i) printf("\n"); fflush(stdout); end=clock(); fprintf(stderr, "Tempo para %u de printf()s: %fs.\n", OP_MAX, (double)(end-start)/CLOCKS_PER_SEC); start=clock(); for(unsigned i=0; i<OP_MAX; ++i) putchar_unlocked('\n'); fflush(stdout); end=clock(); fprintf(stderr, "Tempo para %u de putchar_unlocked()s: %fs.\n", OP_MAX, (double)(end-start)/CLOCKS_PER_SEC); }
$ gcc -static -Wall -Werror -O2 -pedantic-errors -O2 x.c -o x $ ./x >/dev/null Tempo para 1000000000 de putchar()s: 1.642850s. Tempo para 1000000000 de puts()s: 8.987328s. Tempo para 1000000000 de printf()s: 3.713881s. Tempo para 1000000000 de putchar_unlocked()s: 1.600242s. $ gcc -fno-builtin -static -Wall -Werror -O2 -pedantic-errors -O2 x.c -o x $ ./x >/dev/null Tempo para 1000000000 de putchar()s: 1.654119s. Tempo para 1000000000 de puts()s: 9.137192s. Tempo para 1000000000 de printf()s: 19.001352s. Tempo para 1000000000 de putchar_unlocked()s: 1.483557s.
Enviado em 12/11/2021 - 19:11h
Vou te dar uma ideia simples mas que pode te ajudar decidir qual comando é mais rápido://Inclua o time.h //dentro do main clock_t inicio = clock(); //coloque aqui seu comando pra medir o tempo de execução clock_t fim = clock(); double tempoGasto = (double)(fim - inicio) / CLOCKS_PER_SEC; printf("Comando executou em %lf segundos\n", tempoGasto);
Enviado em 12/11/2021 - 19:24h
Então, depende.Enviado em 12/11/2021 - 20:44h
//Inclua o time.h //dentro do main clock_t inicio = clock(); //coloque aqui seu comando pra medir o tempo de execução clock_t fim = clock(); double tempoGasto = (double)(fim - inicio) / CLOCKS_PER_SEC; printf("Comando executou em %lf segundos\n", tempoGasto);
#include <stdio.h> #include <time.h> int main() { { clock_t inicio = clock(); putchar('\n'); clock_t fim = clock(); double tempoGasto = (double)(fim - inicio) / CLOCKS_PER_SEC; printf("putchar executou em %lf segundos\n", tempoGasto); } { clock_t inicio = clock(); puts(""); clock_t fim = clock(); double tempoGasto = (double)(fim - inicio) / CLOCKS_PER_SEC; printf("puts executou em %lf segundos\n", tempoGasto); } { clock_t inicio = clock(); printf("\n"); clock_t fim = clock(); double tempoGasto = (double)(fim - inicio) / CLOCKS_PER_SEC; printf("printf executou em %lf segundos\n", tempoGasto); } { clock_t inicio = clock(); putchar('\n'); clock_t fim = clock(); double tempoGasto = (double)(fim - inicio) / CLOCKS_PER_SEC; printf("putchar executou em %lf segundos\n", tempoGasto); } }
putchar executou em 0.000059 segundos puts executou em 0.000005 segundos printf executou em 0.000004 segundos putchar executou em 0.000002 segundos
putchar executou em 0.000054 segundos printf executou em 0.000062 segundos puts executou em 0.000066 segundos
Enviado em 12/11/2021 - 21:33h
putchar executou em 0.000059 segundos puts executou em 0.000005 segundos printf executou em 0.000004 segundos putchar executou em 0.000002 segundos
putchar executou em 0.000054 segundos printf executou em 0.000062 segundos puts executou em 0.000066 segundos
Enviado em 12/11/2021 - 21:37h
putchar executou em 0.000059 segundos puts executou em 0.000005 segundos printf executou em 0.000004 segundos putchar executou em 0.000002 segundos
putchar executou em 0.000054 segundos printf executou em 0.000062 segundos puts executou em 0.000066 segundos
Programa IRPF - Guia de Instalação e Resolução de alguns Problemas
Criando uma Infraestrutura para uma micro Empresa
Criar entrada (menuentry) ISO no Grub
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
O Que Fazer Após Instalar Ubuntu 25.04
O Que Fazer Após Instalar Fedora 42
Debian 12 -- Errata - Correções de segurança
Instalando o Pi-Hole versão v5.18.4 depois do lançamento da versão v6.0
Como criar um arquivo ISO de um sistema personalizado (2)
Qbittorrent não faz upload - POP OS 22.04 (2)