Como é que passo por uma enumeração de forma consistente? - página 3

 
Alexey Navoykov:

Os exemplos aqui mostrados (caso 1: valor de retorno1; caso 2: valor de retorno2; caso 3: valor de retorno3... Uma pessoa adequada colocaria todos os valores numa matriz e obteria apenas o valor requerido pelo seu índice. E para a tarefa inversa, utilizaria a pesquisa binária.

Sou duas mãos a favor de um bom código com arrays. Mas ao escrever um NormalizeDouble mais rápido do que o normal, encontrei um efeito optimizador - a boa solução via const-array era muito mais lenta do que a incómoda solução de caixa de comutação. Deixei a segunda variante porque o NormalizeDouble é muito utilizado no testador. Coloquei-o no indicador e não olho para este monstro. Mas os testes de fundo são mais rápidos.
 
fxsaber:
Sou duas mãos a favor de bom código com arrays. Mas ao escrever um NormalizeDouble mais rápido do que o normal, encontrei um efeito optimizador - uma boa solução via const-array era muito mais lenta do que uma complicada via switch-case. Deixei a segunda variante porque o NormalizeDouble é muito utilizado no testador. Coloquei-o no indicador e não olho para este monstro. Mas os testes de fundo são mais rápidos.

Lembro-me de uma vez ter havido um fio de discussão, em que os criadores só falavam da implementação como uma pesquisa binária, o que, claro, é muito mais lento do que o simples acesso por índice calculado.Mas agora parecem tê-lo feito mais sabiamente: se um passo é constante, o índice é calculado, caso contrário é feita uma pesquisa binária. É claro que a implementação nativa é sempre mais rápida do que o embrulho.

Naturalmente, isto depende das suas prioridades. Mas imho, se a velocidade é tão crucial que se está pronto para inventar muletas, então também se deve desistir de OOP e MQL ;) Embora eu tenha a certeza que com uma codificação adequada esta diferença de velocidade não será tão significativa. E usa-o de forma mais racional em código real, não é verdade?

 
Alexey Navoykov:

Lembro-me de uma vez ter havido um fio de discussão, em que os programadores só falavam da implementação como uma pesquisa binária, o que, claro, é muito mais lento do que o simples acesso por índice calculado.Mas agora parecem tê-lo feito mais sabiamente: se o passo é constante, então o índice é calculado, caso contrário a pesquisa binária. É claro que a implementação nativa é sempre mais rápida do que o embrulho.

O compilador, se não for burro, teria de transformar a const-array e a única referência do tipo pelo índice em código de comutação.

É claro que poderá ter de depender das suas prioridades. Mas imho, se a velocidade é tão crucial que se está pronto para inventar muletas, então deve desistir de OOP e MQL em geral ;) Embora esteja certo de que com a codificação correcta a diferença de velocidade não será tão substancial. Ao testar medições está simplesmente a correr uma função através de um loop milhões de vezes. E em código real, usa-o mais racionalmente, não é verdade?

A velocidade não é crucial, mas quando estou a escrever irracionalmente, sinto desconforto. Não utilizar o OOP de modo algum não é racional, claro. De qualquer modo, veja os modestos esforços em kodobase que tem feito e não tem contado durante muitos dias. Aí compreenderá onde apareceram as muletas sob a forma do mesmo NormalizeDouble. É o resultado de um facto aleatório de implementações por vezes irracionais de programadores.
 
fxsaber:
O compilador, se não for burro, deveria ter transformado a const-array e a única referência de tipo a ela por índice em código de comutação.

Então a matriz é apenas uma constante? E a estática? E porquê "mudar o código"? É uma operação simples: comparar o valor do índice com o tamanho do array/enum, e se for menos, obter o endereço do elemento requerido como endereço do array + índice, e depois ler o valor a partir daí. Pensei que tal disparate devia ser compilado igualmente.

De qualquer modo, vejam os modestos esforços em kodobase, que já expus e não conto há muitos dias. Aí compreenderá onde apareceram as muletas sob a forma desse mesmo NormalizeDouble. É o resultado de um facto acidental de implementações por vezes irracionais dos criadores.
E a propósito, há quanto tempo é que efectuou estas comparações? Talvez o compilador ainda fosse "burro" na altura?
 
Alexey Navoykov:

Então a matriz é apenas uma constante? E a estática? E porquê "mudar o código"? É uma operação simples: comparar o valor do índice com o tamanho do array/enum, e se for menos, obter o endereço do elemento requerido como endereço do array + índice, e depois ler o valor a partir daí. Pensei que tais disparates deviam ser compilados da mesma forma.

Não me lembro ao certo se podem criar arrays estáticos usando métodos constantes - certamente que não o podem fazer. Por uma questão de princípio, eu estava a fazer consortes e não estática. Contando com a inteligência do compilador. Após a compilação, não deveria ter havido qualquer indício de uma matriz nas tripas. Um statik é uma estrutura muito mais complicada do que constante. É por isso que eu tinha a certeza de que o compilador não iria conseguir lidar com o statik. Mas eu teria de tentar.

Não estou bem claro a que "esforços" se refere. E a propósito, há quanto tempo é que efectuou estas comparações? Talvez o compilador ainda fosse "burro" nessa altura?
O esforço será visível assim que um dos moderadores carregar em alguns botões e der luz verde para publicar o código em kodobase. Fiz uma solução conveniente para mim, não pensando no desempenho, e obtive um ganho de quase uma ordem de grandeza na construção 1383 32-bit.
 
fxsaber:

Não me lembro exactamente se as arrays estáticas podem ser feitas const. métodos - definitivamente não. Por uma questão de princípio, eu estava a fazer consortes, não estática. Contando com a inteligência do compilador. Após a compilação, não deveria ter havido qualquer indício de uma matriz nas tripas. Um statik é uma estrutura muito mais complicada do que constante. É por isso que eu tinha a certeza de que o compilador não iria conseguir lidar com o statik. Mas eu teria de tentar.

Oh, bem, isso explica tudo. Não deve confiar na inteligência excessiva do compilador, que optimiza ainda mais uma solução mal concebida para si. Se você mesmo é demasiado preguiçoso para o fazer correctamente, dizendo que "a estática é muito mais complicada" (embora o que lá é complicado, não compreendo), então porquê acusar o compilador?

 
Alexey Navoykov:

Oh, bem, isso explica tudo. Não deve confiar na inteligência excessiva do compilador, uma vez que optimizará uma solução mal concebida para si. Se você mesmo foi demasiado preguiçoso / não pensou em fazê-lo correctamente, dizendo "a estática é muito mais complicada" (embora o que lá é complicado, não compreendo), então porquê acusar o compilador?

Acrescentei estática ao conjunto. Funcionou quase três vezes mais rápido do que trocar! Atire esse interruptor fora. Obrigado pela dica!
 
fxsaber:
Acrescentei estática ao conjunto. Funcionou quase três vezes mais rápido do que trocar! Destrua este interruptor. Obrigado pela dica!

De nada. Vai ensinar-me uma lição para o futuro, que eu deveria pensar 7 vezes, antes de andar por aí a inventar muletas).

Acontece agora, que elogiei a mudança, ou melhor, os seus criadores demasiado cedo. Assim, tudo é aí implementado apenas através de pesquisa binária, mesmo quando a enumeração vai com múltiplos. Não é bom.

 
Alexey Navoykov:

De nada. Será uma lição para o futuro, pensar 7 vezes antes de correr e inventar muletas).

Quase quatro vezes mais rápido que o normal NormalizeDouble (construir 1395)... é uma muleta dos criadores.

 
fxsaber:
Quase quatro vezes mais rápido que o normal NormalizeDouble (construir 1395)... é uma muleta dos criadores.

Toda a gente não está sem pecado )