Limpar um conjunto de elementos definidos - página 16

 
Taras Slobodyanik:

Acho que é uma boa combinação para as bandeiras:
http://osinavi.ru/asm/4.php

e para os operadores/comparações desnecessárias...

Eu verifiquei através do perfil. Número de comparações, atribuições e operações de correspondência
 
Nikolai Semko:

Volto à minha diferença incompreendida no tempo de execução de quase 100% idêntica na lógica e no número de verificações e somas de dois loops:


Já escrevi acima - tenho menos operações de comparação em meu código...

-----

De fora da escola, em algum lugar da década de 90:

1) se (condições) A,B,C forem independentes, então você tem que enfiá-las na função AND à medida que a probabilidade aumenta, e na função OR à medida que ela diminui.

e se forem dependentes, não devem ser combinados em uma única expressão (isto é, fazer se (A &&B) ).

2) Se houver laços aninhados A,B, então o anel externo deve ser mais curto

3) Se houver uma condição dentro do laço, você deve dividir o laço e levar a condição para fora dele, se possível.


 
Maxim Kuznetsov:

Já escrevi acima - tenho menos operações de comparação em meu código...

-----

de estudos fora da escola, em algum lugar na década de 90:

1) se (condições) A,B,C forem independentes, então eles devem ser colocados em AND por aumentar a probabilidade, e em OR por diminuir a probabilidade.

e, se dependentes, não podem ser combinados em uma expressão (isto é, fazer se (A &&B) ).

2) Se houver laços aninhados A,B, então o anel externo deve ser mais curto

3) Se houver uma condição dentro do laço, você deve dividir o laço e levar a condição para fora, se possível.


1) vice versa, que é exatamente o que você fez. Se a primeira condição em um complexo E operador não for executada, por que devemos verificar todas as outras condições? Portanto, primeiro verificamos a condição que provavelmente é falsa.

Embora, sim - é: classificando através do aumento da probabilidade de declarações de verdade em uma condição composta.

 
Алексей Тарабанов:

1) o contrário, o que você já fez. Peculiaridades de execução de operadores condicionais em C.

Talvez eu tenha escrito errado, mas é mais fácil explicar para todos ao mesmo tempo...

A & & & B & & C

E deve ser observado o mais rápido possível para evitar tentar todas as outras condições. O otimizador não o fará para o programador (*), já que ele não sabe em quais dados o programa será executado.

A || B || C

aqui é vice-versa :-) porque é aritmética booleana. !(((!A)&&(!B)&&(!C) ) (se você não estragar os parênteses, assine novamente)

(*) Os compiladores otimizadores podem contar com o fato de que as condições são estabelecidas exatamente assim e eles constroem sua cozinha interna com base nestas suposições

 
Maxim Kuznetsov:

Talvez esteja mal escrito, mas faz mais sentido para todos ao mesmo tempo...

A & & & B & & C

E deve ser observado o mais rápido possível para não passar por todas as outras condições. Significa que o primeiro predicado a ser colocado é aquele que falhará em executar toda a cadeia seguinte. O otimizador não o fará para o programador (*) porque ele não sabe em que dados o programa será executado

A || B || C

é o contrário :-) porque a aritmética booleana... !(((!A)&&(!B)&&(!C) ) (se novamente entre parênteses, os sinais não são confundidos)

(*) Os compiladores otimizadores podem contar com o fato de que as condições são estabelecidas exatamente assim e eles constroem sua cozinha interna com base nestas suposições

Concordo plenamente.

 
Nikolai Semko:

Volto à minha diferença incompreendida no tempo de execução de quase 100% idêntica na lógica e no número de verificações e somas de dois loops:

Então, mais uma vez, por que uma tal variante do código de Kuznetsov:

funciona mais que o dobro da velocidade daquele que faz absolutamente a mesma coisa:

Quais são as maravilhas do compilador?
Será realmente possível um projeto desse tipo?

o compilador encontra algum comando especial de busca da montadora para o processador? Mas há uma verificação adicional i<j dentro, não há?

Porque a mesma coisa é executada muito mais lentamente:

O código do roteiro de demonstração está anexado

É assim que acontece com freqüência. Você está ocupado com algumas porcarias desnecessárias e descobre algo bastante interessante.

Desenvolvedores, vocês poderiam dar uma olhada no código executável e ver o que faz essa diferença?

Você precisa entender a lógica do compilador para criar algoritmos mais otimizados no futuro.

Que situação estranha em geral. Acho que muitas coisas dependem do compilador e da máquina em que estou testando. Aqui está meu resultado de seu exemplo em uma máquina de 32 bits

1


como você pode ver, não há nenhuma vantagem em particular. E aqui está um teste das funções de eliminação da matriz da última variante.

2

 
Às vezes os resultados dos testes podem ser muito diferentes dos resultados anteriores e não está claro a que se deve isso, talvez algum sistema específico de interrupções no processamento do código MQL
 
Stanislav Dray:
Às vezes, durante os testes os resultados podem ser bem diferentes dos anteriores, e não está claro por que, talvez tenha algo a ver com algum sistema específico de interrupção no processamento do código MQL

ao testar algoritmos, deve-se tomar

* ou conjuntos de dados pré-preparados (mais ou menos semelhantes aos que são realmente necessários),

* ou fazer um número muito significativo de passes sobre o RNG,

em testes:

* alternar/desacordar a seqüência de testes e

* observar as pausas e reiniciar todos os tipos de caches



 
Maxim Kuznetsov:

ao testar algoritmos, deve-se tomar

* ou conjuntos de dados pré-preparados (mais ou menos semelhantes aos que são realmente necessários),

* ou fazer um número muito significativo de passes sobre o RNG,

em testes:

* sequência de teste alternado/suflado e

* observar pausas e despejar todos os tipos de caches



bem, como se utilizássemos dados pré-preparados. Para todas as funções, os mesmos dados são usados para o teste. Quanto ao embaralhamento/queueing, sim, notei uma diferença se você mudar a ordem dos testes. Mas como reiniciar as caches ?

 
Maxim Kuznetsov:

ao testar algoritmos, deve-se tomar

* ou conjuntos de dados pré-preparados (mais ou menos semelhantes aos que são realmente necessários),

* ou fazer um número muito significativo de passes sobre o RNG,

em testes:

* seqüências de testes alternados/sufláveis e

* observar pausas e despejar todos os tipos de caches



Não faça troça das pessoas