Ajude-me a aprender a programar. - página 3

 
Tio Nisla:
Eu queria acrescentar mais cedo que se alguémfunc() faz algumas outras manipulações além de devolver alguma quantidade ou algo, calcula parâmetros comerciais, por exemplo, tal uso causa artefatos difíceis de capturar e pode levar o autor de um código a um estupor: "Ht? Por que 4 vezes??? O_o F$#@!!! Não deveria estar lá três vezes? Por que minha EA está mentindo para mim?". Isso é o que eu chamava de "shithcod", que um especialista ficou indignado com as raízes de seus cabelos. Eu não falei nisso, pois é óbvio, mas você o fez por mim. Mas você não levou em conta que o endereçamento por um índice calculado dinamicamente sem reinicialização de matriz é algo mais. No sistema nu, isto geralmente leva ao GPF, em plenos pulsos com indicadores e matrizes inteligentes para uma exceção e seu manipulador. Em mql não está claro a que leva.

O que é "artefatos elusivos"? É uma coisa religiosa? Você inventa, você acredita?

 
Aleksandr Slavskii:

Cavalheiros, personalidades, mas vamos descobrir a verdade.

Vejo no exemplo quePositionsTotal()é chamado em cada iteração de loop.

Mas Dimitri, pelo contrário, você está dizendo que o compilador o faz de uma maneira diferente - não entendo. Explicar.

Se você quer dizer que a funçãoPositionsTotal() não recalcula as posições cada vez, mas simplesmente retorna o valor de uma variável contendo o número de posições em aberto, então sim, você está certo, não faz sentido declarar mais uma variável, mas então o que o compilador tem a ver com isso?

E se esta função recalcula as posições em aberto toda vez, então acontece que o compilador tem que entender se o valor desta função afeta outros cálculos e usa ou uma função ou uma variável.

Parece que não estou entendendo direito.

Ele recalcula cada vez ou não recalcula, mas a chamada do PositionTotal() é definitivamente cara. E isto é facilmente comprovado por uma simples experiência. Mas em vez de fazer uma experiência assassina que me esmagava em pedaços, eles inventam argumentos extravagantes com "artefatos difíceis de encontrar". Você pode encontrar esse código de exemplo na primeira página que você sabe onde e ver como ele se parece lá)))) Foi deliberadamente alterada antes de ser colada no fórum (grande aplauso). E isso foi feito apenas para evitar encargos desnecessários para um iniciante.

E o compilador, eu quis dizer que ele otimiza o código e chama a variável diretamente em vez de através de uma função:

int x;

for(;i<x;)

и

for(;i<F();)

int F(){return(x);}

Isto é bem perceptível com a função ArraySize(); não é possível distinguir entre chamar uma função e usar uma variável com ela. Mas com PositionsTotsl() este não é o caso, infelizmente.

A propósito, você também pode chegar ao fundo da declaração de variáveis dentro de um loop, o que também reduz a velocidade. O que não está chegando à raiz? Você não sabe disso? Embora também possamos discutir aqui, há uma diferença entre 4 e 5.

 

Certamente PosiçõesTotal() pede o número de posições em aberto todas as vezes? Ou talvez seja otimizado e salve o valor em uma constante com uma marca de atualização e apenas devolva sempre o mesmo número se não mudar)?

Deve haver alguma otimização interna desta função. Os desenvolvedores não são tolos em fazer uma função tão importante e potencialmente dispendiosa para "ela fará de qualquer maneira".

Aqueles que estão indignados, favor verificar quanto tempo e recursos são necessários para realizar as duas variantes do mesmo loop.

Não há necessidade de jogar cocô.


Gostaria de ver o código fonte de PositionsTotal() puramente por interesse acadêmico.


Sim, bem, se você pensar nisso, a coisa mais simples seria fazer uma variável global do terminal que armazena esse valor. E devolver somente este valor. E para atualizá-la na abertura ou fechamento das posições - para tornar a variável segura e sincronizá-la, para que Deus proíba que algo fosse escrito ali.

Acho que é assim que se faz.

Bem, talvez, os dados sobre as próprias posições sejam armazenados em algumas estruturas de dados, de modo que foi possível obtê-los sem recorrer desnecessariamente a servidores. Em geral, acho que tudo é normal com produtividade em qualquer variante de chamada para/.


E o estilo de código é esteticamente bonito ou não, cada um decide por si mesmo)

 
Nikolay Mitrofanov:

Quem estiver indignado, favor verificar quanto tempo e recursos são necessários para executar ambas as variantes do mesmo ciclo.

Não há necessidade de jogar cocô.

Espero que não tenha sido dirigido a mim, pois não duvido da autoridade de Dmitriy.Tio Nislatambém parece estar codificando há muito tempo, mas


Estou aprendendo, é por isso que pergunto.

 

PosiçõesTotal() é complicado, deve sempre retornar o número correto e alterar seu valor assim que o número de posições mudar. Portanto, é pouco provável que seja tão rápido quanto uma simples variável ou ArraySize().

 
Aleksandr Slavskii:

...


Estou aprendendo, é por isso que estou perguntando.

Se você está aprendendo, não se deixe atolar por estas pequenas coisas. Concentre-se na capacidade de traduzir sua idéia em código (ou algum processo mal definido em uma seqüência de ações). E então o código pode ser ajustado como você quiser.

 
Dmitry Fedoseev:

Se você está aprendendo, não se preocupe com estes detalhes de forma alguma. Concentre-se em ser capaz de traduzir sua idéia em código (ou algum processo mal definido em uma seqüência de ações). E então o código pode ser ajustado como você quiser.

Acho bom que uma pessoa tente entender isso e se aprofunde.

Ao não prestar atenção a pequenas coisas, o codificador passa a ter o hábito de escrever o código como lhe parece adequado. E então pentear o código significa trabalho duplo e muitas vezes não apenas para o autor, mas para aqueles que ainda têm sorte de trabalhar com o código.

Por que se preocupar em escrever o código quando você pode fazê-lo corretamente e escrevê-lo bem e entender os detalhes?)

Seu conselho é... bem... IMHO


Seu conselho é bom para um programador experiente (fortemente autoconfiante) que pode então limpar, porque ele ou ela sabe onde e o que deve ser limpo.

 
Nikolay Mitrofanov:

Para mim, acho bom que uma pessoa tente entender e cavar mais fundo...

Ao não prestar atenção às pequenas coisas, o codificador passa a ter o hábito de escrever código de forma errada. E então pentear o código significa trabalho duplo e muitas vezes não apenas para o autor, mas para aqueles que ainda têm sorte de trabalhar com o código.

Por que se preocupar em escrever o código quando você pode fazê-lo corretamente e escrevê-lo bem e entender os detalhes?)

Seu conselho é... bem... IMHO


Seu conselho é bom para um programador experiente (fortemente autoconfiante) que pode então passar a pente fino, porque ele sabe onde e o que deve ser passado a pente fino.

Para iniciantes ainda mais - é melhor pelo menos de alguma forma, mas para resolver um problema, em vez de ficar preso a um nível de brigas no fórum como "como você pode escrever aqui sem const, e aqui sem estática, etc., etc., ou - oh cara, se você fizer esta pergunta, então é melhor não chegar perto da programação de forma alguma".

Não se passa uma semana sem que alguém não me envie um indicador para corrigir algum código como este: for(int i=0;i<Bars;i++). E você está esfregando problemas aqui, o que pode lhe dar velocidade... bem, 30%.

Mesmo EAs eficientes (no sentido da velocidade dos testes) são problemas de seu algoritmo, que sempre renasce para cada estratégia específica, ao invés de um problema de complexidades de sintaxe.

 
Dmitry Fedoseev:

Para os iniciantes ainda mais - é melhor resolver o problema pelo menos de alguma forma, em vez de ficar preso a um nível de brigas no fórum como "como você pode escrever aqui sem const, e aqui sem estática, etc., etc., ou - oh cara, se você faz esta pergunta, então é melhor não se aproximar de forma alguma da programação".

Não se passa uma semana sem que alguém não me envie um indicador para corrigir algum código como este: for(int i=0;i<Bars;i++). E você está esfregando problemas aqui, o que pode lhe dar velocidade... bem, 30%.

Se um programador novato perguntar algo no fórum, isso significa que ele quer saber a resposta, significa que ele está interessado e precisa dela. Até mesmo criou um fio para obter conselhos.

Se eu acertei o sentido do assunto, a questão da implementação de sua idéia não foi "apenas fazer certo, mas fazer funcionar", mas o melhor e o mais correto possível. Isso é bom. Isto é correto.

"De alguma forma" para qualquer atividade é uma abordagem terrível.

Primeiro para descobri-lo, depois para fazê-lo com conhecimento - a melhor abordagem.

 
Nikolay Mitrofanov:

Se um programador novato perguntar algo no fórum, isso significa que ele quer saber a resposta, significa que ele está interessado e precisa dela. Ele até criou o fio para obter conselhos.

Se entendi corretamente o autor do fio, então a questão da implementação de sua idéia não é mais "faça o que quiser só para que ela funcione", mas imediatamente o melhor possível e o mais corretamente possível. Isso é bom. Isto é correto.

"De alguma forma" para qualquer atividade é uma abordagem terrível.

Primeiro para entender, depois para fazer com conhecimento é o melhor.

Com conhecimento de quê? Se este algoritmo não existe na natureza, mas tem que ser inventado por si só, e é o algoritmo que define tudo.