Olá pessoal da lista,

Acabei de fazer uma descoberta que vai contra a minha intuição.

Estava testando eficiência com arrays de inteiros (de (unsigned-byte 64)
para ser mais exato) e descobri que arrays não ajustáveis são 10 vezes mais
eficientes que as ajustáveis! Eu imaginava que não deveria haver diferença,
porque, por exemplo, em C, se você aloca um array dinamicamente (com
malloc), esse array é automaticamente ajustável (com realloc).

Também descobri que, felizmente, você pode declarar uma array como sendo do
tipo simple-array para poder aproveitar essa eficiência (simple-arrays são
arrays não-ajustáveis, sem fill-pointer e sem "displacement" (i.e. arrays
que são criadas sem passar o argumento :displace-to)).

A única explicação que eu consigo pensar é que, se uma array ajustável é
criada, o sbcl identifica seu tipo como sendo uma array "normal" (ao invés
de identificá-la como uma simple-array), o que faz com que ele não consiga
otimizar as chamadas para aref porque o tipo array "normal" não diferencia
arrays com "displacement" ou sem "displacement".

Alguém consegue me dar uma explicação mais coerente do que essa? Talvez uma
que explique o porquê do sbcl não considerar as arrays ajustáveis como sendo
do tipo simple-array (já que isso é permitido pela especificação)? Poder
usar arrays ajustáveis sem problemas com a eficiência iria quebrar o galho
no que eu pretendo fazer (embora não seja totalmente necessário, mas vou ter
que sair copiando uma parte da array).

Abraços,
Gustavo.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lisp-br" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/lisp-br?hl=en
-~----------~----~----~----~------~----~------~--~---

Responder a