Texto sobre performance, achei muito pertinente

90 views
Skip to first unread message

Rodrigo Strauss

unread,
Feb 6, 2014, 11:06:36 AM2/6/14
to ccppbrasil
Olha o que eu achei procurando sobre benchmarks do dynamic_cast:

Performance is meaningless without comparing equivalent functionality. Most people say dynamic_cast is slow without comparing to equivalent behavior. Call them out on this. Put another way:

If 'works' isn't a requirement, I can write code that fails faster than yours.

There are various ways to implement dynamic_cast, and some are faster than others. Stroustrup published a paper about using primes to improve dynamic_cast, for example. Unfortunately it's unusual to control how your compiler implements the cast, but if performance really matters to you, then you do have control over which compiler you use.

However, not using dynamic_cast will always be faster than using it — but if you don't actually need dynamic_cast, then don't use it! If you do need dynamic lookup, then there will be some overhead, and you can then compare various strategies.


Rodrigo Strauss
http://www.1bit.com.br
@rodrigostrauss

Djalma Rosa dos Santos Filho

unread,
Feb 6, 2014, 11:26:18 AM2/6/14
to ccppbrasil
Poucas vezes precisei usar dynamic_cast, nunca o profiler me apontou seu uso como um hotspot.
De qualquer maneira acredito que fazer muito downcast pode ser um sinal ruim de OOD, voces nao acham?


--
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
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
 

Bruno Sanches

unread,
Feb 6, 2014, 11:45:52 AM2/6/14
to ccppb...@googlegroups.com
Na maioria das vezes que vejo comentários do tipo "C++ é mais lento que C", nunca é uma comparação justa. 

Se eu pegar um código em C, ele de certa forma é C++ também, se eu compilar ele com um compilador C++, ele vai ficar mais lento?

Bruno Sanches
========================
http://www.pontov.com.br

Уθя¡ςκ

unread,
Feb 6, 2014, 11:56:31 AM2/6/14
to ccppb...@googlegroups.com
On Thursday, February 6, 2014 2:45:52 PM UTC-2, Bruno Sanches wrote:
Na maioria das vezes que vejo comentários do tipo "C++ é mais lento que C", nunca é uma comparação justa. 

Se eu pegar um código em C, ele de certa forma é C++ também, se eu compilar ele com um compilador C++, ele vai ficar mais lento?

Sempre encaro essa comparação com o comparador tendo a intenção de se referir ao uso idiomático de C++ que corresponde ao uso
idiomático C para a mesma tarefa, porque, não faz muito sentido apelar pra C compilar em compilador C++. O ponto é que, se o C++
idiomático tá de empecilho em algum ponto, e sabe-se que descartando-o para o Czão consegue-se algum ganho, isto está de fato
disponível.

Thiago Adams

unread,
Feb 6, 2014, 11:56:41 AM2/6/14
to ccppb...@googlegroups.com
As vezes as pessoas usam erroneamente o dynamic_cast para perguntar o tipo do objeto.

Na verdade ele NAO responde o tipo e sim responde se o cast para o tipo é valida e ja faz o cast em runtime.

Para perguntar o tipo (final) o typeid é muito mais rapido.




P.

unread,
Feb 6, 2014, 12:15:39 PM2/6/14
to ccppb...@googlegroups.com


Raramente em tais comparações exatamente o mesmo problema é resolvido.

Exemplo: disparar exceções é muito caro.

Demonstração: aqui está um programa C++ que dispara como exceção um objeto cujo ato de construção implica a cópia de uma string, e aqui está um programa C que retorna um código de erro do tipo int. O programa C é MUITO mais rápido!!!!!!1111

Duh.

P.

Marcelo Zimbres

unread,
Feb 6, 2014, 12:26:36 PM2/6/14
to ccppb...@googlegroups.com
O que pra mim seria preocupante é um design que usa tanto
dynamic_cast, que este chega a ser gargalo.

Marcelo

Bruno Sanches

unread,
Feb 6, 2014, 12:51:36 PM2/6/14
to ccppb...@googlegroups.com
É bem por ai Pedro.

T+

Bruno Sanches
========================
http://www.pontov.com.br


2014-02-06 P. <pedro....@gmail.com>:

--

Francisco Lopes

unread,
Feb 6, 2014, 12:59:42 PM2/6/14
to ccppb...@googlegroups.com
Só pra adicionar, 

discussões sobre RTTI na LLVM:

What can make C++ RTTI undesirable?

Is LLVM an exception to the rule for avoiding dynamic casts?

e otimizações com o novo final (quando possível usá-lo):

Walter Mascarenhas

unread,
Feb 7, 2014, 3:50:30 AM2/7/14
to ccppb...@googlegroups.com

 dynamic_cast é um caso muito interessante. 

 Os compiladores que eu conheço não otimizam 
dynamic_cast em casos como cross casts.

  Grosso modo, eles fazem buscas lineares em
situações nas quais poderiam usar buscas binárias.
Na prática, como as hierarquias são pequenas 
eles estão certos. Porém, em alguns casos eles ficam
longe do ótimo.

  Finalmente, se me lembro bem, 
dizer se uma implementação do dynamic_cast 
é ótima (melhor possível)  é um problema  
indecidível, ou seja não existe um algoritmo 
que faça isso.
 
  Com isso, não há, nem nunca haverá, um
compilador que gere código que faz 
dynamic_cast do melhor modo possível
em todos os cenários. 

Marcelo Zimbres

unread,
Feb 7, 2014, 6:13:12 AM2/7/14
to ccppb...@googlegroups.com
" Finalmente, se me lembro bem,
dizer se uma implementação do dynamic_cast
é ótima (melhor possível) é um problema
indecidível, ou seja não existe um algoritmo
que faça isso."

Fiquei curioso com essa frase, "indecidível" no contexto de lógica
matemática (teorema de Gödel)? No meu ver, se você sabe como será
usado, será possível escolher o melhor algoritmo conhecido.

Marcelo

Em 7 de fevereiro de 2014 06:50, Walter Mascarenhas
<walter.ma...@gmail.com> escreveu:

Walter Mascarenhas

unread,
Feb 7, 2014, 9:08:48 AM2/7/14
to ccppb...@googlegroups.com

 Marcelo,

    Sim, o indecidivel é no sentido que voce mencionou.

    Há uns dois anos eu pensei sobre assunto
(por causa de uma discussão aqui na lista)

    Se me lembro corretamente, na época eu 
me convenci que se algum algortimo fosse
capaz de dizer que uma implementação de
dynamic cast era melhor possivel então
esse usando esse algoritmo seria possivel
resolver o problema da parada (ou seja,
decidir se um programa para ou não,
ou halting problem em ingles)

  Como o problema da parada é indecidivel,
a otimização do dynamic_cast também é.
Depois disso também vi algo mais ou
menos assim mencionado em um artigo
do stroustrup que o Tiago Adams postou
na época da discussão (e do qual eu
não tenho mais uma cópia)

   Ou seja, nesse caso o melhor fazer como
o Strauss e pensar em casos específicos.

Vinícius dos Santos Oliveira

unread,
Feb 22, 2014, 8:45:27 PM2/22/14
to ccppb...@googlegroups.com
Em Qui, 2014-02-06 às 09:15 -0800, P. escreveu:
[...] Raramente em tais comparações exatamente o mesmo problema é resolvido.


Exemplo: disparar exceções é muito caro.

Demonstração: aqui está um programa C++ que dispara como exceção um objeto cujo ato de construção implica a cópia de uma string, e aqui está um programa C que retorna um código de erro do tipo int. O programa C é MUITO mais rápido!!!!!!1111

Duh.

Essas comparações são muito injustas mesmo. A ideia de exceções, como disse meu professor de conceitos de linguagens de programação, é que código novo, adicionado por outros programadores, continuam sendo verificados por erros. Você não precisa verificar o código de erro de cada função. Isso aqui todo mundo já sabe, mas estou escrevendo o email por outro motivo...

> exceções... nãaaao... tanto bloat
> meus gotos
https://www.imperialviolet.org/2014/02/22/applebug.html


--
Vinícius dos Santos Oliveira
https://about.me/vinipsmaker
signature.asc
Reply all
Reply to author
Forward
0 new messages