Ainda é mais lento em todos os compiladores que eu já usei :P.
Mas isso também é devido de a implementação do iostreams ser
normalmente feita sobre snprintf.
PS: Existem outros motivos também, como excesso de virtual calls.
[snip]
--
Felipe Magno de Almeida
Hehehe, faça benchmarks de printf e iostream, você verá que
não é tao irrisório.
> --
> P.
Solicitações diferentes requerem recursos diferentes.
Guedes.
Talvez as libs em C sejam significantemente mais rapidas. Quando eu
participei da maratona de programacao, eramos orientados a usar printf
em vez do tradicional "cout <<", pq mesmo sendo mais elegante e type
safe, era mais lento. Se eu estivesse no linux agora testaria isso =)
olá,2009/2/18 Erivaldo <des...@gmail.com>Talvez as libs em C sejam significantemente mais rapidas. Quando eu
participei da maratona de programacao, eramos orientados a usar printf
em vez do tradicional "cout <<", pq mesmo sendo mais elegante e type
safe, era mais lento. Se eu estivesse no linux agora testaria isso =)
Sim, eu também participei da maratona de programação e, na época, fizemos um teste usando o gcc no linux, e realmente o tempo de execução do "cout <<" era quaseo dobro do tempo gasto para um printf.
Acredito que, por mais deselegante que seja, essa fusão de C/C++ em alguns momentos é necessária, como em sistemas embarcados, onde performance é um fator primordial. Além disso, temos em muitos sistemas esta fusão por causa da existência de codigo legado em C. Aí, geralmente nao tem jeito...
se eh pra usar C++ a partir de C, vc pode usar estruturas de dados de
C++ mesmo, e encapsular suas operacoes através de funções q recebam um
ponteiro para o objeto (void* ?) como parametro. E quando incluir o
header no arquivo de implementacao fazer algo como:
extern "C" {
#include "my_header.h"
}
Não sei se eh necessario colocar o extern "C" na definicao da funcao
tbm, acho que nao...
A questão não é se C funciona no C++ ou se é mais rápido. A questão é
se utilizar C dentro de C++ é aceitável. Por exemplo, se fosse
possível utilizar C++ dentro do Java você faria um projeto Java com
códigos/funções/libs de C++ misturado? Não seria estranho ou
conceitualmente errado?
Outra coisa sobre as libs cstdlib e ctime, elas são consideradas libs
do C++ ou são apenas "workaround" para funcionar códigos do C?
Espero ter deixado claro.
Opa, calma pessoal, acho que estamos fugindo um pouco do assunto ou eu
não expliquei corretamente minha dúvida.
A questão não é se C funciona no C++ ou se é mais rápido. A questão é
se utilizar C dentro de C++ é aceitável. Por exemplo, se fosse
possível utilizar C++ dentro do Java você faria um projeto Java com
códigos/funções/libs de C++ misturado? Não seria estranho ou
conceitualmente errado?
Outra coisa sobre as libs cstdlib e ctime, elas são consideradas libs
do C++ ou são apenas "workaround" para funcionar códigos do C?
Você tentou jogar num arquivo? Ou enviar por rede
em uma rede gigabit...
Estes costumam ser I/Os mais comuns do que jogar
em uma tela em um programa real AFAIK.
[snip]
Eu estava falando de *printf e iostreams, nao std::cout e printf.
Você executou estes testes quantas vezes? Esse programa não mostra
um programa real, apenas um caso de brincadeira. Este por exemplo
não causa problemas de caching em virtual functions, não causa
problemas com o numero de chamadas a funções virtuais de streambuf
e assim vai.
Iostreams são sim mais lentos que printf e fazem diferença para muitas
aplicações que envolvem também I/Os.
Só que normalmente não pra quem quer imprimir log e número de linha :P.
> Jogar por uma rede gigabit não será mais um teste das funções
> convencionais de formatação.
> Nem a <stdio.h> nem a <iostream> possuem um formatador para canal de
> rede.
Estou falando de programas sendo utilizados normalmente por aí que
precisam de formatação, estes podem fazer através de printf e familia
ou por iostreams. Quem precisa de velocidade usa *printf, os que não
precisam (eu incluindo) usam iostreams e boost::lexical_cast.
> Eu terei que programar meu próprio canal de rede e portanto nosso
> benchmarking não será mais um benchmarking das bibliotecas de
> formatação e sim um benchmarking no meu programa de rede.
> Supondo que eu programe um canal de rede e compartilhe esse canal com
> ambas as implementações o tempo deverá ser o mesmo.
Dei como exemplo de rede e arquivos pois os mesmos possuem throughput
muito maior que imprimir no console, que é completamente inútil pra
aplicações comuns, mesmo testes maratona não usam console pra verificação.
> Eu terei que programar meu próprio canal de rede e portanto nosso
> benchmarking não será mais um benchmarking das bibliotecas deDei como exemplo de rede e arquivos pois os mesmos possuem throughput
> formatação e sim um benchmarking no meu programa de rede.
> Supondo que eu programe um canal de rede e compartilhe esse canal com
> ambas as implementações o tempo deverá ser o mesmo.
muito maior que imprimir no console, que é completamente inútil pra
aplicações comuns, mesmo testes maratona não usam console pra verificação.
Não tem como fugir. O que dá pra fazer é tentar separar a aplicação em
camadas, uma de baixo nível em C e assembly e uma de "alto nivel" em C++.
--
Marcelo Castellani
--------------------------------------------------------------------------
http://www.hypequino.com
--
"Seu trabalho vai preencher uma grande parte da sua vida, e a única
maneira de se sentir verdadeiramente satisfeito é fazendo o que
acredita ser um grande trabalho. E a única maneira de fazer um grande
trabalho é amando o que você faz". (Steve Jobs)
--------------------------------------------------------------------------
E nesse tem uma diferença razoavel de tempo entre os dois.
Considero 39,84% a mais uma diferença consideravel.
> Que tipo de programas usam formatação de strings em loops CPU bound?
Parsing é um exemplo bem óbvio.
> --
> P.
Digo, geração de texto pra parsing.
Pedro,
Se suas aplicações não fazem uso disso, sorte sua.
Mas o IOStreams é mais lento que printf (e consideravelmente)
em todas as implementações até hoje!
E onde isso é importante, o printf e familia devem ser utilizados.
Você pode discutir quanto quiser, enquanto IOStreams forem lento
isso não vai mudar.