2015-03-14 19:15 GMT-03:00 Marcelo Zimbres <mzim...@gmail.com>:
> em c pela FFTW. Ví algumas pessoas na lista da Boost falando sobre ter
> uma versão em C++, mas parecem discrentes de que um dia a eficiência
> proporcionada pela metaprogramação possa algum dia alcançar o FFTW.
Muito, mas muito estranho.
A metaprogramação teoricamente é tão eficiente quanto funções
estritamente feitas "na mão".
Tem link para essa discussão? Ainda mais vindo do povo da Boost.
Por outro lado, a concordo com Tupinambá sobre o debate principal de
Ninja vs Ninja. Com qualquer tecnologia é assim, e principalmente para
C e C++.
Metaprog não é mágica, é apenas a definição macabra de inlines tipadas
ao extremo, se quiser chamar de uma forma vulgar.
--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~------------------------------
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~------------
2015-03-17 14:14 GMT-03:00 Thiago Adams <thiago...@gmail.com>:
> Até o presente momento não conheço nenhum caso de conversão sem cópia.
Por isso o nome string_ref, não é uma cópia. É uma classe
que representa
uma referência a uma string. Por isso a mesma não copia a string e nem libera
a memória no final. É exatamente equivalente ao POD em C que você usou
como exemplo.
> Ver o caso de ter um allocator diferente entre duas std::string.
>
> Um allocator diferente cria outro tipo.
No string_ref não existe allocator.
* realloc é uma grande vantagem da implementação strs porque é permitido para a implementação aumentar o comprimento do segmento "in place" de tal modo que seja desnecessário copiar o segmento; sts_reserve faz bom uso dessa característica. Porém, quando realloc precisa copiar o segmento, faz efetivamente um memcpy, o que é proibido para objetos C++ não "standard layout".
Para sair dessa lista, envie um e-mail para ccppbrasil-unsubscribe@googlegroups.com
Pra eu saber que não haveria nenhum, eu teria que ler o código
e verificar que cada função é usada apenas uma vez
"Neste programa, que erros de múltipla definição aconteceriam?"
Pra eu saber que não haveria nenhum, eu teria que ler o código
e verificar que cada função é usada apenas uma vez.
O strcopy_s não tem nos outros compiladores? Não é padrao do C 11?
--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~------------------------------
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~------------
--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~------------------------------
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~------------
inline int str_init(struct str* p, const char * text) { int
r = 1;
size_t text_size = strlen(text);
int ismall = (text_size + 1) < LOCAL_BUFFER_SIZE;
char * pcopy = ismall ? p->localbuffer : (char*)malloc(sizeof(char) * (text_size + 1)); if
(pcopy)
{
strncpy(pcopy, text, text_size + 1);
p->ismall = ismall;
p->text = pcopy;
p->size = text_size;
r = 0;
}
return r;
}
Concordo com mzimbres;acrescento que não dá para querer que C++ seja tão rápido quanto C o tempo todo,pois o mesmo adiciona vários níveis de abstração, segurança e simplicidade.
Acho que o padrão de performance de todas as linguagens é o C.A melhor propaganda sempre é "quase tão rápido como o C"Só que o C está meio apagado ultimamente, parece que absorvido e escondido pelo próprio pessoal do C++ incluindo o padrão.Em que o C ou C++ é mais rápido e/ou vice versa?Uma exemplo em que o C++ é mais rapido, é fazer um sort aonde se passa um lambda e este lambda desaparece ficando inline, comparando com um mesmo algoritmo em C que fosse usar uma chamada de funcao não inline.Acho que um programador C, se estivesse preocupado com isso não usaria um ponteiro de funçao. Ja para defender o C++, a melhor propaganda é que neste caso não é preciso se preocupar com nada.O que acham? Outros exemplos?
"Talk is cheap. Show me the code."
Ou no nosso caso aqui na lista:
"Talk is cheap. Show me the benchmarks."
....
Mais uma dúvida:A a = ...;A b;b = std::move(a);Em muitos casos após um move não se deseja mais fazer nada. Mesmo assim o compilador vai chamar o destructor.Então no caso do unique_ptr movido, aquele cara que foi movido vai ter o destructor chamado e vai ter um if para verificar se precisa fazer algo. Isso é um overhead (bem pequeno) do C++ em relação ao C. Em C, se eu entrego um ponteiro não é preciso fazer mais nada.
Acho que não fale a pena entrar em muitos detalhes disto e discutir mas falei apenas para levantar a questão. Este overhead apesar de pequeno, não poderia ser usado em uma lib padrão por exemplo que deveria ter a melhor performance já que não se sabe os requisitos de quem usa.
Implementation Lines per second
python (default) 3,571,428
cin (default/naive) 819,672
cin (no sync) 12,500,000
fgets 14,285,714
Acho que não fale a pena entrar em muitos detalhes disto e discutir mas falei apenas para levantar a questão. Este overhead apesar de pequeno, não poderia ser usado em uma lib padrão por exemplo que deveria ter a melhor performance já que não se sabe os requisitos de quem usa.
Agora com C++ 14, é possível usar unique_ptr e jogar a conexão para dentro do lambda.unique_ptr< HttpConnection > spconn;RunAsync ( [sq = spconn]] {...});Chamar o destrutor de spcon após ter sido movido é perda de tempo.
Não mencionei clareza de código.
Mencionei todos os /* if (error == 0) goto cleanup */ que estão omitidos dos típicos exemplos de "C é mais econômico" como os dados anteriormente, que revelam a lista com todos os supostos ifs inúteis do argumento inicial.
Os ifs que são supostamente inúteis não são inúteis e refletem todos aqueles ifs que existem no mundo real para verificar as condições de erro em tempo de execução que exigem a limpeza sistemática dos recursos alocados até a etapa presente do procedimento.
Esses exemplos artificiais não são bons pra julgar qual if é útil ou inútil.
unique_ptr é um desperdício apenas em programas onde erros jamais acontecerão e portanto existe certeza de que um recurso alocado na etapa anterior não pode vazar no decorrer das etapas sendo avaliadas.
O seu exemplo é um exemplo onde o programa aloca uma tarefa assíncrona para o qual ele movimenta um pacote de argumentos úteis; milagrosamente, a alocação da tarefa assíncrona não falha e portanto não é necessário verificar se o ponteiro foi ou não foi "movimentado" com sucesso.
Um programa em C do mundo real teria paranóicas verificações de falha e listas de free(p) e p = NULL .
Abraços!
P.
>Eles existem. São horríveis, e somente existem no Linux pois seu criador pensa como você em >termos da superioridade da linguagem C, mas precisa desses artefatos de poluição que você cita >não precisar.
2015-03-20 18:40 GMT-03:00 Thiago Adams <thiago...@gmail.com>:
.........
Entendo. Mas ainda preciso entender o porquê de você não precisar dos
"ifs desnecessários". O Linux precisa, e é em C. O C++ precisa. Só
você não? Tem algúm método de limpar recursos que não conheço? Estou
muito curioso!
Testei em um GCC online 4.8 e unique_ptr ficou pior em todos os casos.
Agora indo além no assunto otimização, se os compiladores trabalharem tão bem haveria muitas outras coisas que poderiam ser simplificadas na linguagem.Por exemplo, no C++ é possível criar objeto no heap ou stack. Se este conceito fosse unificado na linguagem e os compiladores fossem inteligentes eles poderiam decidir se usariam o objeto no stack ou heap assim teria uma forma unica de criar um objeto.
O propósito deste teste é verificar o overhead de unique_ptr.
Você ainda está usando realloc, que é uma óbvia vantagem da sua implementação de vetor.
Este teste não é conclusivo sobre o overhead de unique_ptr.
Aposto dez reais que um profiler indicará a diferença dominante estando entre realloc versus new[]/delete[].
Abraços!
P.