O problema está todo no segundo ciclo. Lida simultaneamente com ramos esquerdos e direitos a partir de potenciais extremos e, portanto, só passa por (N - 1)/2 barras, mas isso não é suficiente. As medições mostram que o tempo gasto na procura de um extremo numa progressão aritmética depende do período N, que é muito, muito mau:
Falta pelo menos uma pausa:
//Перебираем все барыfor (int bar = 0; bar < MyQuotes.Count; bar++)
{
//Подготовка данных
...
int pperiod = (N - 1)/2;
//Перебираем бары относительно потенциального экстремумаfor (int i = 1; i <= pperiod; i++)
{
if (MyQuotes.High[bar - i] > MyQuotes.High[bar] ||
MyQuotes.High[bar + i] > MyQuotes.High[bar])
up = false;
if (MyQuotes.Low[bar - i] < MyQuotes.Low[bar] ||
MyQuotes.Low[bar + i] < MyQuotes.Low[bar])
down = false;
if ( !up && !down ) break; // А зачем искать дальше?
}
}
Melhor ainda, dividir realmente o topo e a base, e parar imediatamente após um controlo mal sucedido.
Sim, vai. Isto porque a tarefa não requer execução sequencial. Todo o histórico do bar pode ser dividido em segmentos k, cada um dos quais será processado por um núcleo de CPU diferente. Não conheço a mecânica da OCL, mas penso que o princípio é o mesmo aqui. O zig-zag em si é outra questão - é sequencial, cada nova linha começa a partir do fim da anterior, pelo que dividi-la em subtarefas é extremamente difícil ou mesmo impossível.
Melhor ainda, separar realmente topo e fundo, e parar imediatamente após um controlo mal sucedido.
Mais uma vez, a separação entre o topo e a base resulta em dois passes para. O que duplica o tempo de pesquisa. A separação por si só não proporciona qualquer ganho de desempenho sem a utilização de multithreading, especialmente para pequenos n.
Portanto, boa sorte. Discutir a optimização de um algoritmo com complexidade que depende linearmente do valor de um parâmetro é provavelmente algo que não tem nada a fazer.
Seja como for, boa sorte. Discutir a optimização de um algoritmo com complexidade linearmente dependente do valor de um parâmetro - não tem realmente nada a fazer.
OK, vou terminar de completar o algoritmo e afixar os resultados do paralelismo no estúdio.
hrenfx:
Ainda assim, OCL (ou paralelismo no sentido geral) não é uma optimização algorítmica - é mais uma optimização técnica.
Duvido que haja necessidade de paralelizar a solução O(N)-variante mais rápida no seu caso.
Como posso dizer? Qualquer paralelização é sempre uma complicação grave dos algoritmos. Além disso, se não paralelizar um algoritmo com uma dependência linear da quantidade de dados, o que mais se pode paralelizar?
Em suma, vou reescrever o algoritmo e ver o que ele traz.
C-4: Mais uma vez, a separação das partes superiores e inferiores resulta em dois passes para. Isto duplica o tempo de pesquisa. A separação por si só não proporciona ganho de desempenho sem a utilização de multithreading, especialmente para pequenos n.
O problema está todo no segundo ciclo. Lida simultaneamente com ramos esquerdos e direitos a partir de potenciais extremos e, portanto, só passa por (N - 1)/2 barras, mas isso não é suficiente. As medições mostram que o tempo gasto na procura de um extremo numa progressão aritmética depende do período N, que é muito, muito mau:
Falta pelo menos uma pausa:
Melhor ainda, dividir realmente o topo e a base, e parar imediatamente após um controlo mal sucedido.
Se tudo o resto falhar, tente OCL.
Não fará uma grande diferença.
Falta pelo menos uma pausa:
Melhor ainda, separar realmente topo e fundo, e parar imediatamente após um controlo mal sucedido.
Ainda assim, OCL (ou paralelismo no sentido geral) não é uma optimização algorítmica, mas sim uma optimização técnica.
Duvido que no seu caso haja necessidade de paralelizar a solução O(N)-variante mais rápida para o problema.
Ele irá.
Sem yada yada? Mostre-me.
Portanto, boa sorte. Discutir a optimização de um algoritmo com complexidade que depende linearmente do valor de um parâmetro é provavelmente algo que não tem nada a fazer.
Sem yada yada? Mostre-me.
Seja como for, boa sorte. Discutir a optimização de um algoritmo com complexidade linearmente dependente do valor de um parâmetro - não tem realmente nada a fazer.
OK, vou terminar de completar o algoritmo e afixar os resultados do paralelismo no estúdio.
Ainda assim, OCL (ou paralelismo no sentido geral) não é uma optimização algorítmica - é mais uma optimização técnica.
Duvido que haja necessidade de paralelizar a solução O(N)-variante mais rápida no seu caso.
Como posso dizer? Qualquer paralelização é sempre uma complicação grave dos algoritmos. Além disso, se não paralelizar um algoritmo com uma dependência linear da quantidade de dados, o que mais se pode paralelizar?
Em suma, vou reescrever o algoritmo e ver o que ele traz.
Mais uma vez, a separação das partes superiores e inferiores resulta em dois passes para. Isto duplica o tempo de pesquisa. A separação por si só não proporciona ganho de desempenho sem a utilização de multithreading, especialmente para pequenos n.
Como pode ter tanta certeza?
O meu cheque mostra o contrário:
01:29:25 SpeedTest EURUSD,M15 entradas: Interações=10000; pperiod=10;
01:29:25 SpeedTest EURUSD,M15: Número de barras = 3780
01:30:46 SpeedTest EURUSD,M15: Função original: 81.558 seg, extrema: 131 / 121
01:31:10 SpeedTest EURUSD,M15: Com a minha edição (pausa): 23.291 seg, extrema: 131 / 121
01:31:27 SpeedTest EURUSD,M15: Com o meu intervalo (pausa): 17.565 seg, extrema: 131 / 121
Em anexo está um guião mq4.
Mais um teste para completar o quadro:
01:38:56 SpeedTest EURUSD,M1 entradas: Interações=1000; pperiod=100;
01:38:56 SpeedTest EURUSD,M1: Número de barras = 33896
01:50:19 SpeedTest EURUSD,M1: Função original: 683.565 seg, extrema: 121 / 127
01:50:54 SpeedTest EURUSD,M1: Com a minha edição (pausa): 34.383 seg, extrema: 121 / 127
01:51:16 SpeedTest EURUSD,M1: Com o meu intervalo (pausa): 22.714 seg, extrema: 121 / 127